1+ import { ApplicationRef } from '@angular/core' ;
12import { TestBed } from '@angular/core/testing' ;
3+ import { NavigationEnd , Router } from '@angular/router' ;
24import { MatSnackBar } from '@angular/material/snack-bar' ;
35import { provideNoopAnimations } from '@angular/platform-browser/animations' ;
46import { SwUpdate , VersionEvent } from '@angular/service-worker' ;
@@ -10,9 +12,11 @@ describe('SwUpdateStore', () => {
1012 let store : SwUpdateStore ;
1113 let snackBar : MatSnackBar ;
1214 let versionUpdatesSubject : Subject < VersionEvent > ;
15+ let routerEventsSubject : Subject < NavigationEnd > ;
1316
1417 function setup ( isEnabled : boolean ) {
1518 versionUpdatesSubject = new Subject < VersionEvent > ( ) ;
19+ routerEventsSubject = new Subject < NavigationEnd > ( ) ;
1620
1721 TestBed . configureTestingModule ( {
1822 providers : [
@@ -24,8 +28,13 @@ describe('SwUpdateStore', () => {
2428 isEnabled,
2529 versionUpdates : versionUpdatesSubject . asObservable ( ) ,
2630 activateUpdate : vi . fn ( ) . mockResolvedValue ( undefined ) ,
31+ checkForUpdate : vi . fn ( ) . mockResolvedValue ( false ) ,
2732 } ,
2833 } ,
34+ {
35+ provide : Router ,
36+ useValue : { events : routerEventsSubject . asObservable ( ) } ,
37+ } ,
2938 ] ,
3039 } ) ;
3140
@@ -124,6 +133,51 @@ describe('SwUpdateStore', () => {
124133 expect ( openSpy ) . not . toHaveBeenCalled ( ) ;
125134 } ) ;
126135
136+ it ( 'should call activateUpdate when snackbar action is clicked' , async ( ) => {
137+ const activateUpdateSpy = vi . spyOn (
138+ TestBed . inject ( SwUpdate ) ,
139+ 'activateUpdate' ,
140+ ) ;
141+ const actionSubject = new Subject < void > ( ) ;
142+ vi . spyOn ( snackBar , 'open' ) . mockReturnValue ( {
143+ onAction : ( ) => actionSubject . asObservable ( ) ,
144+ dismiss : vi . fn ( ) ,
145+ afterDismissed : ( ) => EMPTY ,
146+ afterOpened : ( ) => EMPTY ,
147+ instance : { } as never ,
148+ containerInstance : { } as never ,
149+ } ) ;
150+
151+ versionUpdatesSubject . next ( {
152+ type : 'VERSION_READY' ,
153+ currentVersion : { hash : 'abc' , appData : null } ,
154+ latestVersion : { hash : 'def' , appData : null } ,
155+ } as VersionEvent ) ;
156+
157+ actionSubject . next ( ) ;
158+ await TestBed . inject ( ApplicationRef ) . whenStable ( ) ;
159+
160+ expect ( activateUpdateSpy ) . toHaveBeenCalled ( ) ;
161+ } ) ;
162+
163+ it ( 'should call checkForUpdate on NavigationEnd' , ( ) => {
164+ const checkSpy = vi . spyOn ( TestBed . inject ( SwUpdate ) , 'checkForUpdate' ) ;
165+
166+ routerEventsSubject . next ( new NavigationEnd ( 1 , '/' , '/' ) ) ;
167+
168+ expect ( checkSpy ) . toHaveBeenCalledTimes ( 1 ) ;
169+ } ) ;
170+
171+ it ( 'should not call checkForUpdate when SwUpdate is disabled' , ( ) => {
172+ TestBed . resetTestingModule ( ) ;
173+ setup ( false ) ;
174+ const checkSpy = vi . spyOn ( TestBed . inject ( SwUpdate ) , 'checkForUpdate' ) ;
175+
176+ routerEventsSubject . next ( new NavigationEnd ( 1 , '/' , '/' ) ) ;
177+
178+ expect ( checkSpy ) . not . toHaveBeenCalled ( ) ;
179+ } ) ;
180+
127181 it ( 'should not subscribe to versionUpdates when SwUpdate is disabled' , ( ) => {
128182 TestBed . resetTestingModule ( ) ;
129183 setup ( false ) ;
0 commit comments