import {Location} from '@angular/common'; import {Component, ModuleWithProviders, NgModule} from "@angular/core"; import {ComponentFixture, fakeAsync, inject, TestBed, tick} from "@angular/core/testing"; import {Route, Router, RouterModule} from "@angular/router"; import {RouterTestingModule} from "@angular/router/testing"; import {TranslateModule, TranslateService} from "../public-api"; @Component({ selector: 'root-cmp', template: ` ` }) class RootComponent { constructor(public translate: TranslateService) { translate.setTranslation('en', { "TEST": "Root", 'ROOT': 'Root' }); translate.use('en'); } } @Component({ selector: 'lazy', template: 'lazy-loaded-parent []' }) class ParentLazyLoadedComponent { } function getLazyLoadedModule(importedModule: ModuleWithProviders<{}>) { @Component({selector: 'lazy', template: 'lazy-loaded-child'}) class ChildLazyLoadedComponent { constructor(public translate: TranslateService) { translate.setTranslation('en', { "TEST": "Lazy", 'CHILD': 'Child' }); translate.use('en'); expect(translate.instant('TEST')).toEqual('Lazy'); } } @NgModule({ declarations: [ParentLazyLoadedComponent, ChildLazyLoadedComponent], imports: [ RouterModule.forChild([{ path: 'loaded', component: ParentLazyLoadedComponent, children: [{path: 'child', component: ChildLazyLoadedComponent}] }]), importedModule ] }) class LoadedModule { } return LoadedModule; } function advance(fixture: ComponentFixture): void { tick(); fixture.detectChanges(); } function createRoot(router: Router, type: any): ComponentFixture { const f = TestBed.createComponent(type); advance(f); router.initialNavigation(); advance(f); return f; } describe("module", () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ RouterTestingModule, TranslateModule.forRoot(), ], declarations: [RootComponent] }); }); it("should work when lazy loaded using forChild", fakeAsync(inject( [Router, Location], (router: Router, location: Location) => { const LoadedModule = getLazyLoadedModule(TranslateModule.forChild()); const fixture = createRoot(router, RootComponent), translate = TestBed.inject(TranslateService); expect(translate.instant('TEST')).toEqual('Root'); router.resetConfig([{path: 'lazy', loadChildren: () => LoadedModule}]); router.navigateByUrl('/lazy/loaded/child'); advance(fixture); expect(location.path()).toEqual('/lazy/loaded/child'); // since the root module imports the TranslateModule with forRoot and the lazy loaded module with forChild // the translate service is shared between both modules // the constructor of the ChildLazyLoadedComponent overwrote the "TEST" key of the root TranslateService expect(translate.instant('TEST')).toEqual('Lazy'); })) ); it("should create 2 instances of the service when lazy loaded using forRoot", fakeAsync(inject( [Router, Location], (router: Router, location: Location) => { const LoadedModule = getLazyLoadedModule(TranslateModule.forRoot()); const fixture = createRoot(router, RootComponent), translate = TestBed.inject(TranslateService); expect(translate.instant('TEST')).toEqual('Root'); router.resetConfig([{path: 'lazy', loadChildren: () => LoadedModule}]); router.navigateByUrl('/lazy/loaded/child'); advance(fixture); expect(location.path()).toEqual('/lazy/loaded/child'); // since both the root module and the lazy loaded module use forRoot to define the TranslateModule // the translate service is NOT shared, and 2 instances co-exist // the constructor of the ChildLazyLoadedComponent didn't overwrote the "TEST" key of the root TranslateService expect(translate.instant('TEST')).toEqual('Root'); })) ); it("should create 2 instances of the service when lazy loaded using forChild and isolate true", fakeAsync(inject( [Router, Location], (router: Router, location: Location) => { const LoadedModule = getLazyLoadedModule(TranslateModule.forChild({isolate: true})); const fixture = createRoot(router, RootComponent), translate = TestBed.inject(TranslateService); expect(translate.instant('TEST')).toEqual('Root'); router.resetConfig([{path: 'lazy', loadChildren: () => LoadedModule}]); router.navigateByUrl('/lazy/loaded/child'); advance(fixture); expect(location.path()).toEqual('/lazy/loaded/child'); // since both the root module and the lazy loaded module use forRoot to define the TranslateModule // the translate service is NOT shared, and 2 instances co-exist // the constructor of the ChildLazyLoadedComponent didn't overwrote the "TEST" key of the root TranslateService expect(translate.instant('TEST')).toEqual('Root'); })) ); it("should relay events when lazy loading & using forChild with isolate false", fakeAsync(inject( [Router], (router: Router) => { const LoadedModule = getLazyLoadedModule(TranslateModule.forChild()); const fixture = createRoot(router, RootComponent), translate = TestBed.inject(TranslateService); let spy = jest.fn(); let sub = translate.onTranslationChange.subscribe(spy); expect(spy).toHaveBeenCalledTimes(0); router.resetConfig([{path: 'lazy', loadChildren: () => LoadedModule}]); router.navigateByUrl('/lazy/loaded/child'); advance(fixture); expect(spy).toHaveBeenCalledTimes(1); sub.unsubscribe(); })) ); it("should not relay events when lazy loading & using forChild with isolate true", fakeAsync(inject( [Router], (router: Router) => { const LoadedModule = getLazyLoadedModule(TranslateModule.forChild({isolate: true})); const fixture = createRoot(router, RootComponent), translate = TestBed.inject(TranslateService); let spy = jest.fn(); let sub = translate.onTranslationChange.subscribe(spy); expect(spy).toHaveBeenCalledTimes(0); router.resetConfig([{path: 'lazy', loadChildren: () => LoadedModule}]); router.navigateByUrl('/lazy/loaded/child'); advance(fixture); expect(spy).toHaveBeenCalledTimes(0); sub.unsubscribe(); })) ); it('should extend translations with extend true', fakeAsync(inject( [Router], (router: Router) => { const LoadedModule = getLazyLoadedModule(TranslateModule.forChild({ extend: true })); const fixture = createRoot(router, RootComponent); const translate: TranslateService = TestBed.inject(TranslateService); router.resetConfig([{path: 'lazy', loadChildren: () => LoadedModule}]); router.navigateByUrl('/lazy/loaded/child'); advance(fixture); expect(translate.instant('TEST')).toEqual('Lazy'); expect(translate.instant('ROOT')).toEqual('Root'); expect(translate.instant('CHILD')).toEqual('Child'); })) ); });