feat(register): add test when navigator undefined

This commit is contained in:
Joe Previte 2021-02-23 16:20:18 -07:00
parent e6a324b484
commit b232dcbd4a
No known key found for this signature in database
GPG Key ID: 2C91590C6B742C24
2 changed files with 73 additions and 47 deletions

View File

@ -1,6 +1,3 @@
// 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 { commit, getPackageJson, version } from "../src/node/constants" import { commit, getPackageJson, version } from "../src/node/constants"
import { loggerModule } from "./helpers" import { loggerModule } from "./helpers"

View File

@ -1,59 +1,88 @@
import { JSDOM } from "jsdom" import { JSDOM } from "jsdom"
import { loggerModule } from "./helpers" import { loggerModule } from "./helpers"
// jest.mock is hoisted above the imports so we must use `require` here.
jest.mock("@coder/logger", () => require("./helpers").loggerModule)
describe("register", () => { describe("register", () => {
const { window } = new JSDOM() describe("when navigator and serviceWorker are defined", () => {
global.window = (window as unknown) as Window & typeof globalThis const mockRegisterFn = jest.fn()
global.document = window.document
global.navigator = window.navigator
global.location = window.location
const mockRegisterFn = jest.fn() beforeAll(() => {
const { window } = new JSDOM()
global.window = (window as unknown) as Window & typeof globalThis
global.document = window.document
global.navigator = window.navigator
global.location = window.location
beforeAll(() => { Object.defineProperty(global.navigator, "serviceWorker", {
Object.defineProperty(global.navigator, "serviceWorker", { value: {
value: { register: mockRegisterFn,
register: mockRegisterFn, },
}, })
})
beforeEach(() => {
jest.mock("@coder/logger", () => loggerModule)
})
afterEach(() => {
mockRegisterFn.mockClear()
jest.resetModules()
})
afterAll(() => {
jest.restoreAllMocks()
// We don't want these to stay around because it can affect other tests
global.window = (undefined as unknown) as Window & typeof globalThis
global.document = (undefined as unknown) as Document & typeof globalThis
global.navigator = (undefined as unknown) as Navigator & typeof globalThis
global.location = (undefined as unknown) as Location & typeof globalThis
})
it("should register a ServiceWorker", () => {
// Load service worker like you would in the browser
require("../src/browser/register")
// Load service worker like you would in the browser
expect(mockRegisterFn).toHaveBeenCalled()
expect(mockRegisterFn).toHaveBeenCalledTimes(1)
})
it("should log an error if something doesn't work", () => {
const message = "Can't find browser"
const error = new Error(message)
mockRegisterFn.mockImplementation(() => {
throw error
})
// Load service worker like you would in the browser
require("../src/browser/register")
expect(mockRegisterFn).toHaveBeenCalled()
expect(loggerModule.logger.error).toHaveBeenCalled()
expect(loggerModule.logger.error).toHaveBeenCalledTimes(1)
expect(loggerModule.logger.error).toHaveBeenCalledWith(
`[Service Worker] registration: ${error.message} ${error.stack}`,
)
}) })
}) })
afterEach(() => { describe("when navigator and serviceWorker are NOT defined", () => {
mockRegisterFn.mockClear() let spy: jest.SpyInstance
jest.resetModules()
})
afterAll(() => { beforeEach(() => {
jest.restoreAllMocks() spy = jest.spyOn(console, "error")
})
it("should register a ServiceWorker", () => {
// Load service worker like you would in the browser
require("../src/browser/register")
// Load service worker like you would in the browser
expect(mockRegisterFn).toHaveBeenCalled()
expect(mockRegisterFn).toHaveBeenCalledTimes(1)
})
it("should log an error if something doesn't work", () => {
const message = "Can't find browser"
const error = new Error(message)
mockRegisterFn.mockImplementation(() => {
throw error
}) })
// Load service worker like you would in the browser afterAll(() => {
require("../src/browser/register") jest.restoreAllMocks()
})
expect(mockRegisterFn).toHaveBeenCalled() it("should log an error to the console", () => {
expect(loggerModule.logger.error).toHaveBeenCalled() // Load service worker like you would in the browser
expect(loggerModule.logger.error).toHaveBeenCalledTimes(1) require("../src/browser/register")
expect(loggerModule.logger.error).toHaveBeenCalledWith( expect(spy).toHaveBeenCalled()
`[Service Worker] registration: ${error.message} ${error.stack}`, expect(spy).toHaveBeenCalledTimes(1)
) expect(spy).toHaveBeenCalledWith("[Service Worker] navigator is undefined")
})
}) })
}) })