@@ -2,135 +2,65 @@ 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 , handleServiceWorkerRegistration } from "../src/browser/register"
6
- import { Options } from "../src/common/util"
7
- const { window } = new JSDOM ( )
8
- global . window = ( window as unknown ) as Window & typeof globalThis
9
- global . document = window . document
10
- global . navigator = window . navigator
11
5
12
6
describe ( "register" , ( ) => {
13
- describe ( "registerServiceWorker" , ( ) => {
14
- let spy : jest . MockedFunction < (
15
- scriptURL : string ,
16
- options ?: RegistrationOptions | undefined ,
17
- ) => Promise < ServiceWorkerRegistration > >
18
- let loggerSpy : jest . SpyInstance
19
-
20
- beforeAll ( ( ) => {
21
- Object . defineProperty ( global . navigator , "serviceWorker" , {
22
- value : {
23
- register : ( ) => {
24
- return "hello"
25
- } ,
26
- } ,
27
- } )
28
- } )
29
-
30
- beforeEach ( ( ) => {
31
- loggerSpy = jest . spyOn ( logger , "error" )
32
- spy = jest . fn ( )
33
- global . navigator . serviceWorker . register = spy
34
- } )
35
-
36
- afterEach ( ( ) => {
37
- jest . resetAllMocks ( )
38
- } )
39
-
40
- afterAll ( ( ) => {
41
- jest . restoreAllMocks ( )
42
- } )
43
-
44
- it ( "should register a ServiceWorker" , ( ) => {
45
- global . navigator . serviceWorker . register = spy
46
- const path = "/hello"
47
- const mockOptions = {
48
- base : "" ,
49
- csStaticBase : "" ,
50
- logLevel : 0 ,
51
- }
52
- registerServiceWorker ( navigator , path , mockOptions )
53
- // expect spy to have been called
54
- expect ( spy ) . toHaveBeenCalled ( )
55
- expect ( spy ) . toHaveBeenCalledTimes ( 1 )
56
- } )
57
-
58
- it ( "should log an error if something doesn't work" , ( ) => {
59
- const message = "Can't find browser"
60
- const error = new Error ( message )
61
- const path = "/hello"
62
- const mockOptions = {
63
- base : "" ,
64
- csStaticBase : "" ,
65
- logLevel : 0 ,
66
- }
67
- global . navigator . serviceWorker . register = ( ) => {
68
- throw error
69
- }
70
-
71
- registerServiceWorker ( navigator , path , mockOptions )
72
- expect ( loggerSpy ) . toHaveBeenCalled ( )
73
- expect ( loggerSpy ) . toHaveBeenCalledTimes ( 1 )
74
- // Because we use logError, it will log the prefix along with the error message
75
- expect ( loggerSpy ) . toHaveBeenCalledWith ( `[Service Worker] registration: ${ error . message } ${ error . stack } ` )
7
+ const { window } = new JSDOM ( )
8
+ global . window = ( window as unknown ) as Window & typeof globalThis
9
+ global . document = window . document
10
+ global . navigator = window . navigator
11
+ global . location = window . location
12
+
13
+ let spy : jest . SpyInstance
14
+ let loggerSpy : jest . SpyInstance
15
+ const mockRegisterFn = jest . fn ( ( ) => console . log ( "Mock register fn called" ) )
16
+
17
+ beforeAll ( ( ) => {
18
+ Object . defineProperty ( global . navigator , "serviceWorker" , {
19
+ value : {
20
+ register : mockRegisterFn ,
21
+ } ,
76
22
} )
23
+ } )
77
24
78
- it ( "should work when base is undefined" , ( ) => {
79
- const path = "/hello"
25
+ beforeEach ( ( ) => {
26
+ spy = jest . spyOn ( global . navigator . serviceWorker , "register" )
27
+ } )
80
28
81
- // We want to test some code that checks if options.base is undefined
82
- // so we leave it off mockOptions
83
- // but assert it as Options so TS is happy
84
- const mockOptions = {
85
- csStaticBase : "" ,
86
- logLevel : 0 ,
87
- } as Options
88
- registerServiceWorker ( navigator , path , mockOptions )
89
- // expect spy to have been called
90
- expect ( spy ) . toHaveBeenCalled ( )
91
- expect ( spy ) . toHaveBeenCalledTimes ( 1 )
92
- } )
29
+ afterEach ( ( ) => {
30
+ jest . resetModules ( )
93
31
} )
94
32
95
- describe ( "handleServiceWorkerRegistration" , ( ) => {
96
- let getOptionsMock : jest . MockedFunction < ( ) => {
97
- base : string
98
- csStaticBase : string
99
- logLevel : number
100
- } >
101
- let normalizeMock : jest . MockedFunction < ( v : string ) => string >
102
- let registerServiceWorkerMock : jest . MockedFunction < (
103
- navigator : Navigator ,
104
- path : string ,
105
- mockOptions : Options ,
106
- ) => Promise < void > >
33
+ afterAll ( ( ) => {
34
+ jest . restoreAllMocks ( )
35
+ } )
107
36
108
- beforeEach ( ( ) => {
109
- getOptionsMock = jest . fn ( ( ) => ( {
110
- base : "" ,
111
- csStaticBase : "" ,
112
- logLevel : 0 ,
113
- } ) )
37
+ it ( "should register a ServiceWorker" , ( ) => {
38
+ spy = jest . spyOn ( global . navigator . serviceWorker , "register" )
39
+ // Load service worker like you would in the browser
40
+ require ( "../src/browser/register" )
41
+ // Load service worker like you would in the browser
42
+ // expect spy to have been called
43
+ expect ( spy ) . toHaveBeenCalled ( )
44
+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
45
+ spy . mockClear ( )
46
+ } )
114
47
115
- normalizeMock = jest . fn ( ( url : string ) => "qux///" )
48
+ it ( "should log an error if something doesn't work" , ( ) => {
49
+ loggerSpy = jest . spyOn ( logger , "error" )
50
+ const message = "Can't find browser"
51
+ const error = new Error ( message )
116
52
117
- registerServiceWorkerMock = jest
118
- . fn ( )
119
- . mockImplementation ( ( navigator : Navigator , path : string , mockOptions : Options ) => Promise . resolve ( ) )
53
+ mockRegisterFn . mockImplementation ( ( ) => {
54
+ throw error
120
55
} )
121
- it ( "should work when called" , ( ) => {
122
- handleServiceWorkerRegistration ( {
123
- getOptions : getOptionsMock ,
124
- normalize : normalizeMock ,
125
- registerServiceWorker : registerServiceWorkerMock ,
126
- } )
127
56
128
- const mocks = [ getOptionsMock , normalizeMock , registerServiceWorkerMock ]
57
+ // Load service worker like you would in the browser
58
+ require ( "../src/browser/register" )
129
59
130
- mocks . forEach ( ( mock ) => {
131
- expect ( mock ) . toHaveBeenCalled ( )
132
- expect ( mock ) . toHaveBeenCalledTimes ( 1 )
133
- } )
134
- } )
60
+ expect ( spy ) . toHaveBeenCalled ( )
61
+ expect ( loggerSpy ) . toHaveBeenCalled ( )
62
+ // expect(loggerSpy ).toHaveBeenCalledTimes(1)
63
+ // Because we use logError, it will log the prefix along with the error message
64
+ // expect(loggerSpy).toHaveBeenCalledWith(`[Service Worker] registration: ${error.message} ${error.stack}` )
135
65
} )
136
66
} )
0 commit comments