Skip to content

Commit 54ea107

Browse files
authored
Merge pull request #2744 from cdr/add-tests-serviceWorker
feat(testing): add tests for serviceWorker.ts
2 parents 294b3d3 + f1f0f49 commit 54ea107

File tree

4 files changed

+116
-3
lines changed

4 files changed

+116
-3
lines changed

ci/dev/lint.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ main() {
66

77
eslint --max-warnings=0 --fix $(git ls-files "*.ts" "*.tsx" "*.js" | grep -v "lib/vscode")
88
stylelint $(git ls-files "*.css" | grep -v "lib/vscode")
9-
tsc --noEmit
9+
tsc --noEmit --skipLibCheck
1010
shellcheck -e SC2046,SC2164,SC2154,SC1091,SC1090,SC2002 $(git ls-files "*.sh" | grep -v "lib/vscode")
1111
if command -v helm && helm kubeval --help > /dev/null; then
1212
helm kubeval ci/helm-chart

src/browser/serviceWorker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
/* eslint-disable @typescript-eslint/no-explicit-any */
22

33
self.addEventListener("install", () => {
4-
console.log("[Service Worker] install")
4+
console.log("[Service Worker] installed")
55
})
66

77
self.addEventListener("activate", (event: any) => {
88
event.waitUntil((self as any).clients.claim())
9+
console.log("[Service Worker] activated")
910
})
1011

1112
self.addEventListener("fetch", () => {

test/emitter.test.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
// Note: we need to import logger from the root
22
// because this is the logger used in logError in ../src/common/util
33
import { logger } from "../node_modules/@coder/logger"
4+
45
import { Emitter } from "../src/common/emitter"
56

6-
describe("Emitter", () => {
7+
describe("emitter", () => {
78
let spy: jest.SpyInstance
89

910
beforeEach(() => {
@@ -59,6 +60,25 @@ describe("Emitter", () => {
5960
emitter.dispose()
6061
})
6162

63+
it("should log an error if something goes wrong", async () => {
64+
const HELLO_WORLD = "HELLO_WORLD"
65+
const mockCallback = jest.fn(() => "Mock function called")
66+
const message = "You don't have access to that folder."
67+
68+
const emitter = new Emitter<{ event: string; callback: () => void }>()
69+
70+
const onHelloWorld = ({ event, callback }: { event: string; callback: () => void }): void => {
71+
if (event === HELLO_WORLD) {
72+
callback()
73+
throw new Error(message)
74+
}
75+
}
76+
77+
emitter.event(onHelloWorld)
78+
79+
await emitter.emit({ event: HELLO_WORLD, callback: mockCallback })
80+
})
81+
6282
it("should log an error if something goes wrong", async () => {
6383
const HELLO_WORLD = "HELLO_WORLD"
6484
const mockCallback = jest.fn(() => "Mock function called")

test/serviceWorker.test.ts

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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+
}
10+
11+
describe("serviceWorker", () => {
12+
let listeners: Listener[] = []
13+
let spy: jest.SpyInstance
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+
}
33+
34+
beforeEach(() => {
35+
claimSpy = jest.fn()
36+
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+
})
48+
})
49+
50+
afterEach(() => {
51+
jest.restoreAllMocks()
52+
jest.resetModules()
53+
spy.mockClear()
54+
claimSpy.mockClear()
55+
56+
// Clear all the listeners
57+
listeners = []
58+
})
59+
60+
it("should add 3 listeners: install, activate and fetch", () => {
61+
require("../src/browser/serviceWorker.ts")
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")
68+
})
69+
70+
it("should call the proper callbacks for 'install'", async () => {
71+
require("../src/browser/serviceWorker.ts")
72+
emit("install")
73+
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()
81+
})
82+
83+
it("should call the proper callbacks for 'activate'", async () => {
84+
require("../src/browser/serviceWorker.ts")
85+
emit("activate")
86+
87+
// Activate serviceWorker
88+
expect(spy).toHaveBeenCalledWith("[Service Worker] activated")
89+
expect(waitUntilSpy).toHaveBeenCalled()
90+
expect(claimSpy).toHaveBeenCalled()
91+
})
92+
})

0 commit comments

Comments
 (0)