@@ -6,7 +6,14 @@ import { Subject } from 'rxjs';
66
77import { ComponentFixture , TestBed } from '@angular/core/testing' ;
88import { By } from '@angular/platform-browser' ;
9- import { NavigationEnd , Router } from '@angular/router' ;
9+ import {
10+ NavigationCancel ,
11+ NavigationEnd ,
12+ NavigationError ,
13+ NavigationStart ,
14+ ResolveStart ,
15+ Router ,
16+ } from '@angular/router' ;
1017
1118import { CookieConsentBannerComponent } from '@core/components/osf-banners/cookie-consent-banner/cookie-consent-banner.component' ;
1219import { ENVIRONMENT } from '@core/provider/environment.provider' ;
@@ -18,17 +25,20 @@ import { TranslateServiceMock } from '../testing/mocks/translate.service.mock';
1825import { FullScreenLoaderComponent } from './shared/components/full-screen-loader/full-screen-loader.component' ;
1926import { ToastComponent } from './shared/components/toast/toast.component' ;
2027import { CustomDialogService } from './shared/services/custom-dialog.service' ;
28+ import { LoaderService } from './shared/services/loader.service' ;
2129import { AppComponent } from './app.component' ;
2230
2331import { OSFTestingModule } from '@testing/osf.testing.module' ;
2432import { CustomDialogServiceMockBuilder } from '@testing/providers/custom-dialog-provider.mock' ;
33+ import { LoaderServiceMock } from '@testing/providers/loader-service.mock' ;
2534import { GoogleTagManagerService } from 'angular-google-tag-manager' ;
2635
2736describe ( 'Component: App' , ( ) => {
2837 let routerEvents$ : Subject < any > ;
2938 let gtmServiceMock : jest . Mocked < GoogleTagManagerService > ;
3039 let fixture : ComponentFixture < AppComponent > ;
3140 let mockCustomDialogService : ReturnType < CustomDialogServiceMockBuilder [ 'build' ] > ;
41+ let loaderServiceMock : LoaderServiceMock ;
3242
3343 beforeEach ( async ( ) => {
3444 mockCustomDialogService = CustomDialogServiceMockBuilder . create ( ) . build ( ) ;
@@ -37,6 +47,7 @@ describe('Component: App', () => {
3747 gtmServiceMock = {
3848 pushTag : jest . fn ( ) ,
3949 } as any ;
50+ loaderServiceMock = new LoaderServiceMock ( ) ;
4051
4152 await TestBed . configureTestingModule ( {
4253 imports : [
@@ -47,6 +58,7 @@ describe('Component: App', () => {
4758 providers : [
4859 provideStore ( [ UserState , UserEmailsState ] ) ,
4960 MockProvider ( CustomDialogService , mockCustomDialogService ) ,
61+ MockProvider ( LoaderService , loaderServiceMock ) ,
5062 TranslateServiceMock ,
5163 { provide : GoogleTagManagerService , useValue : gtmServiceMock } ,
5264 {
@@ -103,4 +115,55 @@ describe('Component: App', () => {
103115 expect ( gtmServiceMock . pushTag ) . not . toHaveBeenCalled ( ) ;
104116 } ) ;
105117 } ) ;
118+
119+ describe ( 'Loader routing behavior' , ( ) => {
120+ it ( 'should not show loader on NavigationStart' , ( ) => {
121+ fixture . detectChanges ( ) ;
122+
123+ routerEvents$ . next ( new NavigationStart ( 1 , '/next' ) ) ;
124+
125+ expect ( loaderServiceMock . show ) . not . toHaveBeenCalled ( ) ;
126+ } ) ;
127+
128+ it ( 'should show loader on ResolveStart' , ( ) => {
129+ fixture . detectChanges ( ) ;
130+
131+ routerEvents$ . next ( new ResolveStart ( 1 , '/next' , '/next' , { } as any ) ) ;
132+
133+ expect ( loaderServiceMock . show ) . toHaveBeenCalled ( ) ;
134+ } ) ;
135+
136+ it ( 'should hide loader on NavigationEnd after delay' , ( ) => {
137+ jest . useFakeTimers ( ) ;
138+ fixture . detectChanges ( ) ;
139+
140+ routerEvents$ . next ( new NavigationEnd ( 1 , '/previous' , '/current' ) ) ;
141+ jest . advanceTimersByTime ( 500 ) ;
142+
143+ expect ( loaderServiceMock . hide ) . toHaveBeenCalled ( ) ;
144+ jest . useRealTimers ( ) ;
145+ } ) ;
146+
147+ it ( 'should hide loader on NavigationCancel after delay' , ( ) => {
148+ jest . useFakeTimers ( ) ;
149+ fixture . detectChanges ( ) ;
150+
151+ routerEvents$ . next ( new NavigationCancel ( 1 , '/current' , 'cancelled' ) ) ;
152+ jest . advanceTimersByTime ( 500 ) ;
153+
154+ expect ( loaderServiceMock . hide ) . toHaveBeenCalled ( ) ;
155+ jest . useRealTimers ( ) ;
156+ } ) ;
157+
158+ it ( 'should hide loader on NavigationError after delay' , ( ) => {
159+ jest . useFakeTimers ( ) ;
160+ fixture . detectChanges ( ) ;
161+
162+ routerEvents$ . next ( new NavigationError ( 1 , '/current' , new Error ( 'test' ) ) ) ;
163+ jest . advanceTimersByTime ( 500 ) ;
164+
165+ expect ( loaderServiceMock . hide ) . toHaveBeenCalled ( ) ;
166+ jest . useRealTimers ( ) ;
167+ } ) ;
168+ } ) ;
106169} ) ;
0 commit comments