|
1 | 1 | import { ConsoleLogger } from '@slack/logger'; |
2 | 2 | import { assert } from 'chai'; |
3 | 3 | import EventEmitter from 'eventemitter3'; |
| 4 | +import proxyquire from 'proxyquire'; |
4 | 5 | import sinon from 'sinon'; |
5 | | - |
6 | | -import { SlackWebSocket } from './SlackWebSocket'; |
| 6 | +proxyquire.noPreserveCache(); |
7 | 7 | import logModule from './logger'; |
8 | 8 |
|
| 9 | +// A slightly spruced up event emitter aiming at mocking out the `ws` library's `WebSocket` class |
| 10 | +class WSMock extends EventEmitter { |
| 11 | + // biome-ignore lint/suspicious/noExplicitAny: event listeners can accept any args |
| 12 | + addEventListener(evt: string, fn: (...args: any[]) => void) { |
| 13 | + this.addListener.call(this, evt, fn); |
| 14 | + } |
| 15 | +} |
| 16 | + |
9 | 17 | describe('SlackWebSocket', () => { |
10 | 18 | const sandbox = sinon.createSandbox(); |
11 | | - |
| 19 | + let SlackWebSocket: typeof import('./SlackWebSocket').SlackWebSocket; |
| 20 | + beforeEach(() => { |
| 21 | + SlackWebSocket = proxyquire.load('./SlackWebSocket', { |
| 22 | + ws: { |
| 23 | + WebSocket: WSMock, |
| 24 | + }, |
| 25 | + }).SlackWebSocket; |
| 26 | + }); |
12 | 27 | afterEach(() => { |
13 | 28 | sandbox.restore(); |
14 | 29 | }); |
@@ -38,4 +53,31 @@ describe('SlackWebSocket', () => { |
38 | 53 | assert.isFalse(logFactory.called); |
39 | 54 | }); |
40 | 55 | }); |
| 56 | + describe('WebSocket event handling', () => { |
| 57 | + it('should call disconnect() if websocket emits an error', async () => { |
| 58 | + // an exposed event emitter pretending its a websocket |
| 59 | + const ws = new WSMock(); |
| 60 | + // mock out the `ws` library and have it return our event emitter mock |
| 61 | + SlackWebSocket = proxyquire.load('./SlackWebSocket', { |
| 62 | + ws: { |
| 63 | + WebSocket: class Fake { |
| 64 | + constructor() { |
| 65 | + // biome-ignore lint/correctness/noConstructorReturn: for test mocking purposes |
| 66 | + return ws; |
| 67 | + } |
| 68 | + }, |
| 69 | + }, |
| 70 | + }).SlackWebSocket; |
| 71 | + const sws = new SlackWebSocket({ |
| 72 | + url: 'whatevs', |
| 73 | + client: new EventEmitter(), |
| 74 | + clientPingTimeoutMS: 1, |
| 75 | + serverPingTimeoutMS: 1, |
| 76 | + }); |
| 77 | + const discStub = sinon.stub(sws, 'disconnect'); |
| 78 | + sws.connect(); |
| 79 | + ws.emit('error', { error: new Error('boom') }); |
| 80 | + sinon.assert.calledOnce(discStub); |
| 81 | + }); |
| 82 | + }); |
41 | 83 | }); |
0 commit comments