airdcpp-apisocket 3.0.0-beta.1 → 3.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist-es/PublicHelpers.d.ts +1 -1
  2. package/dist-es/PublicHelpers.js +24 -7
  3. package/dist-es/PublicHelpers.js.map +1 -1
  4. package/dist-es/SocketBase.js +13 -11
  5. package/dist-es/SocketBase.js.map +1 -1
  6. package/dist-es/SocketRequestHandler.js +3 -5
  7. package/dist-es/SocketRequestHandler.js.map +1 -1
  8. package/dist-es/SocketSubscriptionHandler.js +9 -5
  9. package/dist-es/SocketSubscriptionHandler.js.map +1 -1
  10. package/dist-es/tests/mocks/index.d.ts +3 -0
  11. package/dist-es/tests/mocks/index.js +4 -0
  12. package/dist-es/tests/mocks/index.js.map +1 -0
  13. package/dist-es/tests/mocks/mock-data.d.ts +54 -0
  14. package/dist-es/tests/mocks/mock-data.js +34 -0
  15. package/dist-es/tests/mocks/mock-data.js.map +1 -0
  16. package/dist-es/tests/mocks/mock-server.d.ts +43 -0
  17. package/dist-es/tests/mocks/mock-server.js +163 -0
  18. package/dist-es/tests/mocks/mock-server.js.map +1 -0
  19. package/dist-es/tests/mocks/mock-socket.d.ts +24 -0
  20. package/dist-es/tests/mocks/mock-socket.js +35 -0
  21. package/dist-es/tests/mocks/mock-socket.js.map +1 -0
  22. package/dist-es/tests/test-utils.d.ts +8 -0
  23. package/dist-es/tests/test-utils.js +28 -0
  24. package/dist-es/tests/test-utils.js.map +1 -0
  25. package/dist-es/types/public_helpers.d.ts +12 -3
  26. package/dist-es/types/public_helpers_internal.d.ts +4 -4
  27. package/dist-es/types/socket.d.ts +1 -0
  28. package/dist-es/types/subscriptions.d.ts +1 -1
  29. package/package.json +10 -7
  30. package/src/PublicHelpers.ts +25 -7
  31. package/src/SocketBase.ts +15 -12
  32. package/src/SocketRequestHandler.ts +3 -5
  33. package/src/SocketSubscriptionHandler.ts +7 -6
  34. package/src/tests/Socket.test.ts +129 -111
  35. package/src/tests/mocks/index.ts +3 -0
  36. package/src/tests/mocks/mock-data.ts +36 -0
  37. package/src/tests/mocks/mock-server.ts +276 -0
  38. package/src/tests/mocks/mock-socket.ts +72 -0
  39. package/src/tests/public_helpers.test.ts +64 -63
  40. package/src/tests/test-utils.ts +31 -0
  41. package/src/types/api_internal.ts +0 -1
  42. package/src/types/public_helpers.ts +11 -11
  43. package/src/types/public_helpers_internal.ts +4 -4
  44. package/src/types/socket.ts +1 -0
  45. package/src/types/subscriptions.ts +1 -1
  46. package/tsconfig.json +1 -1
  47. package/src/tests/helpers.ts +0 -195
@@ -1,7 +1,8 @@
1
1
  import {
2
- AUTH_RESPONSE, CONNECT_PARAMS,
3
- getConnectedSocket, getMockServer, getSocket, waitForExpect
4
- } from './helpers.js';
2
+ DEFAULT_AUTH_RESPONSE, DEFAULT_CONNECT_CREDENTIALS,
3
+ getConnectedSocket as getOriginalConnectedSocket, getMockServer as getOriginalMockServer, getSocket as getOriginalSocket,
4
+ MockConnectedSocketOptions,
5
+ } from './mocks';
5
6
 
6
7
  import ApiConstants from '../ApiConstants.js';
7
8
 
@@ -9,23 +10,23 @@ import { HookCallback, HookSubscriberInfo, SubscriptionRemoveHandler } from '../
9
10
  import { IncomingSubscriptionEvent } from '../types/api_internal.js';
10
11
 
11
12
  import { jest } from '@jest/globals';
12
-
13
- let server: ReturnType<typeof getMockServer>;
13
+ import { defusedPromise, getMockConsole, waitForExpect } from './test-utils.js';
14
14
 
15
15
  const dummyfn = () => {
16
16
  // ..
17
17
  };
18
18
 
19
- const useFakeTimers = () => {
20
- // Mocking performance would cause an error with Node 19, can be removed when using
21
- // the latest version of Jest
22
- jest.useFakeTimers({doNotFake: ['performance']});
23
- };
24
19
 
25
20
  // tslint:disable:no-empty
26
21
  describe('socket', () => {
22
+ let server: ReturnType<typeof getOriginalMockServer>;
23
+ let mockConsole: ReturnType<typeof getMockConsole>;
24
+
27
25
  beforeEach(() => {
28
- server = getMockServer();
26
+ mockConsole = getMockConsole();
27
+ server = getOriginalMockServer({
28
+ mockF: jest,
29
+ });
29
30
  });
30
31
 
31
32
  afterEach(() => {
@@ -33,17 +34,34 @@ describe('socket', () => {
33
34
  jest.useRealTimers();
34
35
  });
35
36
 
37
+ const getDefaultSocketOptions = () => ({
38
+ ...DEFAULT_CONNECT_CREDENTIALS,
39
+ logOutput: mockConsole,
40
+ });
41
+
42
+ const getMockSocket = () => {
43
+ return getOriginalSocket(getDefaultSocketOptions());
44
+ }
45
+
46
+
47
+ const getConnectedMockSocket = (options?: Partial<MockConnectedSocketOptions>) => {
48
+ return getOriginalConnectedSocket(server, {
49
+ socketOptions: getDefaultSocketOptions(),
50
+ ...options,
51
+ });
52
+ }
53
+
36
54
  describe('auth', () => {
37
55
  test('should handle valid credentials', async () => {
38
- server.addDataHandler('POST', ApiConstants.LOGIN_URL, AUTH_RESPONSE);
56
+ server.addRequestHandler('POST', ApiConstants.LOGIN_URL, DEFAULT_AUTH_RESPONSE);
39
57
  const connectedCallback = jest.fn();
40
58
 
41
- const { socket, mockConsole } = getSocket();
59
+ const { socket } = getMockSocket();
42
60
  socket.onConnected = connectedCallback;
43
61
  const response = await socket.connect();
44
62
 
45
- expect(connectedCallback).toHaveBeenCalledWith(AUTH_RESPONSE);
46
- expect(response).toEqual(AUTH_RESPONSE);
63
+ expect(connectedCallback).toHaveBeenCalledWith(DEFAULT_AUTH_RESPONSE);
64
+ expect(response).toEqual(DEFAULT_AUTH_RESPONSE);
47
65
  expect(socket.isConnected()).toEqual(true);
48
66
 
49
67
  expect(mockConsole.warn.mock.calls.length).toBe(0);
@@ -54,15 +72,32 @@ describe('socket', () => {
54
72
  });
55
73
 
56
74
  test('should handle valid refresh token', async () => {
57
- server.addDataHandler('POST', ApiConstants.LOGIN_URL, AUTH_RESPONSE);
75
+ const onAuth = jest.fn();
76
+ server.addRequestHandler('POST', ApiConstants.LOGIN_URL, DEFAULT_AUTH_RESPONSE, onAuth);
58
77
  const connectedCallback = jest.fn();
59
78
 
60
- const { socket, mockConsole } = getSocket();
79
+ const { socket } = getMockSocket();
61
80
  socket.onConnected = connectedCallback;
62
81
  const response = await socket.connectRefreshToken('refresh token');
63
82
 
64
- expect(connectedCallback).toHaveBeenCalledWith(AUTH_RESPONSE);
65
- expect(response).toEqual(AUTH_RESPONSE);
83
+ expect(connectedCallback).toHaveBeenCalledWith(DEFAULT_AUTH_RESPONSE);
84
+
85
+ expect(onAuth).toHaveBeenCalled();
86
+ expect(onAuth.mock.calls[0]).toMatchInlineSnapshot(`
87
+ [
88
+ {
89
+ "callback_id": 1,
90
+ "data": {
91
+ "grant_type": "refresh_token",
92
+ "refresh_token": "refresh token",
93
+ },
94
+ "method": "POST",
95
+ "path": "sessions/authorize",
96
+ },
97
+ ]
98
+ `);
99
+
100
+ expect(response).toEqual(DEFAULT_AUTH_RESPONSE);
66
101
  expect(socket.isConnected()).toEqual(true);
67
102
 
68
103
  expect(mockConsole.warn.mock.calls.length).toBe(0);
@@ -75,7 +110,7 @@ describe('socket', () => {
75
110
  test('should handle invalid credentials', async () => {
76
111
  server.addErrorHandler('POST', ApiConstants.LOGIN_URL, 'Invalid username or password', 401);
77
112
 
78
- const { socket, mockConsole } = getSocket();
113
+ const { socket } = getMockSocket();
79
114
  let error;
80
115
 
81
116
  try {
@@ -94,7 +129,8 @@ describe('socket', () => {
94
129
 
95
130
  test('should handle connect with custom credentials', async () => {
96
131
  server.stop();
97
- const { socket } = getSocket({
132
+ const { socket } = getOriginalSocket({
133
+ ...getDefaultSocketOptions(),
98
134
  username: 'dummy',
99
135
  password: 'dummy',
100
136
  });
@@ -102,7 +138,7 @@ describe('socket', () => {
102
138
  // Fail without a server handler with auto reconnect disabled
103
139
  let error;
104
140
  try {
105
- await socket.connect(CONNECT_PARAMS.username, CONNECT_PARAMS.password, false);
141
+ await socket.connect(DEFAULT_CONNECT_CREDENTIALS.username, DEFAULT_CONNECT_CREDENTIALS.password, false);
106
142
  } catch (e) {
107
143
  error = e;
108
144
  }
@@ -111,10 +147,10 @@ describe('socket', () => {
111
147
  await waitForExpect(() => expect(socket.isActive()).toEqual(false));
112
148
 
113
149
  // Valid connect attempt
114
- server = getMockServer();
115
- server.addDataHandler('POST', ApiConstants.LOGIN_URL, AUTH_RESPONSE);
150
+ server = getOriginalMockServer();
151
+ server.addRequestHandler('POST', ApiConstants.LOGIN_URL, DEFAULT_AUTH_RESPONSE);
116
152
 
117
- await socket.connect(CONNECT_PARAMS.username, CONNECT_PARAMS.password, false);
153
+ await socket.connect(DEFAULT_CONNECT_CREDENTIALS.username, DEFAULT_CONNECT_CREDENTIALS.password, false);
118
154
 
119
155
  expect(socket.isConnected()).toEqual(true);
120
156
 
@@ -126,27 +162,28 @@ describe('socket', () => {
126
162
  const sessionResetCallback = jest.fn();
127
163
  const disconnectedCallback = jest.fn();
128
164
 
129
- const { socket, mockConsole } = await getConnectedSocket(server);
165
+ const { socket } = await getConnectedMockSocket();
130
166
  socket.onSessionReset = sessionResetCallback;
131
167
  socket.onDisconnected = disconnectedCallback;
132
168
 
133
169
  // Dummy listener
134
- server.addDataHandler('POST', 'hubs/listeners/hub_updated', undefined);
170
+ server.addRequestHandler('POST', 'hubs/listeners/hub_updated', undefined);
135
171
  await socket.addListener('hubs', 'hub_updated', dummyfn);
136
172
 
137
173
  // Dummy pending request
138
- socket.delete('dummyLogoutDelete').catch((error: Error) => {
139
- // TODO: fix, too unreliable at the moment (depends on the timings)
140
- //expect(error.message).toEqual('Socket disconnected');
141
- });
174
+ server.ignoreMissingHandler('DELETE', 'dummyLogoutDelete');
175
+
176
+ const pendingRequestPromise = defusedPromise(socket.delete('dummyLogoutDelete'));
142
177
 
143
178
  // Logout
144
- server.addDataHandler('DELETE', ApiConstants.LOGOUT_URL);
179
+ server.addRequestHandler('DELETE', ApiConstants.LOGOUT_URL);
145
180
  await socket.logout();
146
181
 
147
182
  expect(sessionResetCallback.mock.calls.length).toBe(1);
148
183
  await waitForExpect(() => expect(disconnectedCallback.mock.calls.length).toBe(1));
149
184
 
185
+ await expect(pendingRequestPromise).rejects.toMatchInlineSnapshot(`"Socket disconnected"`);
186
+
150
187
  expect(socket.isActive()).toEqual(false);
151
188
  expect(socket.hasListeners()).toEqual(false);
152
189
  expect(socket.getPendingRequestCount()).toEqual(0);
@@ -158,7 +195,7 @@ describe('socket', () => {
158
195
 
159
196
  describe('disconnect', () => {
160
197
  test('should handle disconnect', async () => {
161
- const { socket, mockConsole } = await getConnectedSocket(server);
198
+ const { socket } = await getConnectedMockSocket();
162
199
 
163
200
  socket.disconnect();
164
201
 
@@ -170,16 +207,16 @@ describe('socket', () => {
170
207
  });
171
208
 
172
209
  test('should handle wait disconnected timeout', async () => {
173
- const { socket, mockConsole } = await getConnectedSocket(server);
210
+ const { socket } = await getConnectedMockSocket();
174
211
 
175
- let error;
212
+ let error: Error | null = null;
176
213
  try {
177
214
  await socket.waitDisconnected(50);
178
215
  } catch (e) {
179
216
  error = e;
180
217
  }
181
218
 
182
- expect(error).toEqual('Socket disconnect timed out');
219
+ expect(error?.message).toEqual('Socket disconnect timed out');
183
220
 
184
221
  expect(mockConsole.error.mock.calls.length).toBe(1);
185
222
  expect(mockConsole.warn.mock.calls.length).toBe(0);
@@ -191,19 +228,14 @@ describe('socket', () => {
191
228
 
192
229
  describe('reconnect', () => {
193
230
  test('should handle auto reconnect', async () => {
194
- const { socket, mockConsole } = await getConnectedSocket(server);
231
+ const { socket } = await getConnectedMockSocket();
195
232
 
196
- useFakeTimers();
233
+ jest.useFakeTimers();
197
234
 
198
235
  socket.disconnect(true);
199
236
  jest.runOnlyPendingTimers();
200
237
 
201
- // TODO: fix
202
- /*{
203
- const waitForExpectTask = await waitForExpect(() => expect(socket.isActive()).toEqual(false));
204
- jest.advanceTimersByTime(1000);
205
- await waitForExpectTask;
206
- }*/
238
+ expect(socket.isActive()).toEqual(false);
207
239
 
208
240
  // Let it fail once
209
241
  server.stop();
@@ -211,8 +243,8 @@ describe('socket', () => {
211
243
  jest.runOnlyPendingTimers();
212
244
  expect(mockConsole.error.mock.calls.length).toBe(1);
213
245
 
214
- server = getMockServer();
215
- server.addDataHandler('POST', ApiConstants.CONNECT_URL, undefined);
246
+ server = getOriginalMockServer();
247
+ server.addRequestHandler('POST', ApiConstants.CONNECT_URL, undefined);
216
248
  jest.runOnlyPendingTimers();
217
249
  jest.runOnlyPendingTimers();
218
250
  jest.runOnlyPendingTimers();
@@ -232,9 +264,9 @@ describe('socket', () => {
232
264
  });
233
265
 
234
266
  test('should cancel auto reconnect', async () => {
235
- const { socket, mockConsole } = await getConnectedSocket(server);
267
+ const { socket } = await getConnectedMockSocket();
236
268
 
237
- useFakeTimers();
269
+ jest.useFakeTimers();
238
270
 
239
271
  // Disconnect with auto reconnect
240
272
  socket.disconnect(true);
@@ -258,12 +290,12 @@ describe('socket', () => {
258
290
  });
259
291
 
260
292
  test('should handle manual reconnect', async () => {
261
- const { socket, mockConsole } = await getConnectedSocket(server);
293
+ const { socket } = await getConnectedMockSocket();
262
294
 
263
295
  socket.disconnect();
264
296
  await waitForExpect(() => expect(socket.isActive()).toEqual(false));
265
297
 
266
- server.addDataHandler('POST', ApiConstants.CONNECT_URL, undefined);
298
+ server.addRequestHandler('POST', ApiConstants.CONNECT_URL, undefined);
267
299
  await socket.reconnect();
268
300
  expect(socket.isConnected()).toEqual(true);
269
301
 
@@ -274,39 +306,31 @@ describe('socket', () => {
274
306
  await waitForExpect(() => expect(socket.isActive()).toEqual(false));
275
307
  });
276
308
 
277
- // TODO: fix
278
- test.skip('should re-authenticate on lost session', async () => {
309
+ test('should re-authenticate on lost session', async () => {
279
310
  const ErrorResponse = 'Invalid session token';
311
+ const authCallback = jest.fn();
312
+ const connectErrorCallback = jest.fn();
280
313
 
281
314
  // Connect and disconnect
282
- const { socket, mockConsole } = await getConnectedSocket(server);
315
+ const { socket } = await getConnectedMockSocket({
316
+ authCallback,
317
+ });
283
318
 
284
- useFakeTimers();
319
+ jest.useFakeTimers();
285
320
  socket.disconnect();
286
321
  jest.runOnlyPendingTimers();
287
322
  expect(socket.isActive()).toEqual(false);
288
323
 
289
324
  // Fail the initial reconnect attempt with 'Invalid session token'
290
325
  // and connect with credentials afterwards
291
- server.addErrorHandler('POST', ApiConstants.CONNECT_URL, ErrorResponse, 400);
292
-
293
- const authCallback = jest.fn();
294
- server.addDataHandler('POST', ApiConstants.LOGIN_URL, AUTH_RESPONSE, authCallback);
326
+ server.addErrorHandler('POST', ApiConstants.CONNECT_URL, ErrorResponse, 400, connectErrorCallback);
295
327
 
296
328
  jest.runOnlyPendingTimers();
297
329
  socket.reconnect();
298
330
 
299
- {
300
- const waitForExpectTask = waitForExpect(
301
- () => {
302
- jest.runOnlyPendingTimers();
303
- expect(authCallback.mock.calls.length).toBe(1);
304
- }
305
- );
306
-
307
- jest.advanceTimersByTime(1000);
308
- await waitForExpectTask;
309
- }
331
+ await jest.advanceTimersByTimeAsync(1000);
332
+ expect(authCallback.mock.calls.length).toBe(2);
333
+ expect(connectErrorCallback.mock.calls.length).toBe(1);
310
334
 
311
335
  expect(socket.isConnected()).toEqual(true);
312
336
  expect(mockConsole.error.mock.calls.length).toBe(0);
@@ -332,9 +356,12 @@ describe('socket', () => {
332
356
 
333
357
  describe('requests', () => {
334
358
  test('should report request timeouts', async () => {
335
- const { socket, mockConsole } = await getConnectedSocket(server);
359
+ const { socket } = await getConnectedMockSocket();
336
360
 
337
- useFakeTimers();
361
+ server.ignoreMissingHandler('POST', 'hubs/listeners/hub_updated');
362
+ server.ignoreMissingHandler('POST', 'hubs/listeners/hub_added');
363
+
364
+ jest.useFakeTimers();
338
365
  socket.addListener('hubs', 'hub_updated', dummyfn)
339
366
  .catch(() => {});
340
367
  socket.addListener('hubs', 'hub_added', dummyfn)
@@ -359,7 +386,7 @@ describe('socket', () => {
359
386
  });
360
387
 
361
388
  test('should handle missing error messages', async () => {
362
- const { socket } = await getConnectedSocket(server);
389
+ const { socket } = await getConnectedMockSocket();
363
390
 
364
391
  server.addErrorHandler('POST', 'test/test', null, 401);
365
392
 
@@ -393,9 +420,9 @@ describe('socket', () => {
393
420
  };
394
421
 
395
422
  test('should handle listener messages', async () => {
396
- const { socket, mockConsole } = await getConnectedSocket(server);
397
- server.addDataHandler('POST', 'hubs/listeners/hub_updated', undefined);
398
- server.addDataHandler('POST', `hubs/${entityId}/listeners/hub_updated`, undefined);
423
+ const { socket } = await getConnectedMockSocket();
424
+ server.addSubscriptionHandler('hubs', 'hub_updated');
425
+ server.addSubscriptionHandler('hubs', 'hub_updated', entityId);
399
426
 
400
427
  const commonSubscriptionCallback = jest.fn();
401
428
  const entitySubscriptionCallback = jest.fn();
@@ -419,10 +446,9 @@ describe('socket', () => {
419
446
  });
420
447
 
421
448
  test('should handle listener removal', async () => {
422
- const { socket, mockConsole } = await getConnectedSocket(server);
449
+ const { socket } = await getConnectedMockSocket();
423
450
 
424
- const subscribeCallback = jest.fn();
425
- server.addDataHandler('POST', 'hubs/listeners/hub_updated', undefined, subscribeCallback);
451
+ const hubUpdatedListener = server.addSubscriptionHandler('hubs', 'hub_updated');
426
452
 
427
453
  // Add two simultaneous pending add events
428
454
  const p1 = socket.addListener('hubs', 'hub_updated', dummyfn);
@@ -434,17 +460,14 @@ describe('socket', () => {
434
460
  const removeListener1 = await p1;
435
461
  const removeListener2 = await p2;
436
462
 
437
- expect(subscribeCallback.mock.calls.length).toBe(1);
463
+ expect(hubUpdatedListener.subscribeFn.mock.calls.length).toBe(1);
438
464
  expect(socket.getPendingSubscriptionCount()).toBe(0);
439
465
 
440
- const deleteCallback = jest.fn();
441
- server.addDataHandler('DELETE', 'hubs/listeners/hub_updated', undefined, deleteCallback);
442
-
443
466
  removeListener1();
444
- expect(deleteCallback.mock.calls.length).toBe(0); // Shouldn't call API yet, still one left
467
+ expect(hubUpdatedListener.unsubscribeFn.mock.calls.length).toBe(0); // Shouldn't call API yet, still one left
445
468
 
446
- removeListener2();
447
- await waitForExpect(() => expect(deleteCallback.mock.calls.length).toBe(1));
469
+ await removeListener2();
470
+ await waitForExpect(() => expect(hubUpdatedListener.unsubscribeFn.mock.calls.length).toBe(1));
448
471
 
449
472
  expect(socket.hasListeners()).toBe(false);
450
473
 
@@ -455,7 +478,7 @@ describe('socket', () => {
455
478
  });
456
479
 
457
480
  test('should handle view updates', async () => {
458
- const { socket, mockConsole } = await getConnectedSocket(server);
481
+ const { socket } = await getConnectedMockSocket();
459
482
  const viewUpdateCallback = jest.fn();
460
483
 
461
484
  const removeListener = socket.addViewUpdateListener('hub_user_view', viewUpdateCallback, entityId);
@@ -472,11 +495,9 @@ describe('socket', () => {
472
495
  });
473
496
 
474
497
  describe('hooks', () => {
475
- const hookEventData: IncomingSubscriptionEvent = {
476
- event: 'queue_bundle_finished_hook',
477
- data: {},
478
- completion_id: 1,
479
- };
498
+ const HOOK_MODULE = 'queue';
499
+ const HOOK_NAME = 'queue_bundle_finished_hook';
500
+ const HOOK_COMPLETION_ID = 1;
480
501
 
481
502
  const hookSubscriberInfo: HookSubscriberInfo = {
482
503
  id: 'sfv_checker',
@@ -488,38 +509,32 @@ describe('socket', () => {
488
509
  };
489
510
 
490
511
  test('should handle hook actions', async () => {
491
- const { socket, mockConsole } = await getConnectedSocket(server);
512
+ const { socket } = await getConnectedMockSocket();
492
513
  let removeListener: SubscriptionRemoveHandler | null = null;
493
514
 
494
515
  // Add hook
495
516
  {
496
- const hookAddCallback = jest.fn();
497
- server.addDataHandler('POST', 'queue/hooks/queue_bundle_finished_hook', undefined, hookAddCallback);
517
+ const hook = server.addHookHandler(HOOK_MODULE, HOOK_NAME);
498
518
 
499
519
  removeListener = await socket.addHook(
500
- 'queue',
501
- 'queue_bundle_finished_hook',
520
+ HOOK_MODULE,
521
+ HOOK_NAME,
502
522
  rejectCallback,
503
523
  hookSubscriberInfo
504
524
  );
505
525
 
506
- expect((hookAddCallback.mock.calls[0][0] as any).data).toEqual(hookSubscriberInfo);
507
- expect(hookAddCallback.mock.calls.length).toBe(1);
508
- }
526
+ expect((hook.subscribeFn.mock.calls[0][0] as any).data).toEqual(hookSubscriberInfo);
527
+ expect(hook.subscribeFn.mock.calls.length).toBe(1);
509
528
 
510
- // Simulate action
511
- {
512
- const hookEventCallback = jest.fn();
513
- server.addDataHandler('POST', 'queue/hooks/queue_bundle_finished_hook/1/reject', undefined, hookEventCallback);
514
- server.send(hookEventData);
515
- await waitForExpect(() => expect(hookEventCallback.mock.calls.length).toBe(1));
529
+ // Simulate action
530
+ const hookResolver = hook.addResolver(HOOK_COMPLETION_ID);
531
+ hookResolver.fire({});
532
+ await waitForExpect(() => expect(hookResolver.rejectFn.mock.calls.length).toBe(1));
516
533
  }
517
534
 
518
535
  // Clean up
519
- {
520
- removeListener();
521
- expect(socket.hasListeners()).toBe(false);
522
- }
536
+ await removeListener();
537
+ expect(socket.hasListeners()).toBe(false);
523
538
 
524
539
  expect(mockConsole.warn.mock.calls.length).toBe(0);
525
540
 
@@ -530,8 +545,11 @@ describe('socket', () => {
530
545
 
531
546
  describe('logging', () => {
532
547
  const connect = async (logLevel: string) => {
533
- const { socket, mockConsole } = await getConnectedSocket(server, {
534
- logLevel,
548
+ const { socket } = await getOriginalConnectedSocket(server, {
549
+ socketOptions: {
550
+ logLevel,
551
+ ...getDefaultSocketOptions(),
552
+ },
535
553
  });
536
554
 
537
555
  socket.disconnect(true);
@@ -0,0 +1,3 @@
1
+ export * from './mock-data.js';
2
+ export * from './mock-server.js';
3
+ export * from './mock-socket.js';
@@ -0,0 +1,36 @@
1
+ export const MOCK_SERVER_URL = 'ws://localhost:7171/api/v1/';
2
+
3
+ export const DEFAULT_CONNECT_CREDENTIALS = {
4
+ username: 'test',
5
+ password: 'test',
6
+ };
7
+
8
+ export const DEFAULT_CONNECT_RESPONSE = {
9
+ session_id: 1,
10
+ auth_token: 'b823187f-4aab-4b71-9764-e63e88401a26',
11
+ token_type: 'Bearer',
12
+ user: {
13
+ permissions: [ 'admin' ],
14
+ username: 'test',
15
+ active_sessions: 1,
16
+ last_login: 0,
17
+ },
18
+ system_info: {
19
+ api_version: 1,
20
+ api_feature_level: 0,
21
+ cid: 'AHLUODI2YZ2U7FDWMHFNJU65ERGKUN4MH7GW5LY',
22
+ hostname: 'ubuntu-htpc',
23
+ network_type: 'private',
24
+ path_separator: '/',
25
+ platform: 'other',
26
+ language: 'fi',
27
+ client_started: 1483972366,
28
+ client_version: 'AirDC++w 2.14.0b-39-g3af3 x86_64',
29
+ },
30
+ wizard_pending: false,
31
+ };
32
+
33
+ export const DEFAULT_AUTH_RESPONSE = {
34
+ ...DEFAULT_CONNECT_RESPONSE,
35
+ refresh_token: '5124faasf-4aab-4b71-9764-e63e88401a26',
36
+ }