Skip to content

Commit c6ca9b4

Browse files
committed
refactor: use same syntax as logger spy
1 parent fc396cd commit c6ca9b4

File tree

3 files changed

+58
-138
lines changed

3 files changed

+58
-138
lines changed

src/browser/register.ts

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { getOptions, Options, normalize, logError } from "../common/util"
1+
import { getOptions, normalize, logError } from "../common/util"
22

33
import "./pages/error.css"
44
import "./pages/global.css"
55
import "./pages/login.css"
66

7-
export async function registerServiceWorker(navigator: Navigator, path: string, options: Options): Promise<void> {
7+
async function registerServiceWorker(): Promise<void> {
8+
const options = getOptions()
9+
const path = normalize(`${options.csStaticBase}/dist/serviceWorker.js`)
810
try {
911
await navigator.serviceWorker.register(path, {
1012
scope: (options.base ?? "") + "/",
@@ -15,23 +17,8 @@ export async function registerServiceWorker(navigator: Navigator, path: string,
1517
}
1618
}
1719

18-
interface HandleServiceWorkerRegistration {
19-
getOptions: () => Options
20-
normalize: (url: string, keepTrailing?: boolean) => string
21-
registerServiceWorker: (navigator: Navigator, path: string, options: Options) => Promise<void>
20+
if (typeof navigator !== "undefined" && "serviceWorker" in navigator) {
21+
registerServiceWorker()
22+
} else {
23+
console.error(`[Service Worker] navigator is undefined`)
2224
}
23-
24-
export function handleServiceWorkerRegistration({
25-
getOptions,
26-
normalize,
27-
registerServiceWorker,
28-
}: HandleServiceWorkerRegistration): void {
29-
if (typeof navigator !== "undefined" && "serviceWorker" in navigator) {
30-
const options = getOptions()
31-
const path = normalize(`${options.csStaticBase}/dist/serviceWorker.js`)
32-
registerServiceWorker(navigator, path, options)
33-
}
34-
}
35-
36-
// Written this way so that it's easier to test
37-
handleServiceWorkerRegistration({ getOptions, normalize, registerServiceWorker })

src/common/util.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,12 @@ export const getFirstString = (value: string | string[] | object | undefined): s
114114
}
115115

116116
export function logError(prefix: string, err: any): void {
117+
console.log("hey joe log error was called")
117118
if (err instanceof Error) {
119+
console.log("it was an instance of error")
118120
logger.error(`${prefix}: ${err.message} ${err.stack}`)
119121
} else {
122+
console.log("not an isntance errro")
120123
logger.error(`${prefix}: ${err}`)
121124
}
122125
}

test/register.test.ts

Lines changed: 47 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -2,135 +2,65 @@ import { JSDOM } from "jsdom"
22
// Note: we need to import logger from the root
33
// because this is the logger used in logError in ../src/common/util
44
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
115

126
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+
},
7622
})
23+
})
7724

78-
it("should work when base is undefined", () => {
79-
const path = "/hello"
25+
beforeEach(() => {
26+
spy = jest.spyOn(global.navigator.serviceWorker, "register")
27+
})
8028

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()
9331
})
9432

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

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

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

117-
registerServiceWorkerMock = jest
118-
.fn()
119-
.mockImplementation((navigator: Navigator, path: string, mockOptions: Options) => Promise.resolve())
53+
mockRegisterFn.mockImplementation(() => {
54+
throw error
12055
})
121-
it("should work when called", () => {
122-
handleServiceWorkerRegistration({
123-
getOptions: getOptionsMock,
124-
normalize: normalizeMock,
125-
registerServiceWorker: registerServiceWorkerMock,
126-
})
12756

128-
const mocks = [getOptionsMock, normalizeMock, registerServiceWorkerMock]
57+
// Load service worker like you would in the browser
58+
require("../src/browser/register")
12959

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}`)
13565
})
13666
})

0 commit comments

Comments
 (0)