| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | import 'rxjs/add/operator/map'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | import {Location} from '@angular/common'; | 
					
						
							|  |  |  | import {SpyLocation} from '@angular/common/testing'; | 
					
						
							|  |  |  | import {ComponentFixture, TestComponentBuilder} from '@angular/compiler/testing'; | 
					
						
							|  |  |  | import {Component, Injector} from '@angular/core'; | 
					
						
							|  |  |  | import {ComponentResolver} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2016-06-23 16:42:25 -07:00
										 |  |  | import {beforeEach, beforeEachProviders, ddescribe, describe, fakeAsync, iit, inject, it, tick, xdescribe, xit} from '@angular/core/testing'; | 
					
						
							|  |  |  | import {expect} from '@angular/platform-browser/testing/matchers'; | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | import {Observable} from 'rxjs/Observable'; | 
					
						
							|  |  |  | import {of } from 'rxjs/observable/of'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 10:35:42 -07:00
										 |  |  | import {ActivatedRoute, ActivatedRouteSnapshot, CanActivate, CanDeactivate, DefaultUrlSerializer, Event, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Params, ROUTER_DIRECTIVES, Router, RouterConfig, RouterOutletMap, RouterStateSnapshot, RoutesRecognized, UrlSerializer} from '../index'; | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe('Integration', () => { | 
					
						
							| 
									
										
										
										
											2016-06-02 18:34:04 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   beforeEachProviders(() => { | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |     let config: RouterConfig = | 
					
						
							|  |  |  |         [{path: '', component: BlankCmp}, {path: 'simple', component: SimpleCmp}]; | 
					
						
							| 
									
										
										
										
											2016-06-02 18:34:04 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return [ | 
					
						
							|  |  |  |       RouterOutletMap, | 
					
						
							|  |  |  |       {provide: UrlSerializer, useClass: DefaultUrlSerializer}, | 
					
						
							|  |  |  |       {provide: Location, useClass: SpyLocation}, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         provide: Router, | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |         useFactory: (resolver: ComponentResolver, urlSerializer: UrlSerializer, | 
					
						
							|  |  |  |                      outletMap: RouterOutletMap, location: Location, injector: Injector) => { | 
					
						
							|  |  |  |           const r = | 
					
						
							|  |  |  |               new Router(RootCmp, resolver, urlSerializer, outletMap, location, injector, config); | 
					
						
							| 
									
										
										
										
											2016-06-06 15:44:12 -07:00
										 |  |  |           r.initialNavigation(); | 
					
						
							|  |  |  |           return r; | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-06-02 18:34:04 -05:00
										 |  |  |         deps: [ComponentResolver, UrlSerializer, RouterOutletMap, Location, Injector] | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |       {provide: ActivatedRoute, useFactory: (r: Router) => r.routerState.root, deps: [Router]}, | 
					
						
							| 
									
										
										
										
											2016-06-02 18:34:04 -05:00
										 |  |  |     ]; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should navigate with a provided config', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync(inject( | 
					
						
							|  |  |  |          [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |          (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-02 18:34:04 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/simple'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(location.path()).toEqual('/simple'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  |   it('should update location when navigating', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync(inject( | 
					
						
							|  |  |  |          [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |          (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.resetConfig([{path: 'team/:id', component: TeamCmp}]); | 
					
						
							| 
									
										
										
										
											2016-06-02 18:34:04 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/team/22'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/team/22'); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/team/33'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(location.path()).toEqual('/team/33'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 18:57:03 +03:00
										 |  |  |   it('should navigate back and forward', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync(inject( | 
					
						
							|  |  |  |          [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |          (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.resetConfig([{ | 
					
						
							|  |  |  |              path: 'team/:id', | 
					
						
							|  |  |  |              component: TeamCmp, | 
					
						
							|  |  |  |              children: [ | 
					
						
							|  |  |  |                {path: 'simple', component: SimpleCmp}, {path: 'user/:name', component: UserCmp} | 
					
						
							|  |  |  |              ] | 
					
						
							|  |  |  |            }]); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/team/33/simple'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/team/33/simple'); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/team/22/user/victor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            location.back(); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/team/33/simple'); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            location.forward(); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/team/22/user/victor'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should navigate when locations changes', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync(inject( | 
					
						
							|  |  |  |          [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |          (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.resetConfig([{ | 
					
						
							|  |  |  |              path: 'team/:id', | 
					
						
							|  |  |  |              component: TeamCmp, | 
					
						
							|  |  |  |              children: [{path: 'user/:name', component: UserCmp}] | 
					
						
							|  |  |  |            }]); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/team/22/user/victor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            (<any>location).simulateHashChange('/team/22/user/fedor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('team 22 { user fedor, right:  }'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 16:22:36 -07:00
										 |  |  |   it('should update the location when the matched route does not change', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync(inject( | 
					
						
							|  |  |  |          [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |          (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 16:22:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.resetConfig([{path: '**', component: SimpleCmp}]); | 
					
						
							| 
									
										
										
										
											2016-06-14 16:22:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/one/two'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/one/two'); | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('simple'); | 
					
						
							| 
									
										
										
										
											2016-06-14 16:22:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/three/four'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/three/four'); | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('simple'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-14 16:22:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  |   it('should support secondary routes', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync( | 
					
						
							|  |  |  |          inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.resetConfig([{ | 
					
						
							|  |  |  |              path: 'team/:id', | 
					
						
							|  |  |  |              component: TeamCmp, | 
					
						
							|  |  |  |              children: [ | 
					
						
							|  |  |  |                {path: 'user/:name', component: UserCmp}, | 
					
						
							|  |  |  |                {path: 'simple', component: SimpleCmp, outlet: 'right'} | 
					
						
							|  |  |  |              ] | 
					
						
							|  |  |  |            }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.navigateByUrl('/team/22/(user/victor//right:simple)'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement) | 
					
						
							|  |  |  |                .toHaveText('team 22 { user victor, right: simple }'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should deactivate outlets', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync( | 
					
						
							|  |  |  |          inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.resetConfig([{ | 
					
						
							|  |  |  |              path: 'team/:id', | 
					
						
							|  |  |  |              component: TeamCmp, | 
					
						
							|  |  |  |              children: [ | 
					
						
							|  |  |  |                {path: 'user/:name', component: UserCmp}, | 
					
						
							|  |  |  |                {path: 'simple', component: SimpleCmp, outlet: 'right'} | 
					
						
							|  |  |  |              ] | 
					
						
							|  |  |  |            }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.navigateByUrl('/team/22/(user/victor//right:simple)'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.navigateByUrl('/team/22/user/victor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement) | 
					
						
							|  |  |  |                .toHaveText('team 22 { user victor, right:  }'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should deactivate nested outlets', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync( | 
					
						
							|  |  |  |          inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.resetConfig([ | 
					
						
							|  |  |  |              { | 
					
						
							|  |  |  |                path: 'team/:id', | 
					
						
							|  |  |  |                component: TeamCmp, | 
					
						
							|  |  |  |                children: [ | 
					
						
							|  |  |  |                  {path: 'user/:name', component: UserCmp}, | 
					
						
							|  |  |  |                  {path: 'simple', component: SimpleCmp, outlet: 'right'} | 
					
						
							|  |  |  |                ] | 
					
						
							|  |  |  |              }, | 
					
						
							|  |  |  |              {path: '', component: BlankCmp} | 
					
						
							|  |  |  |            ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.navigateByUrl('/team/22/(user/victor//right:simple)'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.navigateByUrl('/'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement).toHaveText(''); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-05-24 14:33:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  |   it('should set query params and fragment', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync( | 
					
						
							|  |  |  |          inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.resetConfig([{path: 'query', component: QueryParamsAndFragmentCmp}]); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/query?name=1#fragment1'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('query: 1 fragment: fragment1'); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/query?name=2#fragment2'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('query: 2 fragment: fragment2'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should push params only when they change', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync( | 
					
						
							|  |  |  |          inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.resetConfig([{ | 
					
						
							|  |  |  |              path: 'team/:id', | 
					
						
							|  |  |  |              component: TeamCmp, | 
					
						
							|  |  |  |              children: [{path: 'user/:name', component: UserCmp}] | 
					
						
							|  |  |  |            }]); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/team/22/user/victor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            const team = fixture.debugElement.children[1].componentInstance; | 
					
						
							|  |  |  |            const user = fixture.debugElement.children[1].children[1].componentInstance; | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(team.recordedParams).toEqual([{id: '22'}]); | 
					
						
							|  |  |  |            expect(user.recordedParams).toEqual([{name: 'victor'}]); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/team/22/user/fedor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(team.recordedParams).toEqual([{id: '22'}]); | 
					
						
							|  |  |  |            expect(user.recordedParams).toEqual([{name: 'victor'}, {name: 'fedor'}]); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-02 11:30:38 -07:00
										 |  |  |   it('should work when navigating to /', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync( | 
					
						
							|  |  |  |          inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-02 11:30:38 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.resetConfig([ | 
					
						
							|  |  |  |              {path: '', terminal: true, component: SimpleCmp}, | 
					
						
							|  |  |  |              {path: 'user/:name', component: UserCmp} | 
					
						
							|  |  |  |            ]); | 
					
						
							| 
									
										
										
										
											2016-06-02 11:30:38 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/user/victor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('user victor'); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:07:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:25:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('simple'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:07:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   it('should cancel in-flight navigations', | 
					
						
							|  |  |  |      fakeAsync( | 
					
						
							|  |  |  |          inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:07:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.resetConfig([{path: 'user/:name', component: UserCmp}]); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:07:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            const recordedEvents: any = []; | 
					
						
							|  |  |  |            router.events.forEach(e => recordedEvents.push(e)); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:07:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/user/init'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:25:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            const user = fixture.debugElement.children[1].componentInstance; | 
					
						
							| 
									
										
										
										
											2016-06-03 14:25:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            let r1: any, r2: any; | 
					
						
							|  |  |  |            router.navigateByUrl('/user/victor').then(_ => r1 = _); | 
					
						
							|  |  |  |            router.navigateByUrl('/user/fedor').then(_ => r2 = _); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:25:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(r1).toEqual(false);  // returns false because it was canceled
 | 
					
						
							|  |  |  |            expect(r2).toEqual(true);   // returns true because it was successful
 | 
					
						
							| 
									
										
										
										
											2016-06-03 14:07:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('user fedor'); | 
					
						
							|  |  |  |            expect(user.recordedParams).toEqual([{name: 'init'}, {name: 'fedor'}]); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expectEvents(recordedEvents, [ | 
					
						
							|  |  |  |              [NavigationStart, '/user/init'], [RoutesRecognized, '/user/init'], | 
					
						
							|  |  |  |              [NavigationEnd, '/user/init'], | 
					
						
							| 
									
										
										
										
											2016-06-03 14:07:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |              [NavigationStart, '/user/victor'], [NavigationStart, '/user/fedor'], | 
					
						
							| 
									
										
										
										
											2016-06-03 14:25:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |              [NavigationCancel, '/user/victor'], [RoutesRecognized, '/user/fedor'], | 
					
						
							|  |  |  |              [NavigationEnd, '/user/fedor'] | 
					
						
							|  |  |  |            ]); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:07:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   it('should handle failed navigations gracefully', | 
					
						
							|  |  |  |      fakeAsync( | 
					
						
							|  |  |  |          inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:07:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.resetConfig([{path: 'user/:name', component: UserCmp}]); | 
					
						
							| 
									
										
										
										
											2016-06-09 14:31:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            const recordedEvents: any = []; | 
					
						
							|  |  |  |            router.events.forEach(e => recordedEvents.push(e)); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:25:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            let e: any; | 
					
						
							|  |  |  |            router.navigateByUrl('/invalid').catch(_ => e = _); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(e.message).toContain('Cannot match any routes'); | 
					
						
							| 
									
										
										
										
											2016-06-10 18:57:03 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            router.navigateByUrl('/user/fedor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-10 18:57:03 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('user fedor'); | 
					
						
							| 
									
										
										
										
											2016-06-10 18:57:03 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            expectEvents(recordedEvents, [ | 
					
						
							|  |  |  |              [NavigationStart, '/invalid'], [NavigationError, '/invalid'], | 
					
						
							| 
									
										
										
										
											2016-06-10 18:57:03 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |              [NavigationStart, '/user/fedor'], [RoutesRecognized, '/user/fedor'], | 
					
						
							|  |  |  |              [NavigationEnd, '/user/fedor'] | 
					
						
							|  |  |  |            ]); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-10 18:57:03 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   it('should replace state when path is equal to current path', | 
					
						
							|  |  |  |      fakeAsync(inject( | 
					
						
							|  |  |  |          [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |          (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.resetConfig([{ | 
					
						
							|  |  |  |              path: 'team/:id', | 
					
						
							|  |  |  |              component: TeamCmp, | 
					
						
							|  |  |  |              children: [ | 
					
						
							|  |  |  |                {path: 'simple', component: SimpleCmp}, {path: 'user/:name', component: UserCmp} | 
					
						
							|  |  |  |              ] | 
					
						
							|  |  |  |            }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.navigateByUrl('/team/33/simple'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.navigateByUrl('/team/22/user/victor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.navigateByUrl('/team/22/user/victor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            location.back(); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/team/33/simple'); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should handle componentless paths', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |      fakeAsync(inject( | 
					
						
							|  |  |  |          [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |          (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |            const fixture = tcb.createFakeAsync(RootCmpWithTwoOutlets); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            router.resetConfig([ | 
					
						
							|  |  |  |              { | 
					
						
							|  |  |  |                path: 'parent/:id', | 
					
						
							|  |  |  |                children: [ | 
					
						
							|  |  |  |                  {path: 'simple', component: SimpleCmp}, | 
					
						
							|  |  |  |                  {path: 'user/:name', component: UserCmp, outlet: 'right'} | 
					
						
							|  |  |  |                ] | 
					
						
							|  |  |  |              }, | 
					
						
							|  |  |  |              {path: 'user/:name', component: UserCmp} | 
					
						
							|  |  |  |            ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            // navigate to a componentless route
 | 
					
						
							|  |  |  |            router.navigateByUrl('/parent/11/(simple//right:user/victor)'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/parent/11/(simple//right:user/victor)'); | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement) | 
					
						
							|  |  |  |                .toHaveText('primary {simple} right {user victor}'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            // navigate to the same route with different params (reuse)
 | 
					
						
							|  |  |  |            router.navigateByUrl('/parent/22/(simple//right:user/fedor)'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/parent/22/(simple//right:user/fedor)'); | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement) | 
					
						
							|  |  |  |                .toHaveText('primary {simple} right {user fedor}'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            // navigate to a normal route (check deactivation)
 | 
					
						
							|  |  |  |            router.navigateByUrl('/user/victor'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/user/victor'); | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement).toHaveText('primary {user victor} right {}'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            // navigate back to a componentless route
 | 
					
						
							|  |  |  |            router.navigateByUrl('/parent/11/(simple//right:user/victor)'); | 
					
						
							|  |  |  |            advance(fixture); | 
					
						
							|  |  |  |            expect(location.path()).toEqual('/parent/11/(simple//right:user/victor)'); | 
					
						
							|  |  |  |            expect(fixture.debugElement.nativeElement) | 
					
						
							|  |  |  |                .toHaveText('primary {simple} right {user victor}'); | 
					
						
							|  |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('router links', () => { | 
					
						
							|  |  |  |     it('should support string router links', | 
					
						
							|  |  |  |        fakeAsync( | 
					
						
							|  |  |  |            inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |              const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.resetConfig([{ | 
					
						
							|  |  |  |                path: 'team/:id', | 
					
						
							|  |  |  |                component: TeamCmp, | 
					
						
							|  |  |  |                children: [ | 
					
						
							|  |  |  |                  {path: 'link', component: StringLinkCmp}, | 
					
						
							|  |  |  |                  {path: 'simple', component: SimpleCmp} | 
					
						
							|  |  |  |                ] | 
					
						
							|  |  |  |              }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  |              expect(fixture.debugElement.nativeElement).toHaveText('team 22 { link, right:  }'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              const native = fixture.debugElement.nativeElement.querySelector('a'); | 
					
						
							|  |  |  |              expect(native.getAttribute('href')).toEqual('/team/33/simple'); | 
					
						
							|  |  |  |              native.click(); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              expect(fixture.debugElement.nativeElement).toHaveText('team 33 { simple, right:  }'); | 
					
						
							|  |  |  |            }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support absolute router links', | 
					
						
							|  |  |  |        fakeAsync( | 
					
						
							|  |  |  |            inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |              const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.resetConfig([{ | 
					
						
							|  |  |  |                path: 'team/:id', | 
					
						
							|  |  |  |                component: TeamCmp, | 
					
						
							|  |  |  |                children: [ | 
					
						
							|  |  |  |                  {path: 'link', component: AbsoluteLinkCmp}, | 
					
						
							|  |  |  |                  {path: 'simple', component: SimpleCmp} | 
					
						
							|  |  |  |                ] | 
					
						
							|  |  |  |              }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  |              expect(fixture.debugElement.nativeElement).toHaveText('team 22 { link, right:  }'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              const native = fixture.debugElement.nativeElement.querySelector('a'); | 
					
						
							|  |  |  |              expect(native.getAttribute('href')).toEqual('/team/33/simple'); | 
					
						
							|  |  |  |              native.click(); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              expect(fixture.debugElement.nativeElement).toHaveText('team 33 { simple, right:  }'); | 
					
						
							|  |  |  |            }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support relative router links', | 
					
						
							|  |  |  |        fakeAsync( | 
					
						
							|  |  |  |            inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |              const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.resetConfig([{ | 
					
						
							|  |  |  |                path: 'team/:id', | 
					
						
							|  |  |  |                component: TeamCmp, | 
					
						
							|  |  |  |                children: [ | 
					
						
							|  |  |  |                  {path: 'link', component: RelativeLinkCmp}, | 
					
						
							|  |  |  |                  {path: 'simple', component: SimpleCmp} | 
					
						
							|  |  |  |                ] | 
					
						
							|  |  |  |              }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  |              expect(fixture.debugElement.nativeElement).toHaveText('team 22 { link, right:  }'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              const native = fixture.debugElement.nativeElement.querySelector('a'); | 
					
						
							|  |  |  |              expect(native.getAttribute('href')).toEqual('/team/22/simple'); | 
					
						
							|  |  |  |              native.click(); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              expect(fixture.debugElement.nativeElement).toHaveText('team 22 { simple, right:  }'); | 
					
						
							|  |  |  |            }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support top-level link', | 
					
						
							|  |  |  |        fakeAsync( | 
					
						
							|  |  |  |            inject([Router, TestComponentBuilder], (router: Router, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |              let fixture = tcb.createFakeAsync(AbsoluteLinkCmp); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              expect(fixture.debugElement.nativeElement).toHaveText('link'); | 
					
						
							|  |  |  |            }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support query params and fragments', | 
					
						
							|  |  |  |        fakeAsync(inject( | 
					
						
							|  |  |  |            [Router, Location, TestComponentBuilder], | 
					
						
							|  |  |  |            (router: Router, location: Location, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |              const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.resetConfig([{ | 
					
						
							|  |  |  |                path: 'team/:id', | 
					
						
							|  |  |  |                component: TeamCmp, | 
					
						
							|  |  |  |                children: [ | 
					
						
							|  |  |  |                  {path: 'link', component: LinkWithQueryParamsAndFragment}, | 
					
						
							|  |  |  |                  {path: 'simple', component: SimpleCmp} | 
					
						
							|  |  |  |                ] | 
					
						
							|  |  |  |              }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              const native = fixture.debugElement.nativeElement.querySelector('a'); | 
					
						
							|  |  |  |              expect(native.getAttribute('href')).toEqual('/team/22/simple?q=1#f'); | 
					
						
							|  |  |  |              native.click(); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              expect(fixture.debugElement.nativeElement).toHaveText('team 22 { simple, right:  }'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              expect(location.path()).toEqual('/team/22/simple?q=1#f'); | 
					
						
							|  |  |  |            }))); | 
					
						
							| 
									
										
										
										
											2016-05-24 14:33:34 -07:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   describe('redirects', () => { | 
					
						
							|  |  |  |     it('should work', fakeAsync(inject( | 
					
						
							|  |  |  |                           [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                           (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                             const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                             advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                             router.resetConfig([ | 
					
						
							|  |  |  |                               {path: 'old/team/:id', redirectTo: 'team/:id'}, | 
					
						
							|  |  |  |                               {path: 'team/:id', component: TeamCmp} | 
					
						
							|  |  |  |                             ]); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:14:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                             router.navigateByUrl('old/team/22'); | 
					
						
							|  |  |  |                             advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:14:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                             expect(location.path()).toEqual('/team/22'); | 
					
						
							|  |  |  |                           }))); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:14:26 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   describe('guards', () => { | 
					
						
							|  |  |  |     describe('CanActivate', () => { | 
					
						
							|  |  |  |       describe('should not activate a route when CanActivate returns false', () => { | 
					
						
							|  |  |  |         beforeEachProviders(() => [{provide: 'alwaysFalse', useValue: (a: any, b: any) => false}]); | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('works', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            fakeAsync(inject( | 
					
						
							|  |  |  |                [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                  const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  router.resetConfig( | 
					
						
							|  |  |  |                      [{path: 'team/:id', component: TeamCmp, canActivate: ['alwaysFalse']}]); | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  router.navigateByUrl('/team/22'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  expect(location.path()).toEqual('/'); | 
					
						
							|  |  |  |                }))); | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |       describe( | 
					
						
							|  |  |  |           'should not activate a route when CanActivate returns false (componentless route)', | 
					
						
							|  |  |  |           () => { | 
					
						
							|  |  |  |             beforeEachProviders( | 
					
						
							|  |  |  |                 () => [{provide: 'alwaysFalse', useValue: (a: any, b: any) => false}]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             it('works', fakeAsync(inject( | 
					
						
							|  |  |  |                             [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                             (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                               const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                               advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                               router.resetConfig([{ | 
					
						
							|  |  |  |                                 path: 'parent', | 
					
						
							|  |  |  |                                 canActivate: ['alwaysFalse'], | 
					
						
							|  |  |  |                                 children: [{path: 'team/:id', component: TeamCmp}] | 
					
						
							|  |  |  |                               }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                               router.navigateByUrl('parent/team/22'); | 
					
						
							|  |  |  |                               advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                               expect(location.path()).toEqual('/'); | 
					
						
							|  |  |  |                             }))); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('should activate a route when CanActivate returns true', () => { | 
					
						
							|  |  |  |         beforeEachProviders(() => [{ | 
					
						
							|  |  |  |                               provide: 'alwaysTrue', | 
					
						
							|  |  |  |                               useValue: (a: ActivatedRouteSnapshot, s: RouterStateSnapshot) => true | 
					
						
							|  |  |  |                             }]); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('works', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            fakeAsync(inject( | 
					
						
							|  |  |  |                [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                  const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  router.resetConfig( | 
					
						
							|  |  |  |                      [{path: 'team/:id', component: TeamCmp, canActivate: ['alwaysTrue']}]); | 
					
						
							| 
									
										
										
										
											2016-06-02 15:29:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  router.navigateByUrl('/team/22'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-02 15:29:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  expect(location.path()).toEqual('/team/22'); | 
					
						
							|  |  |  |                }))); | 
					
						
							| 
									
										
										
										
											2016-06-02 15:29:15 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |       describe('should work when given a class', () => { | 
					
						
							| 
									
										
										
										
											2016-06-02 15:29:15 -07:00
										 |  |  |         class AlwaysTrue implements CanActivate { | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |           canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { | 
					
						
							| 
									
										
										
										
											2016-06-02 15:29:15 -07:00
										 |  |  |             return true; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         beforeEachProviders(() => [AlwaysTrue]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |         it('works', fakeAsync(inject( | 
					
						
							|  |  |  |                         [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                         (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                           const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                           advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                           router.resetConfig( | 
					
						
							|  |  |  |                               [{path: 'team/:id', component: TeamCmp, canActivate: [AlwaysTrue]}]); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                           router.navigateByUrl('/team/22'); | 
					
						
							|  |  |  |                           advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                           expect(location.path()).toEqual('/team/22'); | 
					
						
							|  |  |  |                         }))); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-06-06 10:55:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |       describe('should work when returns an observable', () => { | 
					
						
							|  |  |  |         beforeEachProviders(() => [{ | 
					
						
							|  |  |  |                               provide: 'CanActivate', | 
					
						
							|  |  |  |                               useValue: (a: ActivatedRouteSnapshot, b: RouterStateSnapshot) => { | 
					
						
							|  |  |  |                                 return of (false); | 
					
						
							|  |  |  |                               } | 
					
						
							|  |  |  |                             }]); | 
					
						
							| 
									
										
										
										
											2016-06-06 10:55:12 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('works', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            fakeAsync(inject( | 
					
						
							|  |  |  |                [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                  const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.resetConfig( | 
					
						
							|  |  |  |                      [{path: 'team/:id', component: TeamCmp, canActivate: ['CanActivate']}]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/team/22'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/'); | 
					
						
							|  |  |  |                }))); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-02 14:44:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |     describe('CanDeactivate', () => { | 
					
						
							|  |  |  |       describe('should not deactivate a route when CanDeactivate returns false', () => { | 
					
						
							|  |  |  |         beforeEachProviders( | 
					
						
							|  |  |  |             () => | 
					
						
							|  |  |  |                 [{ | 
					
						
							|  |  |  |                   provide: 'CanDeactivateParent', | 
					
						
							|  |  |  |                   useValue: (c: any, a: ActivatedRouteSnapshot, b: RouterStateSnapshot) => { | 
					
						
							|  |  |  |                     return a.params['id'] === '22'; | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                  { | 
					
						
							|  |  |  |                    provide: 'CanDeactivateTeam', | 
					
						
							|  |  |  |                    useValue: (c: any, a: ActivatedRouteSnapshot, b: RouterStateSnapshot) => { | 
					
						
							|  |  |  |                      return c.route.snapshot.params['id'] === '22'; | 
					
						
							|  |  |  |                    } | 
					
						
							|  |  |  |                  }, | 
					
						
							|  |  |  |                  { | 
					
						
							|  |  |  |                    provide: 'CanDeactivateUser', | 
					
						
							|  |  |  |                    useValue: (c: any, a: ActivatedRouteSnapshot, b: RouterStateSnapshot) => { | 
					
						
							|  |  |  |                      return a.params['name'] === 'victor'; | 
					
						
							|  |  |  |                    } | 
					
						
							|  |  |  |                  }]); | 
					
						
							| 
									
										
										
										
											2016-06-02 14:44:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('works', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            fakeAsync(inject( | 
					
						
							|  |  |  |                [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                  const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  router.resetConfig([ | 
					
						
							|  |  |  |                    {path: 'team/:id', component: TeamCmp, canDeactivate: ['CanDeactivateTeam']} | 
					
						
							|  |  |  |                  ]); | 
					
						
							| 
									
										
										
										
											2016-06-02 14:44:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  router.navigateByUrl('/team/22'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/team/22'); | 
					
						
							| 
									
										
										
										
											2016-06-02 14:44:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  router.navigateByUrl('/team/33'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/team/33'); | 
					
						
							| 
									
										
										
										
											2016-06-02 14:44:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |                  router.navigateByUrl('/team/44'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/team/33'); | 
					
						
							|  |  |  |                }))); | 
					
						
							| 
									
										
										
										
											2016-06-15 15:45:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  |         it('works (componentless route)', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            fakeAsync(inject( | 
					
						
							|  |  |  |                [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                  const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.resetConfig([{ | 
					
						
							|  |  |  |                    path: 'parent/:id', | 
					
						
							|  |  |  |                    canDeactivate: ['CanDeactivateParent'], | 
					
						
							|  |  |  |                    children: [{path: 'simple', component: SimpleCmp}] | 
					
						
							|  |  |  |                  }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/parent/22/simple'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/parent/22/simple'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/parent/33/simple'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/parent/33/simple'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/parent/44/simple'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/parent/33/simple'); | 
					
						
							|  |  |  |                }))); | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:45:42 -07:00
										 |  |  |         it('works with a nested route', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            fakeAsync(inject( | 
					
						
							|  |  |  |                [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                  const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.resetConfig([{ | 
					
						
							|  |  |  |                    path: 'team/:id', | 
					
						
							|  |  |  |                    component: TeamCmp, | 
					
						
							|  |  |  |                    children: [ | 
					
						
							|  |  |  |                      {path: '', terminal: true, component: SimpleCmp}, { | 
					
						
							|  |  |  |                        path: 'user/:name', | 
					
						
							|  |  |  |                        component: UserCmp, | 
					
						
							|  |  |  |                        canDeactivate: ['CanDeactivateUser'] | 
					
						
							|  |  |  |                      } | 
					
						
							|  |  |  |                    ] | 
					
						
							|  |  |  |                  }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/team/22/user/victor'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  // this works because we can deactivate victor
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/team/33'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/team/33'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/team/33/user/fedor'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  // this doesn't work cause we cannot deactivate fedor
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/team/44'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/team/33/user/fedor'); | 
					
						
							|  |  |  |                }))); | 
					
						
							| 
									
										
										
										
											2016-06-02 14:44:57 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-06-02 15:29:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |       describe('should work when given a class', () => { | 
					
						
							| 
									
										
										
										
											2016-06-02 15:29:15 -07:00
										 |  |  |         class AlwaysTrue implements CanDeactivate<TeamCmp> { | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |           canDeactivate( | 
					
						
							|  |  |  |               component: TeamCmp, route: ActivatedRouteSnapshot, | 
					
						
							|  |  |  |               state: RouterStateSnapshot): boolean { | 
					
						
							| 
									
										
										
										
											2016-06-02 15:29:15 -07:00
										 |  |  |             return true; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         beforeEachProviders(() => [AlwaysTrue]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('works', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |            fakeAsync(inject( | 
					
						
							|  |  |  |                [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |                (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                  const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.resetConfig( | 
					
						
							|  |  |  |                      [{path: 'team/:id', component: TeamCmp, canDeactivate: [AlwaysTrue]}]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/team/22'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/team/22'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.navigateByUrl('/team/33'); | 
					
						
							|  |  |  |                  advance(fixture); | 
					
						
							|  |  |  |                  expect(location.path()).toEqual('/team/33'); | 
					
						
							|  |  |  |                }))); | 
					
						
							| 
									
										
										
										
											2016-06-02 15:29:15 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-06-02 14:44:57 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-06 10:55:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |     describe('should work when returns an observable', () => { | 
					
						
							|  |  |  |       beforeEachProviders(() => [{ | 
					
						
							|  |  |  |                             provide: 'CanDeactivate', | 
					
						
							|  |  |  |                             useValue: (c: TeamCmp, a: ActivatedRouteSnapshot, | 
					
						
							|  |  |  |                                        b: RouterStateSnapshot) => { return of (false); } | 
					
						
							|  |  |  |                           }]); | 
					
						
							| 
									
										
										
										
											2016-06-06 10:55:12 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('works', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |          fakeAsync(inject( | 
					
						
							|  |  |  |              [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |              (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |                const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |                advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                router.resetConfig( | 
					
						
							|  |  |  |                    [{path: 'team/:id', component: TeamCmp, canDeactivate: ['CanDeactivate']}]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                router.navigateByUrl('/team/22'); | 
					
						
							|  |  |  |                advance(fixture); | 
					
						
							|  |  |  |                expect(location.path()).toEqual('/team/22'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                router.navigateByUrl('/team/33'); | 
					
						
							|  |  |  |                advance(fixture); | 
					
						
							|  |  |  |                expect(location.path()).toEqual('/team/22'); | 
					
						
							|  |  |  |              }))); | 
					
						
							| 
									
										
										
										
											2016-06-06 10:55:12 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-06-15 09:01:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   describe('routerActiveLink', () => { | 
					
						
							|  |  |  |     it('should set the class when the link is active (exact = true)', | 
					
						
							|  |  |  |        fakeAsync(inject( | 
					
						
							|  |  |  |            [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |            (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |              const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.resetConfig([{ | 
					
						
							|  |  |  |                path: 'team/:id', | 
					
						
							|  |  |  |                component: TeamCmp, | 
					
						
							|  |  |  |                children: [{ | 
					
						
							|  |  |  |                  path: 'link', | 
					
						
							|  |  |  |                  component: DummyLinkCmp, | 
					
						
							|  |  |  |                  children: | 
					
						
							|  |  |  |                      [{path: 'simple', component: SimpleCmp}, {path: '', component: BlankCmp}] | 
					
						
							|  |  |  |                }] | 
					
						
							|  |  |  |              }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  |              expect(location.path()).toEqual('/team/22/link'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              const native = fixture.debugElement.nativeElement.querySelector('a'); | 
					
						
							|  |  |  |              expect(native.className).toEqual('active'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link/simple'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  |              expect(location.path()).toEqual('/team/22/link/simple'); | 
					
						
							|  |  |  |              expect(native.className).toEqual(''); | 
					
						
							|  |  |  |            }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should set the class on a parent element when the link is active (exact = true)', | 
					
						
							|  |  |  |        fakeAsync(inject( | 
					
						
							|  |  |  |            [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |            (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |              const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.resetConfig([{ | 
					
						
							|  |  |  |                path: 'team/:id', | 
					
						
							|  |  |  |                component: TeamCmp, | 
					
						
							|  |  |  |                children: [{ | 
					
						
							|  |  |  |                  path: 'link', | 
					
						
							|  |  |  |                  component: DummyLinkWithParentCmp, | 
					
						
							|  |  |  |                  children: | 
					
						
							|  |  |  |                      [{path: 'simple', component: SimpleCmp}, {path: '', component: BlankCmp}] | 
					
						
							|  |  |  |                }] | 
					
						
							|  |  |  |              }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  |              expect(location.path()).toEqual('/team/22/link'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              const native = fixture.debugElement.nativeElement.querySelector('link-parent'); | 
					
						
							|  |  |  |              expect(native.className).toEqual('active'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link/simple'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  |              expect(location.path()).toEqual('/team/22/link/simple'); | 
					
						
							|  |  |  |              expect(native.className).toEqual(''); | 
					
						
							|  |  |  |            }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should set the class when the link is active (exact = false)', | 
					
						
							|  |  |  |        fakeAsync(inject( | 
					
						
							|  |  |  |            [Router, TestComponentBuilder, Location], | 
					
						
							|  |  |  |            (router: Router, tcb: TestComponentBuilder, location: Location) => { | 
					
						
							|  |  |  |              const fixture = tcb.createFakeAsync(RootCmp); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.resetConfig([{ | 
					
						
							|  |  |  |                path: 'team/:id', | 
					
						
							|  |  |  |                component: TeamCmp, | 
					
						
							|  |  |  |                children: [{ | 
					
						
							|  |  |  |                  path: 'link', | 
					
						
							|  |  |  |                  component: DummyLinkCmp, | 
					
						
							|  |  |  |                  children: | 
					
						
							|  |  |  |                      [{path: 'simple', component: SimpleCmp}, {path: '', component: BlankCmp}] | 
					
						
							|  |  |  |                }] | 
					
						
							|  |  |  |              }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link;exact=false'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  |              expect(location.path()).toEqual('/team/22/link;exact=false'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              const native = fixture.debugElement.nativeElement.querySelector('a'); | 
					
						
							|  |  |  |              expect(native.className).toEqual('active'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              router.navigateByUrl('/team/22/link/simple'); | 
					
						
							|  |  |  |              advance(fixture); | 
					
						
							|  |  |  |              expect(location.path()).toEqual('/team/22/link/simple'); | 
					
						
							|  |  |  |              expect(native.className).toEqual('active'); | 
					
						
							|  |  |  |            }))); | 
					
						
							| 
									
										
										
										
											2016-06-15 09:01:05 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-05-20 13:22:57 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | function expectEvents(events: Event[], pairs: any[]) { | 
					
						
							| 
									
										
										
										
											2016-06-03 14:25:18 -07:00
										 |  |  |   for (let i = 0; i < events.length; ++i) { | 
					
						
							|  |  |  |     expect((<any>events[i].constructor).name).toBe(pairs[i][0].name); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  |     expect((<any>events[i]).url).toBe(pairs[i][1]); | 
					
						
							| 
									
										
										
										
											2016-06-03 14:25:18 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 14:33:34 -07:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'link-cmp', | 
					
						
							|  |  |  |   template: `<a routerLink="/team/33/simple">link</a>`, | 
					
						
							|  |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | class StringLinkCmp { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-26 16:51:56 -07:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'link-cmp', | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  |   template: `<router-outlet></router-outlet><a [routerLink]="['/team/33/simple']">link</a>`, | 
					
						
							| 
									
										
										
										
											2016-05-26 16:51:56 -07:00
										 |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | class AbsoluteLinkCmp { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-26 16:51:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 09:01:05 -07:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'link-cmp', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   template: | 
					
						
							|  |  |  |       `<router-outlet></router-outlet><a routerLinkActive="active" [routerLinkActiveOptions]="{exact: exact}" [routerLink]="['./']">link</a>`, | 
					
						
							| 
									
										
										
										
											2016-06-15 09:01:05 -07:00
										 |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | class DummyLinkCmp { | 
					
						
							|  |  |  |   private exact: boolean; | 
					
						
							|  |  |  |   constructor(route: ActivatedRoute) { | 
					
						
							|  |  |  |     // convert 'false' into false
 | 
					
						
							|  |  |  |     this.exact = (<any>route.snapshot.params).exact !== 'false'; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'link-cmp', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   template: | 
					
						
							|  |  |  |       `<router-outlet></router-outlet><link-parent routerLinkActive="active"><a [routerLink]="['./']">link</a></link-parent>`, | 
					
						
							| 
									
										
										
										
											2016-06-15 09:01:05 -07:00
										 |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | class DummyLinkWithParentCmp { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-26 16:51:56 -07:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'link-cmp', | 
					
						
							|  |  |  |   template: `<a [routerLink]="['../simple']">link</a>`, | 
					
						
							|  |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | class RelativeLinkCmp { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-26 16:51:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-06 15:44:12 -07:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'link-cmp', | 
					
						
							|  |  |  |   template: `<a [routerLink]="['../simple']" [queryParams]="{q: '1'}" fragment="f">link</a>`, | 
					
						
							|  |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | class LinkWithQueryParamsAndFragment { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-06-06 15:44:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | @Component({selector: 'simple-cmp', template: `simple`, directives: ROUTER_DIRECTIVES}) | 
					
						
							| 
									
										
										
										
											2016-05-24 14:33:34 -07:00
										 |  |  | class SimpleCmp { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | @Component({selector: 'blank-cmp', template: ``, directives: ROUTER_DIRECTIVES}) | 
					
						
							| 
									
										
										
										
											2016-06-14 14:55:59 -07:00
										 |  |  | class BlankCmp { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'team-cmp', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   template: | 
					
						
							|  |  |  |       `team {{id | async}} { <router-outlet></router-outlet>, right: <router-outlet name="right"></router-outlet> }`, | 
					
						
							| 
									
										
										
										
											2016-05-24 14:33:34 -07:00
										 |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | }) | 
					
						
							|  |  |  | class TeamCmp { | 
					
						
							|  |  |  |   id: Observable<string>; | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  |   recordedParams: Params[] = []; | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-02 14:44:57 -07:00
										 |  |  |   constructor(public route: ActivatedRoute) { | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  |     this.id = route.params.map(p => p['id']); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  |     route.params.forEach(_ => this.recordedParams.push(_)); | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | @Component( | 
					
						
							|  |  |  |     {selector: 'user-cmp', template: `user {{name | async}}`, directives: [ROUTER_DIRECTIVES]}) | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | class UserCmp { | 
					
						
							|  |  |  |   name: Observable<string>; | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  |   recordedParams: Params[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  |   constructor(route: ActivatedRoute) { | 
					
						
							|  |  |  |     this.name = route.params.map(p => p['name']); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  |     route.params.forEach(_ => this.recordedParams.push(_)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'query-cmp', | 
					
						
							|  |  |  |   template: `query: {{name | async}} fragment: {{fragment | async}}`, | 
					
						
							|  |  |  |   directives: [ROUTER_DIRECTIVES] | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | class QueryParamsAndFragmentCmp { | 
					
						
							|  |  |  |   name: Observable<string>; | 
					
						
							|  |  |  |   fragment: Observable<string>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constructor(router: Router) { | 
					
						
							|  |  |  |     this.name = router.routerState.queryParams.map(p => p['name']); | 
					
						
							|  |  |  |     this.fragment = router.routerState.fragment; | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'root-cmp', | 
					
						
							|  |  |  |   template: `<router-outlet></router-outlet>`, | 
					
						
							|  |  |  |   directives: [ROUTER_DIRECTIVES] | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | class RootCmp { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'root-cmp', | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   template: | 
					
						
							|  |  |  |       `primary {<router-outlet></router-outlet>} right {<router-outlet name="right"></router-outlet>}`, | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  |   directives: [ROUTER_DIRECTIVES] | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | class RootCmpWithTwoOutlets { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | function advance(fixture: ComponentFixture<any>): void { | 
					
						
							|  |  |  |   tick(); | 
					
						
							|  |  |  |   fixture.detectChanges(); | 
					
						
							|  |  |  | } |