Skip to content

Commit f1f0f49

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

7 files changed

+68
-173
lines changed

test/package.json

-5
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
{
22
"#": "We must put jest in a sub-directory otherwise VS Code somehow picks up the types and generates conflicts with mocha.",
3-
"scripts": {
4-
"postinstall": "./scripts/patch.sh"
5-
},
63
"devDependencies": {
74
"@types/jest": "^26.0.20",
85
"@types/jsdom": "^16.2.6",
96
"@types/node-fetch": "^2.5.8",
10-
"@types/service-worker-mock": "^2.0.1",
117
"@types/supertest": "^2.0.10",
128
"jest": "^26.6.3",
139
"jsdom": "^16.4.0",
1410
"node-fetch": "^2.6.1",
1511
"playwright": "^1.8.0",
16-
"service-worker-mock": "^2.0.5",
1712
"supertest": "^6.1.1",
1813
"ts-jest": "^26.4.4"
1914
}

test/patches/service-worker-mock-fetch.patch

-15
This file was deleted.

test/patches/service-worker-mock-response.patch

-9
This file was deleted.

test/patches/service-worker-types.patch

-14
This file was deleted.

test/scripts/patch.sh

-26
This file was deleted.

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
})

test/yarn.lock

+1-85
Original file line numberDiff line numberDiff line change
@@ -588,11 +588,6 @@
588588
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.6.tgz#f4b1efa784e8db479cdb8b14403e2144b1e9ff03"
589589
integrity sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==
590590

591-
"@types/service-worker-mock@^2.0.1":
592-
version "2.0.1"
593-
resolved "https://registry.yarnpkg.com/@types/service-worker-mock/-/service-worker-mock-2.0.1.tgz#4857b2024318c395294a02eda5050ac083f41e56"
594-
integrity sha512-LqaP0QmgppRF7YEaqx4amoazHNXaX5bIFDAu62LnWIc5ku0HbgqlPKroQstAu8WsdmWIqEfI9VGlP8Skkq+m5A==
595-
596591
"@types/stack-utils@^2.0.0":
597592
version "2.0.0"
598593
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff"
@@ -1237,13 +1232,6 @@ diff-sequences@^26.6.2:
12371232
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
12381233
integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
12391234

1240-
dom-urls@^1.1.0:
1241-
version "1.1.0"
1242-
resolved "https://registry.yarnpkg.com/dom-urls/-/dom-urls-1.1.0.tgz#001ddf81628cd1e706125c7176f53ccec55d918e"
1243-
integrity sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=
1244-
dependencies:
1245-
urijs "^1.16.1"
1246-
12471235
domexception@^2.0.1:
12481236
version "2.0.1"
12491237
resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
@@ -2498,38 +2486,6 @@ locate-path@^5.0.0:
24982486
dependencies:
24992487
p-locate "^4.1.0"
25002488

2501-
lodash._basefor@^3.0.0:
2502-
version "3.0.3"
2503-
resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2"
2504-
integrity sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=
2505-
2506-
lodash.isarguments@^3.0.0:
2507-
version "3.1.0"
2508-
resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
2509-
integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
2510-
2511-
lodash.isarray@^3.0.0:
2512-
version "3.0.4"
2513-
resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
2514-
integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=
2515-
2516-
lodash.isplainobject@^3.0.2:
2517-
version "3.2.0"
2518-
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz#9a8238ae16b200432960cd7346512d0123fbf4c5"
2519-
integrity sha1-moI4rhayAEMpYM1zRlEtASP79MU=
2520-
dependencies:
2521-
lodash._basefor "^3.0.0"
2522-
lodash.isarguments "^3.0.0"
2523-
lodash.keysin "^3.0.0"
2524-
2525-
lodash.keysin@^3.0.0:
2526-
version "3.0.8"
2527-
resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-3.0.8.tgz#22c4493ebbedb1427962a54b445b2c8a767fb47f"
2528-
integrity sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=
2529-
dependencies:
2530-
lodash.isarguments "^3.0.0"
2531-
lodash.isarray "^3.0.0"
2532-
25332489
25342490
version "4.1.2"
25352491
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
@@ -3060,13 +3016,6 @@ readable-stream@^3.6.0:
30603016
string_decoder "^1.1.1"
30613017
util-deprecate "^1.0.1"
30623018

3063-
realistic-structured-clone@^1.0.1:
3064-
version "1.0.1"
3065-
resolved "https://registry.yarnpkg.com/realistic-structured-clone/-/realistic-structured-clone-1.0.1.tgz#1abe82af0b80cd7b109fdaf5d29308032852d45d"
3066-
integrity sha1-Gr6CrwuAzXsQn9r10pMIAyhS1F0=
3067-
dependencies:
3068-
lodash.isplainobject "^3.0.2"
3069-
30703019
regex-not@^1.0.0, regex-not@^1.0.2:
30713020
version "1.0.2"
30723021
resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
@@ -3250,16 +3199,6 @@ semver@^6.0.0, semver@^6.3.0:
32503199
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
32513200
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
32523201

3253-
service-worker-mock@^2.0.5:
3254-
version "2.0.5"
3255-
resolved "https://registry.yarnpkg.com/service-worker-mock/-/service-worker-mock-2.0.5.tgz#89d47ec1571130114d4deed66d69bdcfee4a4545"
3256-
integrity sha512-yk6NCFnRWGfbOlP+IS4hEbJnGU8dVgtodAAKLxhkTPsOmaES44XVSWTNozK6KwI+p/0PDRrFsb2RjTMhvXiNkA==
3257-
dependencies:
3258-
dom-urls "^1.1.0"
3259-
shelving-mock-indexeddb "^1.1.0"
3260-
url-search-params "^0.10.0"
3261-
w3c-hr-time "^1.0.1"
3262-
32633202
set-blocking@^2.0.0:
32643203
version "2.0.0"
32653204
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@@ -3304,19 +3243,6 @@ shellwords@^0.1.1:
33043243
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
33053244
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
33063245

3307-
shelving-mock-event@^1.0.12:
3308-
version "1.0.12"
3309-
resolved "https://registry.yarnpkg.com/shelving-mock-event/-/shelving-mock-event-1.0.12.tgz#401dc90b3b49cbf2a817ecf2dd5a83eff4de2e14"
3310-
integrity sha512-2F+IZ010rwV3sA/Kd2hnC1vGNycsxeBJmjkXR8+4IOlv5e+Wvj+xH+A8Cv8/Z0lUyCut/HcxSpeDccYTVtnuaQ==
3311-
3312-
shelving-mock-indexeddb@^1.1.0:
3313-
version "1.1.0"
3314-
resolved "https://registry.yarnpkg.com/shelving-mock-indexeddb/-/shelving-mock-indexeddb-1.1.0.tgz#e065a8d7987d182d058e2b55f0f79a52d48a38f1"
3315-
integrity sha512-akHJAmGL/dplJ4FZNxPxVbOxMw8Ey6wAnB9+3+GCUNqPUcJaskS55GijxZtarTfAYB4XQyu+FLtjcq2Oa3e2Lg==
3316-
dependencies:
3317-
realistic-structured-clone "^1.0.1"
3318-
shelving-mock-event "^1.0.12"
3319-
33203246
signal-exit@^3.0.0, signal-exit@^3.0.2:
33213247
version "3.0.3"
33223248
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
@@ -3748,21 +3674,11 @@ uri-js@^4.2.2:
37483674
dependencies:
37493675
punycode "^2.1.0"
37503676

3751-
urijs@^1.16.1:
3752-
version "1.19.6"
3753-
resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.6.tgz#51f8cb17ca16faefb20b9a31ac60f84aa2b7c870"
3754-
integrity sha512-eSXsXZ2jLvGWeLYlQA3Gh36BcjF+0amo92+wHPyN1mdR8Nxf75fuEuYTd9c0a+m/vhCjRK0ESlE9YNLW+E1VEw==
3755-
37563677
urix@^0.1.0:
37573678
version "0.1.0"
37583679
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
37593680
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
37603681

3761-
url-search-params@^0.10.0:
3762-
version "0.10.2"
3763-
resolved "https://registry.yarnpkg.com/url-search-params/-/url-search-params-0.10.2.tgz#e9da69646e48c6140c6732e1f07fb669525f5a4e"
3764-
integrity sha512-d6GYsr992Bo9rzTZFc9BUw3UFAAg3prE9JGVBgW2TLTbI3rSvg4VDa0BFXHMzKkWbAuhrmaFWpucpRJl+3W7Jg==
3765-
37663682
use@^3.1.0:
37673683
version "3.1.1"
37683684
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
@@ -3809,7 +3725,7 @@ [email protected]:
38093725
core-util-is "1.0.2"
38103726
extsprintf "^1.2.0"
38113727

3812-
w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2:
3728+
w3c-hr-time@^1.0.2:
38133729
version "1.0.2"
38143730
resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
38153731
integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==

0 commit comments

Comments
 (0)