From ae54d440187a8cdca6a8abe1403334ca473b76e9 Mon Sep 17 00:00:00 2001 From: Alex Kuznicki Date: Fri, 31 Jan 2025 12:48:36 -0700 Subject: [PATCH] Add optional handlers for websocket error/close events --- test/transports/websocket.test.ts | 175 ++++++++++++++++-------------- 1 file changed, 91 insertions(+), 84 deletions(-) diff --git a/test/transports/websocket.test.ts b/test/transports/websocket.test.ts index 1337da56..127d4af6 100644 --- a/test/transports/websocket.test.ts +++ b/test/transports/websocket.test.ts @@ -5,7 +5,11 @@ import { Server } from 'mock-socket' import { Adapter, AdapterEndpoint } from '../../src/adapter' import { AdapterConfig, EmptyCustomSettings } from '../../src/config' import { metrics as eaMetrics } from '../../src/metrics' -import { WebSocketClassProvider, WebsocketReverseMappingTransport, WebSocketTransport } from '../../src/transports' +import { + WebSocketClassProvider, + WebsocketReverseMappingTransport, + WebSocketTransport, +} from '../../src/transports' import { SingleNumberResultResponse, sleep } from '../../src/util' import { mockWebSocketProvider, runAllUntilTime, TestAdapter } from '../../src/util/testing-utils' import { InputParameters } from '../../src/validation' @@ -884,106 +888,109 @@ test.serial('if defined the close handler is called when the websocket is closed t.true(handlerCalled) }) -test.serial('if defined the error handler is called when the websocket emits an error', async (t) => { - const base = 'ETH' - const quote = 'DOGE' - process.env['METRICS_ENABLED'] = 'false' - let handlerCalled = false +test.serial( + 'if defined the error handler is called when the websocket emits an error', + async (t) => { + const base = 'ETH' + const quote = 'DOGE' + process.env['METRICS_ENABLED'] = 'false' + let handlerCalled = false - // Mock WS - mockWebSocketProvider(WebSocketClassProvider) - const mockWsServer = new Server(ENDPOINT_URL, { mock: false }) - mockWsServer.on('connection', (socket) => { - socket.on('message', () => { - socket.send( - JSON.stringify({ - pair: `${base}/${quote}`, - value: price, - }), - ) + // Mock WS + mockWebSocketProvider(WebSocketClassProvider) + const mockWsServer = new Server(ENDPOINT_URL, { mock: false }) + mockWsServer.on('connection', (socket) => { + socket.on('message', () => { + socket.send( + JSON.stringify({ + pair: `${base}/${quote}`, + value: price, + }), + ) + }) + // Simulate error event after connection + setTimeout(() => { + const errorEvent = new Event('error') + socket.dispatchEvent(errorEvent) + }, 100) }) - // Simulate error event after connection - setTimeout(() => { - const errorEvent = new Event('error') - socket.dispatchEvent(errorEvent) - }, 100) - }) - const transport = new WebSocketTransport({ - url: () => ENDPOINT_URL, - handlers: { - error: async (event) => { - handlerCalled = true - }, - message(message) { - const [curBase, curQuote] = message.pair.split('/') - return [ - { - params: { base: curBase, quote: curQuote }, - response: { - data: { + const transport = new WebSocketTransport({ + url: () => ENDPOINT_URL, + handlers: { + error: async (event) => { + handlerCalled = true + }, + message(message) { + const [curBase, curQuote] = message.pair.split('/') + return [ + { + params: { base: curBase, quote: curQuote }, + response: { + data: { + result: message.value, + }, result: message.value, }, - result: message.value, }, - }, - ] + ] + }, }, - }, - builders: { - subscribeMessage: (params) => ({ - request: 'subscribe', - pair: `${params.base}/${params.quote}`, - }), - unsubscribeMessage: (params) => ({ - request: 'unsubscribe', - pair: `${params.base}/${params.quote}`, - }), - }, - }) + builders: { + subscribeMessage: (params) => ({ + request: 'subscribe', + pair: `${params.base}/${params.quote}`, + }), + unsubscribeMessage: (params) => ({ + request: 'unsubscribe', + pair: `${params.base}/${params.quote}`, + }), + }, + }) - const webSocketEndpoint = new AdapterEndpoint({ - name: 'TEST', - transport: transport, - inputParameters, - }) + const webSocketEndpoint = new AdapterEndpoint({ + name: 'TEST', + transport: transport, + inputParameters, + }) - const config = new AdapterConfig( - {}, - { - envDefaultOverrides: { - BACKGROUND_EXECUTE_MS_WS, - WS_SUBSCRIPTION_UNRESPONSIVE_TTL: 180_000, + const config = new AdapterConfig( + {}, + { + envDefaultOverrides: { + BACKGROUND_EXECUTE_MS_WS, + WS_SUBSCRIPTION_UNRESPONSIVE_TTL: 180_000, + }, }, - }, - ) + ) - const adapter = new Adapter({ - name: 'TEST', - defaultEndpoint: 'test', - config, - endpoints: [webSocketEndpoint], - }) + const adapter = new Adapter({ + name: 'TEST', + defaultEndpoint: 'test', + config, + endpoints: [webSocketEndpoint], + }) - const testAdapter = await TestAdapter.startWithMockedCache(adapter, t.context) + const testAdapter = await TestAdapter.startWithMockedCache(adapter, t.context) - await testAdapter.startBackgroundExecuteThenGetResponse(t, { - requestData: { base, quote }, - expectedResponse: { - data: { + await testAdapter.startBackgroundExecuteThenGetResponse(t, { + requestData: { base, quote }, + expectedResponse: { + data: { + result: price, + }, result: price, + statusCode: 200, }, - result: price, - statusCode: 200, - }, - }) + }) - await testAdapter.api.close() - mockWsServer.close() - await t.context.clock.runAllAsync() + await testAdapter.api.close() + mockWsServer.close() + await t.context.clock.runAllAsync() - t.true(handlerCalled) -}) + t.true(handlerCalled) + }, +) const createReverseMappingAdapter = ( envDefaultOverrides?: Record,