Skip to content

Commit 1a8bc7b

Browse files
committed
Mock server: allow handlers to be removed, warn when adding duplicate handlers
1 parent 95a7fb5 commit 1a8bc7b

File tree

2 files changed

+53
-29
lines changed

2 files changed

+53
-29
lines changed

src/tests/mocks/mock-data.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export const DEFAULT_CONNECT_RESPONSE = {
2525
platform: 'other',
2626
language: 'fi',
2727
client_started: 1483972366,
28+
client_version: 'AirDC++w 2.14.0b-39-g3af3 x86_64',
2829
},
2930
wizard_pending: false,
3031
};

src/tests/mocks/mock-server.ts

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -54,35 +54,47 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
5454
responseData: MockRequestResponseData<DataT>,
5555
subscriptionCallback?: RequestCallback
5656
) => {
57-
emitter.addListener(
58-
toEmitId(path, method),
59-
(request: OutgoingRequest, s: WebSocket) => {
60-
if (subscriptionCallback) {
61-
subscriptionCallback(request);
62-
}
63-
64-
const data = typeof responseData === 'function' ? responseData(request, s) : responseData;
65-
if (!data ||!data.code) {
66-
throw new Error(`Mock server: response handler for path ${path} must return a status code`);
67-
}
68-
69-
const response: RequestSuccessResponse | RequestErrorResponse = {
70-
callback_id: request.callback_id,
71-
...data,
72-
};
73-
74-
s.send(JSON.stringify(response));
57+
const requestHandler = (request: OutgoingRequest, s: WebSocket) => {
58+
if (subscriptionCallback) {
59+
subscriptionCallback(request);
60+
}
61+
62+
const data = typeof responseData === 'function' ? responseData(request, s) : responseData;
63+
if (!data ||!data.code) {
64+
throw new Error(`Mock server: response handler for path ${path} must return a status code`);
7565
}
66+
67+
const response: RequestSuccessResponse | RequestErrorResponse = {
68+
callback_id: request.callback_id,
69+
...data,
70+
};
71+
72+
s.send(JSON.stringify(response));
73+
};
74+
75+
const emitId = toEmitId(path, method);
76+
emitter.addListener(
77+
emitId,
78+
requestHandler,
7679
);
80+
emitter.setMaxListeners(1);
81+
82+
return () => emitter.removeListener(emitId, requestHandler);
7783
};
7884

7985
const addDummyDataHandler = (method: string, path: string) => {
86+
const handler = (request: OutgoingRequest, s: WebSocket) => {
87+
// Do nothing
88+
};
89+
90+
const emitId = toEmitId(path, method);
8091
emitter.addListener(
81-
toEmitId(path, method),
82-
(request: OutgoingRequest, s: WebSocket) => {
83-
// Do nothing
84-
}
92+
emitId,
93+
handler
8594
);
95+
emitter.setMaxListeners(1);
96+
97+
return () => emitter.removeListener(emitId, handler);
8698
}
8799

88100
const addRequestHandler = <DataT extends object | undefined>(
@@ -96,7 +108,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
96108
code: data ? 200 : 204,
97109
}
98110

99-
addServerHandler<DataT>(
111+
return addServerHandler<DataT>(
100112
method,
101113
path,
102114
handlerData,
@@ -111,7 +123,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
111123
errorCode: number,
112124
subscriptionCallback?: RequestCallback
113125
) => {
114-
addServerHandler(
126+
return addServerHandler(
115127
method,
116128
path,
117129
{
@@ -135,8 +147,8 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
135147

136148
const path = entityId ? `${moduleName}/${entityId}/${type}/${listenerName}` : `${moduleName}/${type}/${listenerName}`;
137149

138-
addRequestHandler('POST', path, undefined, subscribeFn);
139-
addRequestHandler('DELETE', path, undefined, unsubscribeFn);
150+
const subscribeRemove = addRequestHandler('POST', path, undefined, subscribeFn);
151+
const unsubscribeRemove = addRequestHandler('DELETE', path, undefined, unsubscribeFn);
140152

141153
const fire = (data: object, entityId?: string | number) => {
142154
send({
@@ -146,8 +158,14 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
146158
});
147159
}
148160

161+
const remove = () => {
162+
subscribeRemove();
163+
unsubscribeRemove();
164+
};
165+
149166
return {
150167
fire,
168+
remove,
151169

152170
subscribeFn,
153171
unsubscribeFn,
@@ -175,20 +193,25 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
175193
const resolveFn = mockF.fn();
176194
const rejectFn = mockF.fn();
177195

178-
addRequestHandler(
196+
const resolveRemove = addRequestHandler(
179197
'POST',
180198
`${subscriber.path}/${completionId}/resolve`,
181199
undefined,
182200
resolveFn
183201
);
184202

185-
addRequestHandler(
203+
const rejectRemove = addRequestHandler(
186204
'POST',
187205
`${subscriber.path}/${completionId}/reject`,
188206
undefined,
189207
rejectFn
190208
);
191209

210+
const remove = () => {
211+
resolveRemove();
212+
rejectRemove();
213+
}
214+
192215
const fire = (data: object) => {
193216
send({
194217
event: listenerName,
@@ -197,7 +220,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
197220
});
198221
}
199222

200-
return { fire, resolveFn, rejectFn };
223+
return { fire, remove, resolveFn, rejectFn };
201224
};
202225

203226
return {

0 commit comments

Comments
 (0)