Skip to content

Commit 5de15a4

Browse files
committed
refactor: add custom mock for serviceWorker test
1 parent ce9811f commit 5de15a4

File tree

1 file changed

+67
-19
lines changed

1 file changed

+67
-19
lines changed

test/serviceWorker.test.ts

+67-19
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,92 @@
1-
import makeServiceWorkerEnv = require("service-worker-mock")
2-
const makeFetchMock = require("service-worker-mock/fetch")
1+
interface MockEvent {
2+
claim: jest.Mock<any, any>
3+
waitUntil?: jest.Mock<any, any>
4+
}
5+
6+
interface Listener {
7+
event: string
8+
cb: (event?: MockEvent) => void
9+
}
310

411
describe("serviceWorker", () => {
12+
let listeners: Listener[] = []
513
let spy: jest.SpyInstance
6-
beforeEach(() => {
7-
Object.assign(
8-
global,
9-
makeServiceWorkerEnv(),
10-
makeFetchMock(),
11-
// If you're using sinon ur similar you'd probably use below instead of makeFetchMock
12-
// fetch: sinon.stub().returns(Promise.resolve())
13-
)
14-
jest.resetModules()
14+
let claimSpy: jest.Mock<any, any>
15+
let waitUntilSpy: jest.Mock<any, any>
16+
17+
function emit(event: string) {
18+
listeners
19+
.filter((listener) => listener.event === event)
20+
.forEach((listener) => {
21+
switch (event) {
22+
case "activate":
23+
listener.cb({
24+
claim: jest.fn(),
25+
waitUntil: jest.fn(() => waitUntilSpy()),
26+
})
27+
break
28+
default:
29+
listener.cb()
30+
}
31+
})
32+
}
1533

34+
beforeEach(() => {
35+
claimSpy = jest.fn()
1636
spy = jest.spyOn(console, "log")
37+
waitUntilSpy = jest.fn()
38+
39+
Object.assign(global, {
40+
self: global,
41+
addEventListener: (event: string, cb: () => void) => {
42+
listeners.push({ event, cb })
43+
},
44+
clients: {
45+
claim: claimSpy.mockResolvedValue("claimed"),
46+
},
47+
})
1748
})
1849

1950
afterEach(() => {
2051
jest.restoreAllMocks()
21-
spy.mockRestore()
52+
jest.resetModules()
53+
spy.mockClear()
54+
claimSpy.mockClear()
55+
56+
// Clear all the listeners
57+
listeners = []
2258
})
2359

24-
it("should add listeners", () => {
60+
it("should add 3 listeners: install, activate and fetch", () => {
2561
require("../src/browser/serviceWorker.ts")
26-
const _self = (self as unknown) as WorkerGlobalScope
27-
expect(_self.listeners.get("install")).toBeDefined()
28-
expect(_self.listeners.get("activate")).toBeDefined()
29-
expect(_self.listeners.get("fetch")).toBeDefined()
62+
const listenerEventNames = listeners.map((listener) => listener.event)
63+
64+
expect(listeners).toHaveLength(3)
65+
expect(listenerEventNames).toContain("install")
66+
expect(listenerEventNames).toContain("activate")
67+
expect(listenerEventNames).toContain("fetch")
3068
})
3169

3270
it("should call the proper callbacks for 'install'", async () => {
3371
require("../src/browser/serviceWorker.ts")
34-
await self.trigger("install")
72+
emit("install")
3573
expect(spy).toHaveBeenCalledWith("[Service Worker] installed")
74+
expect(spy).toHaveBeenCalledTimes(1)
75+
})
76+
77+
it("should do nothing when 'fetch' is called", async () => {
78+
require("../src/browser/serviceWorker.ts")
79+
emit("fetch")
80+
expect(spy).not.toHaveBeenCalled()
3681
})
82+
3783
it("should call the proper callbacks for 'activate'", async () => {
3884
require("../src/browser/serviceWorker.ts")
39-
await self.trigger("activate")
85+
emit("activate")
4086

4187
// Activate serviceWorker
4288
expect(spy).toHaveBeenCalledWith("[Service Worker] activated")
89+
expect(waitUntilSpy).toHaveBeenCalled()
90+
expect(claimSpy).toHaveBeenCalled()
4391
})
4492
})

0 commit comments

Comments
 (0)