Skip to content

Commit 6b6bf85

Browse files
committed
Mock server: remove existing duplicate handlers when adding new one, clear handlers only after stopping the server
1 parent adf3e03 commit 6b6bf85

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

src/tests/mocks/mock-server.ts

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Client, Server, WebSocket } from 'mock-socket';
22

33
import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '../../types/api_internal.js';
44
import { EventEmitter } from 'events';
5-
import { DEFAULT_CONNECT_PARAMS } from './mock-data.js';
5+
import { MOCK_SERVER_URL } from './mock-data.js';
66

77
interface MockFunctionCreator {
88
fn: (...args: any[]) => any;
@@ -25,7 +25,7 @@ interface MockServerOptions {
2525
}
2626

2727
const DEFAULT_MOCK_SERVER_OPTIONS: MockServerOptions = {
28-
url: DEFAULT_CONNECT_PARAMS.url,
28+
url: MOCK_SERVER_URL,
2929
reportMissingListeners: true,
3030
mockF: getDefaultMockCreatorF(),
3131
}
@@ -43,16 +43,19 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
4343
const mockServer = new Server(url);
4444
let socket: Client;
4545
const emitter = new EventEmitter();
46+
emitter.setMaxListeners(1);
4647

4748
const send = (data: object) => {
4849
socket.send(JSON.stringify(data));
4950
};
5051

52+
const handlers: Map<string, () => any> = new Map();
53+
5154
const addServerHandler = <DataT extends object | undefined>(
5255
method: string,
5356
path: string,
5457
responseData: MockRequestResponseData<DataT>,
55-
subscriptionCallback?: RequestCallback
58+
subscriptionCallback?: RequestCallback,
5659
) => {
5760
const requestHandler = (request: OutgoingRequest, s: WebSocket) => {
5861
if (subscriptionCallback) {
@@ -72,14 +75,21 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
7275
s.send(JSON.stringify(response));
7376
};
7477

78+
// Don't add duplicates
7579
const emitId = toEmitId(path, method);
76-
emitter.addListener(
77-
emitId,
78-
requestHandler,
79-
);
80-
emitter.setMaxListeners(1);
80+
const removeExisting = handlers.get(emitId);
81+
if (removeExisting) {
82+
removeExisting();
83+
handlers.delete(emitId);
84+
}
85+
86+
// Add new
87+
emitter.addListener(emitId, requestHandler);
8188

82-
return () => emitter.removeListener(emitId, requestHandler);
89+
// Prepare for removal
90+
const removeListener = () => emitter.removeListener(emitId, requestHandler);
91+
handlers.set(emitId, removeListener)
92+
return removeListener;
8393
};
8494

8595
const addDummyDataHandler = (method: string, path: string) => {
@@ -244,10 +254,6 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
244254
});
245255
});
246256

247-
mockServer.on('close', () => {
248-
emitter.removeAllListeners();
249-
});
250-
251257
return {
252258
addRequestHandler,
253259
addErrorHandler,
@@ -258,7 +264,8 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
258264
ignoreMissingHandler: addDummyDataHandler,
259265
stop: () => {
260266
mockServer.stop(() => {
261-
// ...
267+
emitter.removeAllListeners();
268+
handlers.clear();
262269
});
263270
},
264271
send,

0 commit comments

Comments
 (0)