@@ -2,15 +2,19 @@ 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 < (
15+ scriptURL : string ,
16+ options ?: RegistrationOptions | undefined ,
17+ ) => Promise < ServiceWorkerRegistration > >
1418 let loggerSpy : jest . SpyInstance
1519
1620 beforeAll ( ( ) => {
@@ -25,6 +29,8 @@ describe("register", () => {
2529
2630 beforeEach ( ( ) => {
2731 loggerSpy = jest . spyOn ( logger , "error" )
32+ spy = jest . fn ( )
33+ global . navigator . serviceWorker . register = spy
2834 } )
2935
3036 afterEach ( ( ) => {
@@ -37,7 +43,6 @@ describe("register", () => {
3743
3844 it ( "should register a ServiceWorker" , ( ) => {
3945 global . navigator . serviceWorker . register = spy
40- // call registerServiceWorker
4146 const path = "/hello"
4247 const mockOptions = {
4348 base : "" ,
@@ -50,7 +55,7 @@ describe("register", () => {
5055 expect ( spy ) . toHaveBeenCalledTimes ( 1 )
5156 } )
5257
53- it ( "should log an error if something goes work" , ( ) => {
58+ it ( "should log an error if something doesn't work" , ( ) => {
5459 const message = "Can't find browser"
5560 const path = "/hello"
5661 const mockOptions = {
@@ -67,5 +72,63 @@ describe("register", () => {
6772 expect ( loggerSpy ) . toHaveBeenCalledTimes ( 1 )
6873 expect ( loggerSpy ) . toHaveBeenCalledWith ( `[Service Worker] failed to register: ${ message } ` )
6974 } )
75+
76+ it ( "should work when base is undefined" , ( ) => {
77+ const path = "/hello"
78+
79+ // We want to test some code that checks if options.base is undefined
80+ // so we leave it off mockOptions
81+ // but assert it as Options so TS is happy
82+ const mockOptions = {
83+ csStaticBase : "" ,
84+ logLevel : 0 ,
85+ } as Options
86+ registerServiceWorker ( navigator , path , mockOptions )
87+ // expect spy to have been called
88+ expect ( spy ) . toHaveBeenCalled ( )
89+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
90+ } )
91+ } )
92+
93+ describe ( "handleServiceWorkerRegistration" , ( ) => {
94+ let getOptionsMock : jest . MockedFunction < ( ) => {
95+ base : string
96+ csStaticBase : string
97+ logLevel : number
98+ } >
99+ let normalizeMock : jest . MockedFunction < ( v : string ) => string >
100+ let registerServiceWorkerMock : jest . MockedFunction < (
101+ navigator : Navigator ,
102+ path : string ,
103+ mockOptions : Options ,
104+ ) => Promise < void > >
105+
106+ beforeEach ( ( ) => {
107+ getOptionsMock = jest . fn ( ( ) => ( {
108+ base : "" ,
109+ csStaticBase : "" ,
110+ logLevel : 0 ,
111+ } ) )
112+
113+ normalizeMock = jest . fn ( ( url : string ) => "qux///" )
114+
115+ registerServiceWorkerMock = jest
116+ . fn ( )
117+ . mockImplementation ( ( navigator : Navigator , path : string , mockOptions : Options ) => Promise . resolve ( ) )
118+ } )
119+ it ( "should work when called" , ( ) => {
120+ handleServiceWorkerRegistration ( {
121+ getOptions : getOptionsMock ,
122+ normalize : normalizeMock ,
123+ registerServiceWorker : registerServiceWorkerMock ,
124+ } )
125+
126+ const mocks = [ getOptionsMock , normalizeMock , registerServiceWorkerMock ]
127+
128+ mocks . forEach ( ( mock ) => {
129+ expect ( mock ) . toHaveBeenCalled ( )
130+ expect ( mock ) . toHaveBeenCalledTimes ( 1 )
131+ } )
132+ } )
70133 } )
71134} )
0 commit comments