@@ -2,15 +2,16 @@ import { JSDOM } from "jsdom"
2
2
// Note: we need to import logger from the root
3
3
// because this is the logger used in logError in ../src/common/util
4
4
import { 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"
6
7
const { window } = new JSDOM ( )
7
8
global . window = ( window as unknown ) as Window & typeof globalThis
8
9
global . document = window . document
9
10
global . navigator = window . navigator
10
11
11
12
describe ( "register" , ( ) => {
12
13
describe ( "registerServiceWorker" , ( ) => {
13
- const spy = jest . fn ( )
14
+ let spy : jest . MockedFunction
14
15
let loggerSpy : jest . SpyInstance
15
16
16
17
beforeAll ( ( ) => {
@@ -25,6 +26,8 @@ describe("register", () => {
25
26
26
27
beforeEach ( ( ) => {
27
28
loggerSpy = jest . spyOn ( logger , "error" )
29
+ spy = jest . fn ( )
30
+ global . navigator . serviceWorker . register = spy
28
31
} )
29
32
30
33
afterEach ( ( ) => {
@@ -37,7 +40,6 @@ describe("register", () => {
37
40
38
41
it ( "should register a ServiceWorker" , ( ) => {
39
42
global . navigator . serviceWorker . register = spy
40
- // call registerServiceWorker
41
43
const path = "/hello"
42
44
const mockOptions = {
43
45
base : "" ,
@@ -67,5 +69,63 @@ describe("register", () => {
67
69
expect ( loggerSpy ) . toHaveBeenCalledTimes ( 1 )
68
70
expect ( loggerSpy ) . toHaveBeenCalledWith ( `[Service Worker] failed to register: ${ message } ` )
69
71
} )
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
+ } )
70
130
} )
71
131
} )
0 commit comments