diff --git a/src/components/nav/nav.ts b/src/components/nav/nav.ts index 6a7ce589ae..63249fcca6 100644 --- a/src/components/nav/nav.ts +++ b/src/components/nav/nav.ts @@ -111,15 +111,15 @@ export class Nav extends NavControllerBase implements AfterViewInit, RootNode { this._hasInit = true; let navSegment = this._linker.initNav(this); - if (navSegment && navSegment.component) { + if (navSegment && (navSegment.component || navSegment.loadChildren)) { // there is a segment match in the linker - this._linker.initViews(navSegment).then(views => { + return this._linker.initViews(navSegment).then(views => { this.setPages(views, null, null); }); } else if (this._root) { // no segment match, so use the root property - this.push(this._root, this.rootParams, { + return this.push(this._root, this.rootParams, { isNavRoot: (this._app.getRootNav() === this) }, null); } diff --git a/src/components/nav/test/nav.spec.ts b/src/components/nav/test/nav.spec.ts new file mode 100644 index 0000000000..de2c9ce51e --- /dev/null +++ b/src/components/nav/test/nav.spec.ts @@ -0,0 +1,112 @@ +import { Nav } from '../nav'; + +import { GestureController } from '../../../gestures/gesture-controller'; +import { Keyboard } from '../../../platform/keyboard'; +import { + mockApp, + mockConfig, + mockDeepLinker, + mockDomController, + mockElementRef, + mockPlatform, + mockRenderer, + mockTrasitionController, + mockZone, +} from '../../../util/mock-providers'; + +describe('Nav', () => { + describe('ngAfterViewInit', () => { + it('should call initViews when segment has a component', (done: Function) => { + const nav = getNav(); + const knownComponent = {}; + const knownSegment = { + component: knownComponent + }; + const knownViews = {}; + spyOn(nav._linker, 'initNav').and.returnValue(knownSegment); + spyOn(nav._linker, 'initViews').and.returnValue(Promise.resolve(knownViews)); + spyOn(nav, 'setPages'); + + const promise = nav.ngAfterViewInit(); + + promise.then(() => { + expect(nav._linker.initViews).toHaveBeenCalledWith(knownSegment); + expect(nav.setPages).toHaveBeenCalledWith(knownViews, null, null); + done(); + }).catch((err: Error) => { + done(err); + }); + }); + + it('should call initViews when segment has a loadChildren string', (done: Function) => { + const nav = getNav(); + const knownLoadChildren = 'someString'; + const knownSegment = { + loadChildren: knownLoadChildren + }; + const knownViews = {}; + spyOn(nav._linker, 'initNav').and.returnValue(knownSegment); + spyOn(nav._linker, 'initViews').and.returnValue(Promise.resolve(knownViews)); + spyOn(nav, 'setPages'); + + const promise = nav.ngAfterViewInit(); + + promise.then(() => { + expect(nav._linker.initViews).toHaveBeenCalledWith(knownSegment); + expect(nav.setPages).toHaveBeenCalledWith(knownViews, null, null); + done(); + }).catch((err: Error) => { + done(err); + }); + }); + + it('should call push when root is set', (done: Function) => { + const nav = getNav(); + const knownComponent = {}; + nav.root = knownComponent; + + spyOn(nav, 'push').and.returnValue(Promise.resolve()); + + const promise = nav.ngAfterViewInit(); + + promise.then(() => { + expect(nav.push).toHaveBeenCalled(); + done(); + }).catch((err: Error) => { + done(err); + }); + }); + }); +}); + +function getNav() { + const platform = mockPlatform(); + const config = mockConfig(null, '/', platform); + const app = mockApp(config, platform); + const zone = mockZone(); + const dom = mockDomController(platform); + const keyboard = new Keyboard(config, platform, zone, dom); + const elementRef = mockElementRef(); + const renderer = mockRenderer(); + const componentFactoryResolver: any = null; + const gestureCtrl = new GestureController(app); + const linker = mockDeepLinker(null, app); + const trnsCtrl = mockTrasitionController(config); + const nav = new Nav( + null, + null, + app, + config, + platform, + keyboard, + elementRef, + zone, + renderer, + componentFactoryResolver, + gestureCtrl, + trnsCtrl, + linker, + dom + ); + return nav; +} diff --git a/src/navigation/deep-linker.ts b/src/navigation/deep-linker.ts index 9b6f19f0c0..eb411bfbef 100644 --- a/src/navigation/deep-linker.ts +++ b/src/navigation/deep-linker.ts @@ -2,7 +2,7 @@ import { ComponentFactory, ComponentFactoryResolver } from '@angular/core'; import { Location } from '@angular/common'; import { App } from '../components/app/app'; -import { convertToViews, isNav, isTab, isTabs, NavLink, NavSegment, DIRECTION_BACK } from './nav-util'; +import { convertToViews, DIRECTION_BACK, isNav, isTab, isTabs, NavLink, NavSegment } from './nav-util'; import { ModuleLoader } from '../util/module-loader'; import { isArray, isPresent } from '../util/util'; import { Nav } from '../components/nav/nav'; @@ -594,17 +594,21 @@ export class DeepLinker { * @internal */ initViews(segment: NavSegment) { - const view = new ViewController(segment.component, segment.data); - view.id = segment.id; + const link = this._serializer.getLinkFromName(segment.name); + return this.getNavLinkComponent(link).then((component: any) => { + segment.component = component; + const view = new ViewController(component, segment.data); + view.id = segment.id; - if (isArray(segment.defaultHistory)) { - return convertToViews(this, segment.defaultHistory).then(views => { - views.push(view); - return views; - }); - } + if (isArray(segment.defaultHistory)) { + return convertToViews(this, segment.defaultHistory).then(views => { + views.push(view); + return views; + }); + } - return Promise.resolve([view]); + return [view]; + }); } /** diff --git a/src/navigation/test/deep-linker.spec.ts b/src/navigation/test/deep-linker.spec.ts index f0f5cb94d9..17103bcf05 100644 --- a/src/navigation/test/deep-linker.spec.ts +++ b/src/navigation/test/deep-linker.spec.ts @@ -271,14 +271,22 @@ describe('DeepLinker', () => { describe('initViews', () => { - it('should create the ViewController for just the segment', () => { - // let segment = serializer.parse('/viewone')[0]; + it('should return an array with one view controller when there isnt default history', (done: Function) => { + const knownSegment = { + id: 'idk', + name: 'viewone', + data: {} + }; + const promise = linker.initViews(knownSegment); - // let views = linker.initViews(segment); - // expect(views[0].component).toEqual(segment.component); - // expect(views[0].id).toEqual('VIEWID'); + promise.then((result: any[]) => { + expect(Array.isArray(result)).toBeTruthy(); + expect(result.length).toEqual(1); + done(); + }).catch((err: Error) => { + done(err); + }); }); - }); describe('initNav', () => {