feat(register): add test when navigator undefined
This commit is contained in:
parent
e6a324b484
commit
b232dcbd4a
@ -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"
|
||||||
|
|
||||||
|
@ -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")
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user