| 
									
										
										
										
											2017-04-12 16:31:02 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {CommonModule} from '@angular/common'; | 
					
						
							| 
									
										
										
										
											2017-09-27 16:44:17 -04:00
										 |  |  | import {Component, ContentChild, NgModule, TemplateRef, Type, ViewChild, ViewContainerRef} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  | import {ComponentFixture, fakeAsync, TestBed, tick} from '@angular/core/testing'; | 
					
						
							| 
									
										
										
										
											2017-04-12 16:31:02 -07:00
										 |  |  | import {Router} from '@angular/router'; | 
					
						
							|  |  |  | import {RouterTestingModule} from '@angular/router/testing'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('Integration', () => { | 
					
						
							|  |  |  |   describe('routerLinkActive', () => { | 
					
						
							| 
									
										
										
										
											2018-11-22 15:38:28 +01:00
										 |  |  |     it('should not cause infinite loops in the change detection - #15825', fakeAsync(() => { | 
					
						
							|  |  |  |          @Component({selector: 'simple', template: 'simple'}) | 
					
						
							|  |  |  |          class SimpleCmp { | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          @Component({ | 
					
						
							|  |  |  |            selector: 'some-root', | 
					
						
							|  |  |  |            template: `
 | 
					
						
							| 
									
										
										
										
											2017-04-12 16:31:02 -07:00
										 |  |  |         <div *ngIf="show"> | 
					
						
							|  |  |  |           <ng-container *ngTemplateOutlet="tpl"></ng-container> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |         <router-outlet></router-outlet> | 
					
						
							|  |  |  |         <ng-template #tpl> | 
					
						
							|  |  |  |           <a routerLink="/simple" routerLinkActive="active"></a> | 
					
						
							|  |  |  |         </ng-template>` | 
					
						
							| 
									
										
										
										
											2018-11-22 15:38:28 +01:00
										 |  |  |          }) | 
					
						
							|  |  |  |          class MyCmp { | 
					
						
							|  |  |  |            show: boolean = false; | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          @NgModule({ | 
					
						
							|  |  |  |            imports: [CommonModule, RouterTestingModule], | 
					
						
							|  |  |  |            declarations: [MyCmp, SimpleCmp], | 
					
						
							|  |  |  |            entryComponents: [SimpleCmp], | 
					
						
							|  |  |  |          }) | 
					
						
							|  |  |  |          class MyModule { | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          TestBed.configureTestingModule({imports: [MyModule]}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-28 16:22:36 -07:00
										 |  |  |          const router: Router = TestBed.inject(Router); | 
					
						
							| 
									
										
										
										
											2018-11-22 15:38:28 +01:00
										 |  |  |          const fixture = createRoot(router, MyCmp); | 
					
						
							|  |  |  |          router.resetConfig([{path: 'simple', component: SimpleCmp}]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          router.navigateByUrl('/simple'); | 
					
						
							|  |  |  |          advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          const instance = fixture.componentInstance; | 
					
						
							|  |  |  |          instance.show = true; | 
					
						
							|  |  |  |          expect(() => advance(fixture)).not.toThrow(); | 
					
						
							|  |  |  |        })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should set isActive right after looking at its children -- #18983', fakeAsync(() => { | 
					
						
							|  |  |  |          @Component({ | 
					
						
							|  |  |  |            template: `
 | 
					
						
							| 
									
										
										
										
											2017-09-27 16:44:17 -04:00
										 |  |  |           <div #rla="routerLinkActive" routerLinkActive> | 
					
						
							|  |  |  |             isActive: {{rla.isActive}} | 
					
						
							| 
									
										
										
										
											2019-08-28 16:22:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-27 16:44:17 -04:00
										 |  |  |             <ng-template let-data> | 
					
						
							|  |  |  |               <a [routerLink]="data">link</a> | 
					
						
							|  |  |  |             </ng-template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             <ng-container #container></ng-container> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `
 | 
					
						
							| 
									
										
										
										
											2018-11-22 15:38:28 +01:00
										 |  |  |          }) | 
					
						
							|  |  |  |          class ComponentWithRouterLink { | 
					
						
							|  |  |  |            // TODO(issue/24571): remove '!'.
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |            @ViewChild(TemplateRef, {static: true}) templateRef!: TemplateRef<any>; | 
					
						
							| 
									
										
										
										
											2018-11-22 15:38:28 +01:00
										 |  |  |            // TODO(issue/24571): remove '!'.
 | 
					
						
							| 
									
										
										
										
											2019-05-23 11:31:10 -07:00
										 |  |  |            @ViewChild('container', {read: ViewContainerRef, static: true}) | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |            container!: ViewContainerRef; | 
					
						
							| 
									
										
										
										
											2018-11-22 15:38:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |            addLink() { | 
					
						
							|  |  |  |              this.container.createEmbeddedView(this.templateRef, {$implicit: '/simple'}); | 
					
						
							|  |  |  |            } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |            removeLink() { | 
					
						
							|  |  |  |              this.container.clear(); | 
					
						
							|  |  |  |            } | 
					
						
							| 
									
										
										
										
											2018-11-22 15:38:28 +01:00
										 |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          @Component({template: 'simple'}) | 
					
						
							|  |  |  |          class SimpleCmp { | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          TestBed.configureTestingModule({ | 
					
						
							|  |  |  |            imports: [RouterTestingModule.withRoutes([{path: 'simple', component: SimpleCmp}])], | 
					
						
							|  |  |  |            declarations: [ComponentWithRouterLink, SimpleCmp] | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-28 16:22:36 -07:00
										 |  |  |          const router: Router = TestBed.inject(Router); | 
					
						
							| 
									
										
										
										
											2018-11-22 15:38:28 +01:00
										 |  |  |          const fixture = createRoot(router, ComponentWithRouterLink); | 
					
						
							|  |  |  |          router.navigateByUrl('/simple'); | 
					
						
							|  |  |  |          advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          fixture.componentInstance.addLink(); | 
					
						
							|  |  |  |          fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          fixture.componentInstance.removeLink(); | 
					
						
							|  |  |  |          advance(fixture); | 
					
						
							|  |  |  |          advance(fixture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          expect(fixture.nativeElement.innerHTML).toContain('isActive: false'); | 
					
						
							|  |  |  |        })); | 
					
						
							| 
									
										
										
										
											2017-04-12 16:31:02 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function advance<T>(fixture: ComponentFixture<T>): void { | 
					
						
							|  |  |  |   tick(); | 
					
						
							|  |  |  |   fixture.detectChanges(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function createRoot<T>(router: Router, type: Type<T>): ComponentFixture<T> { | 
					
						
							|  |  |  |   const f = TestBed.createComponent(type); | 
					
						
							|  |  |  |   advance(f); | 
					
						
							|  |  |  |   router.initialNavigation(); | 
					
						
							|  |  |  |   advance(f); | 
					
						
							|  |  |  |   return f; | 
					
						
							|  |  |  | } |