Skip to content

feat(testing): add unit tests for emitter #2715

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 23, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions test/emitter.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +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", () => {
let spy: jest.SpyInstance

beforeEach(() => {
spy = jest.spyOn(logger, "error")
})

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()
}
}

// 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("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)
})
})