From b232dcbd4a2bd38d2515ad12fbbd3863ac2b172b Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Tue, 23 Feb 2021 16:20:18 -0700 Subject: [PATCH] feat(register): add test when navigator undefined --- test/constants.test.ts | 3 -- test/register.test.ts | 117 +++++++++++++++++++++++++---------------- 2 files changed, 73 insertions(+), 47 deletions(-) diff --git a/test/constants.test.ts b/test/constants.test.ts index 64514981f..0cb33f2f1 100644 --- a/test/constants.test.ts +++ b/test/constants.test.ts @@ -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 { loggerModule } from "./helpers" diff --git a/test/register.test.ts b/test/register.test.ts index dc024697e..4fd00b3dc 100644 --- a/test/register.test.ts +++ b/test/register.test.ts @@ -1,59 +1,88 @@ import { JSDOM } from "jsdom" 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", () => { - 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 + describe("when navigator and serviceWorker are defined", () => { + const mockRegisterFn = jest.fn() - 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", { - value: { - register: mockRegisterFn, - }, + Object.defineProperty(global.navigator, "serviceWorker", { + value: { + 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(() => { - mockRegisterFn.mockClear() - jest.resetModules() - }) + describe("when navigator and serviceWorker are NOT defined", () => { + let spy: jest.SpyInstance - afterAll(() => { - jest.restoreAllMocks() - }) - - 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 + beforeEach(() => { + spy = jest.spyOn(console, "error") }) - // Load service worker like you would in the browser - require("../src/browser/register") + afterAll(() => { + jest.restoreAllMocks() + }) - 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}`, - ) + it("should log an error to the console", () => { + // Load service worker like you would in the browser + require("../src/browser/register") + expect(spy).toHaveBeenCalled() + expect(spy).toHaveBeenCalledTimes(1) + expect(spy).toHaveBeenCalledWith("[Service Worker] navigator is undefined") + }) }) })