@@ -2,15 +2,16 @@ import { JSDOM } from "jsdom"
22// Note: we need to import logger from the root
33// because this is the logger used in logError in ../src/common/util
44import { logger } from "../node_modules/@coder/logger"
5- import { registerServiceWorker } from "../src/browser/register"
5+ import { registerServiceWorker , handleServiceWorkerRegistration } from "../src/browser/register"
6+ import { Options } from "../src/common/util"
67const { window } = new JSDOM ( )
78global . window = ( window as unknown ) as Window & typeof globalThis
89global . document = window . document
910global . navigator = window . navigator
1011
1112describe ( "register" , ( ) => {
1213 describe ( "registerServiceWorker" , ( ) => {
13- const spy = jest . fn ( )
14+ let spy : jest . MockedFunction
1415 let loggerSpy : jest . SpyInstance
1516
1617 beforeAll ( ( ) => {
@@ -25,6 +26,8 @@ describe("register", () => {
2526
2627 beforeEach ( ( ) => {
2728 loggerSpy = jest . spyOn ( logger , "error" )
29+ spy = jest . fn ( )
30+ global . navigator . serviceWorker . register = spy
2831 } )
2932
3033 afterEach ( ( ) => {
@@ -37,7 +40,6 @@ describe("register", () => {
3740
3841 it ( "should register a ServiceWorker" , ( ) => {
3942 global . navigator . serviceWorker . register = spy
40- // call registerServiceWorker
4143 const path = "/hello"
4244 const mockOptions = {
4345 base : "" ,
@@ -67,5 +69,63 @@ describe("register", () => {
6769 expect ( loggerSpy ) . toHaveBeenCalledTimes ( 1 )
6870 expect ( loggerSpy ) . toHaveBeenCalledWith ( `[Service Worker] failed to register: ${ message } ` )
6971 } )
72+
73+ it ( "should work when base is undefined" , ( ) => {
74+ const path = "/hello"
75+
76+ // We want to test some code that checks if options.base is undefined
77+ // so we leave it off mockOptions
78+ // but assert it as Options so TS is happy
79+ const mockOptions = {
80+ csStaticBase : "" ,
81+ logLevel : 0 ,
82+ } as Options
83+ registerServiceWorker ( navigator , path , mockOptions )
84+ // expect spy to have been called
85+ expect ( spy ) . toHaveBeenCalled ( )
86+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
87+ } )
88+ } )
89+
90+ describe ( "handleServiceWorkerRegistration" , ( ) => {
91+ let getOptionsMock : jest . MockedFunction < ( ) => {
92+ base : string
93+ csStaticBase : string
94+ logLevel : number
95+ } >
96+ let normalizeMock : jest . MockedFunction < ( v : string ) => string >
97+ let registerServiceWorkerMock : jest . MockedFunction < (
98+ navigator : Navigator ,
99+ path : string ,
100+ mockOptions : options ,
101+ ) => Promise < void > >
102+
103+ beforeEach ( ( ) => {
104+ getOptionsMock = jest . fn ( ( ) => ( {
105+ base : "" ,
106+ csStaticBase : "" ,
107+ logLevel : 0 ,
108+ } ) )
109+
110+ normalizeMock = jest . fn ( ( url : string ) => "qux///" )
111+
112+ registerServiceWorkerMock = jest
113+ . fn ( )
114+ . mockImplementation ( ( navigator : Navigator , path : string , mockOptions : Options ) => Promise . resolve ( ) )
115+ } )
116+ it ( "should work when called" , ( ) => {
117+ handleServiceWorkerRegistration ( {
118+ getOptions : getOptionsMock ,
119+ normalize : normalizeMock ,
120+ registerServiceWorker : registerServiceWorkerMock ,
121+ } )
122+
123+ const mocks = [ getOptionsMock , normalizeMock , registerServiceWorkerMock ]
124+
125+ mocks . forEach ( ( mock ) => {
126+ expect ( mock ) . toHaveBeenCalled ( )
127+ expect ( mock ) . toHaveBeenCalledTimes ( 1 )
128+ } )
129+ } )
70130 } )
71131} )
0 commit comments