feat: test failure to register service worker

This commit is contained in:
Joe Previte 2021-02-11 15:23:07 -07:00
parent a9f88affa9
commit 44b9874fbe
No known key found for this signature in database
GPG Key ID: 2C91590C6B742C24
2 changed files with 61 additions and 34 deletions

View File

@ -17,8 +17,7 @@ export async function registerServiceWorker(navigator: Navigator, path: string,
} }
if (typeof navigator !== "undefined" && "serviceWorker" in navigator) { if (typeof navigator !== "undefined" && "serviceWorker" in navigator) {
const options = getOptions() const options = getOptions()
const path = normalize(`${options.csStaticBase}/dist/serviceWorker.js`) const path = normalize(`${options.csStaticBase}/dist/serviceWorker.js`)
registerServiceWorker(navigator, path, options) registerServiceWorker(navigator, path, options)
}
} }

View File

@ -1,4 +1,7 @@
import { JSDOM } from "jsdom" import { JSDOM } from "jsdom"
// Note: we need to import logger from the root
// because this is the logger used in logError in ../src/common/util
import { logger } from "../node_modules/@coder/logger"
import { registerServiceWorker } from "../src/browser/register" import { registerServiceWorker } from "../src/browser/register"
const { window } = new JSDOM() const { window } = new JSDOM()
global.window = (window as unknown) as Window & typeof globalThis global.window = (window as unknown) as Window & typeof globalThis
@ -6,38 +9,63 @@ global.document = window.document
global.navigator = window.navigator global.navigator = window.navigator
describe("register", () => { describe("register", () => {
const spy = jest.fn() describe("registerServiceWorker", () => {
beforeAll(() => { const spy = jest.fn()
// register relies on navigator to be defined globally let loggerSpy: jest.SpyInstance
// this is because the code is called on the browser
// so we're sure it will be defined beforeAll(() => {
// We have to cast/assert so that TS thinks it's the correct type Object.defineProperty(global.navigator, "serviceWorker", {
Object.defineProperty(global.navigator, "serviceWorker", { value: {
value: { register: () => {
register: spy, return "hello"
}, },
},
})
}) })
// global.navigator.serviceWorker.register = (spy as unknown) as ServiceWorkerContainer["register"]
})
afterEach(() => { beforeEach(() => {
jest.resetAllMocks() loggerSpy = jest.spyOn(logger, "error")
}) })
afterAll(() => { afterEach(() => {
jest.restoreAllMocks() jest.resetAllMocks()
}) })
it("should register a ServiceWorker", () => {
// call registerServiceWorker afterAll(() => {
const path = "/hello" jest.restoreAllMocks()
const mockOptions = { })
base: "",
csStaticBase: "", it("should register a ServiceWorker", () => {
logLevel: 0, global.navigator.serviceWorker.register = spy
} // call registerServiceWorker
registerServiceWorker(navigator, path, mockOptions) const path = "/hello"
// expect spy to have been called const mockOptions = {
expect(spy).toHaveBeenCalled() base: "",
expect(spy).toHaveBeenCalledTimes(1) csStaticBase: "",
logLevel: 0,
}
registerServiceWorker(navigator, path, mockOptions)
// expect spy to have been called
expect(spy).toHaveBeenCalled()
expect(spy).toHaveBeenCalledTimes(1)
})
it("should log an error if something goes work", () => {
const message = "Can't find browser"
const path = "/hello"
const mockOptions = {
base: "",
csStaticBase: "",
logLevel: 0,
}
global.navigator.serviceWorker.register = () => {
throw new Error(message)
}
registerServiceWorker(navigator, path, mockOptions)
expect(loggerSpy).toHaveBeenCalled()
expect(loggerSpy).toHaveBeenCalledTimes(1)
expect(loggerSpy).toHaveBeenCalledWith(`[Service Worker] failed to register: ${message}`)
})
}) })
}) })