Skip to content

Commit 44b9874

Browse files
committed
feat: test failure to register service worker
1 parent a9f88af commit 44b9874

File tree

2 files changed

+61
-34
lines changed

2 files changed

+61
-34
lines changed

src/browser/register.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ export async function registerServiceWorker(navigator: Navigator, path: string,
1717
}
1818

1919
if (typeof navigator !== "undefined" && "serviceWorker" in navigator) {
20-
const options = getOptions()
21-
const path = normalize(`${options.csStaticBase}/dist/serviceWorker.js`)
22-
registerServiceWorker(navigator, path, options)
23-
}
20+
const options = getOptions()
21+
const path = normalize(`${options.csStaticBase}/dist/serviceWorker.js`)
22+
registerServiceWorker(navigator, path, options)
2423
}

test/register.test.ts

+58-30
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,71 @@
11
import { JSDOM } from "jsdom"
2+
// Note: we need to import logger from the root
3+
// because this is the logger used in logError in ../src/common/util
4+
import { logger } from "../node_modules/@coder/logger"
25
import { registerServiceWorker } from "../src/browser/register"
36
const { window } = new JSDOM()
47
global.window = (window as unknown) as Window & typeof globalThis
58
global.document = window.document
69
global.navigator = window.navigator
710

811
describe("register", () => {
9-
const spy = jest.fn()
10-
beforeAll(() => {
11-
// register relies on navigator to be defined globally
12-
// this is because the code is called on the browser
13-
// so we're sure it will be defined
14-
// We have to cast/assert so that TS thinks it's the correct type
15-
Object.defineProperty(global.navigator, "serviceWorker", {
16-
value: {
17-
register: spy,
18-
},
12+
describe("registerServiceWorker", () => {
13+
const spy = jest.fn()
14+
let loggerSpy: jest.SpyInstance
15+
16+
beforeAll(() => {
17+
Object.defineProperty(global.navigator, "serviceWorker", {
18+
value: {
19+
register: () => {
20+
return "hello"
21+
},
22+
},
23+
})
1924
})
20-
// global.navigator.serviceWorker.register = (spy as unknown) as ServiceWorkerContainer["register"]
21-
})
2225

23-
afterEach(() => {
24-
jest.resetAllMocks()
25-
})
26+
beforeEach(() => {
27+
loggerSpy = jest.spyOn(logger, "error")
28+
})
2629

27-
afterAll(() => {
28-
jest.restoreAllMocks()
29-
})
30-
it("should register a ServiceWorker", () => {
31-
// call registerServiceWorker
32-
const path = "/hello"
33-
const mockOptions = {
34-
base: "",
35-
csStaticBase: "",
36-
logLevel: 0,
37-
}
38-
registerServiceWorker(navigator, path, mockOptions)
39-
// expect spy to have been called
40-
expect(spy).toHaveBeenCalled()
41-
expect(spy).toHaveBeenCalledTimes(1)
30+
afterEach(() => {
31+
jest.resetAllMocks()
32+
})
33+
34+
afterAll(() => {
35+
jest.restoreAllMocks()
36+
})
37+
38+
it("should register a ServiceWorker", () => {
39+
global.navigator.serviceWorker.register = spy
40+
// call registerServiceWorker
41+
const path = "/hello"
42+
const mockOptions = {
43+
base: "",
44+
csStaticBase: "",
45+
logLevel: 0,
46+
}
47+
registerServiceWorker(navigator, path, mockOptions)
48+
// expect spy to have been called
49+
expect(spy).toHaveBeenCalled()
50+
expect(spy).toHaveBeenCalledTimes(1)
51+
})
52+
53+
it("should log an error if something goes work", () => {
54+
const message = "Can't find browser"
55+
const path = "/hello"
56+
const mockOptions = {
57+
base: "",
58+
csStaticBase: "",
59+
logLevel: 0,
60+
}
61+
global.navigator.serviceWorker.register = () => {
62+
throw new Error(message)
63+
}
64+
65+
registerServiceWorker(navigator, path, mockOptions)
66+
expect(loggerSpy).toHaveBeenCalled()
67+
expect(loggerSpy).toHaveBeenCalledTimes(1)
68+
expect(loggerSpy).toHaveBeenCalledWith(`[Service Worker] failed to register: ${message}`)
69+
})
4270
})
4371
})

0 commit comments

Comments
 (0)