From e0acb08d94279f2bf30431c188a9d9132d185f08 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Wed, 10 Feb 2021 15:28:29 -0700 Subject: [PATCH 1/2] feat: add basic test for emitter --- test/emitter.test.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 test/emitter.test.ts diff --git a/test/emitter.test.ts b/test/emitter.test.ts new file mode 100644 index 000000000..d3f42af12 --- /dev/null +++ b/test/emitter.test.ts @@ -0,0 +1,52 @@ +import { Emitter } from "../src/common/emitter" + +describe("emitter", () => { + describe("Emitter", () => { + it("should return an Emitter", async () => { + const HELLO_WORLD = "HELLO_WORLD" + const GOODBYE_WORLD = "GOODBYE_WORLD" + const mockCallback = jest.fn(() => "Mock function called") + const mockSecondCallback = jest.fn(() => undefined) + + const emitter = new Emitter<{ event: string; callback: () => void }>() + + const onHelloWorld = ({ event, callback }: { event: string; callback: () => void }): void => { + if (event === HELLO_WORLD) { + callback() + } + } + + const onGoodbyeWorld = ({ event, callback }: { event: string; callback: () => void }): void => { + if (event === GOODBYE_WORLD) { + callback() + } + } + + // Register the onHelloWorld listener + // and the onGoodbyeWorld + emitter.event(onHelloWorld) + emitter.event(onGoodbyeWorld) + + await emitter.emit({ event: HELLO_WORLD, callback: mockCallback }) + + // Double-check that our callback is called only once + expect(mockCallback).toHaveBeenCalled() + expect(mockCallback).toHaveBeenCalledTimes(1) + + await emitter.emit({ event: GOODBYE_WORLD, callback: mockSecondCallback }) + + // Check that it works with multiple listeners + expect(mockSecondCallback).toHaveBeenCalled() + expect(mockSecondCallback).toHaveBeenCalledTimes(1) + + // Dispose of all the listeners + emitter.dispose() + }) + + it.skip("should log an error if something goes wrong", () => { + // not sure how we're going to test this + // need to mock logger + // and then somehow throw or something in the callback + }) + }) +}) From 325a1d8181415459a3531745bae43446252498a7 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Wed, 10 Feb 2021 15:37:43 -0700 Subject: [PATCH 2/2] feat: add test for catching errors in Emitter --- test/emitter.test.ts | 105 ++++++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 36 deletions(-) diff --git a/test/emitter.test.ts b/test/emitter.test.ts index d3f42af12..8ff5106a4 100644 --- a/test/emitter.test.ts +++ b/test/emitter.test.ts @@ -1,52 +1,85 @@ +// 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 { Emitter } from "../src/common/emitter" -describe("emitter", () => { - describe("Emitter", () => { - it("should return an Emitter", async () => { - const HELLO_WORLD = "HELLO_WORLD" - const GOODBYE_WORLD = "GOODBYE_WORLD" - const mockCallback = jest.fn(() => "Mock function called") - const mockSecondCallback = jest.fn(() => undefined) +describe("Emitter", () => { + let spy: jest.SpyInstance - const emitter = new Emitter<{ event: string; callback: () => void }>() + beforeEach(() => { + spy = jest.spyOn(logger, "error") + }) - const onHelloWorld = ({ event, callback }: { event: string; callback: () => void }): void => { - if (event === HELLO_WORLD) { - callback() - } + afterEach(() => { + jest.clearAllMocks() + }) + + afterAll(() => { + jest.restoreAllMocks() + }) + + it("should run the correct callbacks", async () => { + const HELLO_WORLD = "HELLO_WORLD" + const GOODBYE_WORLD = "GOODBYE_WORLD" + const mockCallback = jest.fn(() => "Mock function called") + const mockSecondCallback = jest.fn(() => undefined) + + const emitter = new Emitter<{ event: string; callback: () => void }>() + + const onHelloWorld = ({ event, callback }: { event: string; callback: () => void }): void => { + if (event === HELLO_WORLD) { + callback() } + } - const onGoodbyeWorld = ({ event, callback }: { event: string; callback: () => void }): void => { - if (event === GOODBYE_WORLD) { - callback() - } + const onGoodbyeWorld = ({ event, callback }: { event: string; callback: () => void }): void => { + if (event === GOODBYE_WORLD) { + callback() } + } - // Register the onHelloWorld listener - // and the onGoodbyeWorld - emitter.event(onHelloWorld) - emitter.event(onGoodbyeWorld) + // Register the onHelloWorld listener + // and the onGoodbyeWorld + emitter.event(onHelloWorld) + emitter.event(onGoodbyeWorld) - await emitter.emit({ event: HELLO_WORLD, callback: mockCallback }) + await emitter.emit({ event: HELLO_WORLD, callback: mockCallback }) - // Double-check that our callback is called only once - expect(mockCallback).toHaveBeenCalled() - expect(mockCallback).toHaveBeenCalledTimes(1) + // Double-check that our callback is called only once + expect(mockCallback).toHaveBeenCalled() + expect(mockCallback).toHaveBeenCalledTimes(1) - await emitter.emit({ event: GOODBYE_WORLD, callback: mockSecondCallback }) + await emitter.emit({ event: GOODBYE_WORLD, callback: mockSecondCallback }) - // Check that it works with multiple listeners - expect(mockSecondCallback).toHaveBeenCalled() - expect(mockSecondCallback).toHaveBeenCalledTimes(1) + // Check that it works with multiple listeners + expect(mockSecondCallback).toHaveBeenCalled() + expect(mockSecondCallback).toHaveBeenCalledTimes(1) - // Dispose of all the listeners - emitter.dispose() - }) + // Dispose of all the listeners + emitter.dispose() + }) - it.skip("should log an error if something goes wrong", () => { - // not sure how we're going to test this - // need to mock logger - // and then somehow throw or something in the callback - }) + it("should log an error if something goes wrong", async () => { + const HELLO_WORLD = "HELLO_WORLD" + const mockCallback = jest.fn(() => "Mock function called") + const message = "You don't have access to that folder." + + const emitter = new Emitter<{ event: string; callback: () => void }>() + + const onHelloWorld = ({ event, callback }: { event: string; callback: () => void }): void => { + if (event === HELLO_WORLD) { + callback() + throw new Error(message) + } + } + + emitter.event(onHelloWorld) + + await emitter.emit({ event: HELLO_WORLD, callback: mockCallback }) + + // Check that error was called + expect(spy).toHaveBeenCalled() + expect(spy).toHaveBeenCalledTimes(1) + expect(spy).toHaveBeenCalledWith(message) }) })