77643: BUGFIX: Init BreadcrumbsService before routing

This commit is contained in:
Bruno Roemers
2021-03-15 11:40:24 +01:00
parent c2ca35c522
commit 51e1ac09e7
3 changed files with 57 additions and 34 deletions

View File

@@ -35,6 +35,7 @@ import { provideMockStore } from '@ngrx/store/testing';
import { GoogleAnalyticsService } from './statistics/google-analytics.service'; import { GoogleAnalyticsService } from './statistics/google-analytics.service';
import { ThemeService } from './shared/theme-support/theme.service'; import { ThemeService } from './shared/theme-support/theme.service';
import { getMockThemeService } from './shared/mocks/theme-service.mock'; import { getMockThemeService } from './shared/mocks/theme-service.mock';
import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service';
let comp: AppComponent; let comp: AppComponent;
let fixture: ComponentFixture<AppComponent>; let fixture: ComponentFixture<AppComponent>;
@@ -45,13 +46,18 @@ const initialState = {
describe('App component', () => { describe('App component', () => {
let breadcrumbsServiceSpy;
function getMockLocaleService(): LocaleService { function getMockLocaleService(): LocaleService {
return jasmine.createSpyObj('LocaleService', { return jasmine.createSpyObj('LocaleService', {
setCurrentLanguageCode: jasmine.createSpy('setCurrentLanguageCode') setCurrentLanguageCode: jasmine.createSpy('setCurrentLanguageCode')
}); });
} }
const defaultTestBedConf = { const getDefaultTestBedConf = () => {
breadcrumbsServiceSpy = jasmine.createSpyObj(['listenForRouteChanges']);
return {
imports: [ imports: [
CommonModule, CommonModule,
StoreModule.forRoot(authReducer, storeModuleConfig), StoreModule.forRoot(authReducer, storeModuleConfig),
@@ -76,16 +82,18 @@ describe('App component', () => {
{ provide: HostWindowService, useValue: new HostWindowServiceStub(800) }, { provide: HostWindowService, useValue: new HostWindowServiceStub(800) },
{ provide: LocaleService, useValue: getMockLocaleService() }, { provide: LocaleService, useValue: getMockLocaleService() },
{ provide: ThemeService, useValue: getMockThemeService() }, { provide: ThemeService, useValue: getMockThemeService() },
{ provide: BreadcrumbsService, useValue: breadcrumbsServiceSpy },
provideMockStore({ initialState }), provideMockStore({ initialState }),
AppComponent, AppComponent,
RouteService RouteService
], ],
schemas: [CUSTOM_ELEMENTS_SCHEMA] schemas: [CUSTOM_ELEMENTS_SCHEMA]
}; };
};
// waitForAsync beforeEach // waitForAsync beforeEach
beforeEach(waitForAsync(() => { beforeEach(waitForAsync(() => {
return TestBed.configureTestingModule(defaultTestBedConf); return TestBed.configureTestingModule(getDefaultTestBedConf());
})); }));
// synchronous beforeEach // synchronous beforeEach
@@ -120,13 +128,19 @@ describe('App component', () => {
}); });
describe('the constructor', () => {
it('should call breadcrumbsService.listenForRouteChanges', () => {
expect(breadcrumbsServiceSpy.listenForRouteChanges).toHaveBeenCalledTimes(1);
});
});
describe('when GoogleAnalyticsService is provided', () => { describe('when GoogleAnalyticsService is provided', () => {
let googleAnalyticsSpy; let googleAnalyticsSpy;
beforeEach(() => { beforeEach(() => {
// NOTE: Cannot override providers once components have been compiled, so TestBed needs to be reset // NOTE: Cannot override providers once components have been compiled, so TestBed needs to be reset
TestBed.resetTestingModule(); TestBed.resetTestingModule();
TestBed.configureTestingModule(defaultTestBedConf); TestBed.configureTestingModule(getDefaultTestBedConf());
googleAnalyticsSpy = jasmine.createSpyObj('googleAnalyticsService', [ googleAnalyticsSpy = jasmine.createSpyObj('googleAnalyticsService', [
'addTrackingIdToPage', 'addTrackingIdToPage',
]); ]);
@@ -154,7 +168,7 @@ describe('App component', () => {
beforeEach(() => { beforeEach(() => {
// NOTE: Cannot override providers once components have been compiled, so TestBed needs to be reset // NOTE: Cannot override providers once components have been compiled, so TestBed needs to be reset
TestBed.resetTestingModule(); TestBed.resetTestingModule();
TestBed.configureTestingModule(defaultTestBedConf); TestBed.configureTestingModule(getDefaultTestBedConf());
TestBed.overrideProvider(ThemeService, {useValue: getMockThemeService('custom')}); TestBed.overrideProvider(ThemeService, {useValue: getMockThemeService('custom')});
document = TestBed.inject(DOCUMENT); document = TestBed.inject(DOCUMENT);
headSpy = jasmine.createSpyObj('head', ['appendChild']); headSpy = jasmine.createSpyObj('head', ['appendChild']);

View File

@@ -36,6 +36,7 @@ import { DOCUMENT } from '@angular/common';
import { ThemeService } from './shared/theme-support/theme.service'; import { ThemeService } from './shared/theme-support/theme.service';
import { BASE_THEME_NAME } from './shared/theme-support/theme.constants'; import { BASE_THEME_NAME } from './shared/theme-support/theme.constants';
import { DEFAULT_THEME_CONFIG } from './shared/theme-support/theme.effects'; import { DEFAULT_THEME_CONFIG } from './shared/theme-support/theme.effects';
import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service';
@Component({ @Component({
selector: 'ds-app', selector: 'ds-app',
@@ -73,6 +74,7 @@ export class AppComponent implements OnInit, AfterViewInit {
private menuService: MenuService, private menuService: MenuService,
private windowService: HostWindowService, private windowService: HostWindowService,
private localeService: LocaleService, private localeService: LocaleService,
private breadcrumbsService: BreadcrumbsService,
@Optional() private cookiesService: KlaroService, @Optional() private cookiesService: KlaroService,
@Optional() private googleAnalyticsService: GoogleAnalyticsService, @Optional() private googleAnalyticsService: GoogleAnalyticsService,
) { ) {
@@ -106,6 +108,7 @@ export class AppComponent implements OnInit, AfterViewInit {
angulartics2DSpace.startTracking(); angulartics2DSpace.startTracking();
metadata.listenForRouteChange(); metadata.listenForRouteChange();
breadcrumbsService.listenForRouteChanges();
if (environment.debug) { if (environment.debug) {
console.info(environment); console.info(environment);

View File

@@ -23,7 +23,13 @@ export class BreadcrumbsService {
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private router: Router, private router: Router,
) { ) {}
/**
* Called by {@link AppComponent#constructor} (i.e. before routing)
* such that no routing events are missed.
*/
listenForRouteChanges() {
// supply events to this.breadcrumbs$ // supply events to this.breadcrumbs$
this.router.events.pipe( this.router.events.pipe(
filter((e): e is NavigationEnd => e instanceof NavigationEnd), filter((e): e is NavigationEnd => e instanceof NavigationEnd),