@@ -2,15 +2,19 @@ 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 < (
15
+ scriptURL : string ,
16
+ options ?: RegistrationOptions | undefined ,
17
+ ) => Promise < ServiceWorkerRegistration > >
14
18
let loggerSpy : jest . SpyInstance
15
19
16
20
beforeAll ( ( ) => {
@@ -25,6 +29,8 @@ describe("register", () => {
25
29
26
30
beforeEach ( ( ) => {
27
31
loggerSpy = jest . spyOn ( logger , "error" )
32
+ spy = jest . fn ( )
33
+ global . navigator . serviceWorker . register = spy
28
34
} )
29
35
30
36
afterEach ( ( ) => {
@@ -37,7 +43,6 @@ describe("register", () => {
37
43
38
44
it ( "should register a ServiceWorker" , ( ) => {
39
45
global . navigator . serviceWorker . register = spy
40
- // call registerServiceWorker
41
46
const path = "/hello"
42
47
const mockOptions = {
43
48
base : "" ,
@@ -50,7 +55,7 @@ describe("register", () => {
50
55
expect ( spy ) . toHaveBeenCalledTimes ( 1 )
51
56
} )
52
57
53
- it ( "should log an error if something goes work" , ( ) => {
58
+ it ( "should log an error if something doesn't work" , ( ) => {
54
59
const message = "Can't find browser"
55
60
const path = "/hello"
56
61
const mockOptions = {
@@ -67,5 +72,63 @@ describe("register", () => {
67
72
expect ( loggerSpy ) . toHaveBeenCalledTimes ( 1 )
68
73
expect ( loggerSpy ) . toHaveBeenCalledWith ( `[Service Worker] failed to register: ${ message } ` )
69
74
} )
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
+ } )
70
133
} )
71
134
} )
0 commit comments