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.
- package/dist-es/PublicHelpers.d.ts +1 -1
- package/dist-es/PublicHelpers.js +24 -7
- package/dist-es/PublicHelpers.js.map +1 -1
- package/dist-es/SocketBase.js +13 -11
- package/dist-es/SocketBase.js.map +1 -1
- package/dist-es/SocketRequestHandler.js +3 -5
- package/dist-es/SocketRequestHandler.js.map +1 -1
- package/dist-es/SocketSubscriptionHandler.js +9 -5
- package/dist-es/SocketSubscriptionHandler.js.map +1 -1
- package/dist-es/tests/mocks/index.d.ts +3 -0
- package/dist-es/tests/mocks/index.js +4 -0
- package/dist-es/tests/mocks/index.js.map +1 -0
- package/dist-es/tests/mocks/mock-data.d.ts +54 -0
- package/dist-es/tests/mocks/mock-data.js +34 -0
- package/dist-es/tests/mocks/mock-data.js.map +1 -0
- package/dist-es/tests/mocks/mock-server.d.ts +43 -0
- package/dist-es/tests/mocks/mock-server.js +163 -0
- package/dist-es/tests/mocks/mock-server.js.map +1 -0
- package/dist-es/tests/mocks/mock-socket.d.ts +24 -0
- package/dist-es/tests/mocks/mock-socket.js +35 -0
- package/dist-es/tests/mocks/mock-socket.js.map +1 -0
- package/dist-es/tests/test-utils.d.ts +8 -0
- package/dist-es/tests/test-utils.js +28 -0
- package/dist-es/tests/test-utils.js.map +1 -0
- package/dist-es/types/public_helpers.d.ts +12 -3
- package/dist-es/types/public_helpers_internal.d.ts +4 -4
- package/dist-es/types/socket.d.ts +1 -0
- package/dist-es/types/subscriptions.d.ts +1 -1
- package/package.json +10 -7
- package/src/PublicHelpers.ts +25 -7
- package/src/SocketBase.ts +15 -12
- package/src/SocketRequestHandler.ts +3 -5
- package/src/SocketSubscriptionHandler.ts +7 -6
- package/src/tests/Socket.test.ts +129 -111
- package/src/tests/mocks/index.ts +3 -0
- package/src/tests/mocks/mock-data.ts +36 -0
- package/src/tests/mocks/mock-server.ts +276 -0
- package/src/tests/mocks/mock-socket.ts +72 -0
- package/src/tests/public_helpers.test.ts +64 -63
- package/src/tests/test-utils.ts +31 -0
- package/src/types/api_internal.ts +0 -1
- package/src/types/public_helpers.ts +11 -11
- package/src/types/public_helpers_internal.ts +4 -4
- package/src/types/socket.ts +1 -0
- package/src/types/subscriptions.ts +1 -1
- package/tsconfig.json +1 -1
- package/src/tests/helpers.ts +0 -195
package/src/tests/Socket.test.ts
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
import {
|
2
|
-
|
3
|
-
getConnectedSocket, getMockServer, getSocket,
|
4
|
-
|
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
|
-
|
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.
|
56
|
+
server.addRequestHandler('POST', ApiConstants.LOGIN_URL, DEFAULT_AUTH_RESPONSE);
|
39
57
|
const connectedCallback = jest.fn();
|
40
58
|
|
41
|
-
const { socket
|
59
|
+
const { socket } = getMockSocket();
|
42
60
|
socket.onConnected = connectedCallback;
|
43
61
|
const response = await socket.connect();
|
44
62
|
|
45
|
-
expect(connectedCallback).toHaveBeenCalledWith(
|
46
|
-
expect(response).toEqual(
|
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
|
-
|
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
|
79
|
+
const { socket } = getMockSocket();
|
61
80
|
socket.onConnected = connectedCallback;
|
62
81
|
const response = await socket.connectRefreshToken('refresh token');
|
63
82
|
|
64
|
-
expect(connectedCallback).toHaveBeenCalledWith(
|
65
|
-
|
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
|
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 } =
|
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(
|
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 =
|
115
|
-
server.
|
150
|
+
server = getOriginalMockServer();
|
151
|
+
server.addRequestHandler('POST', ApiConstants.LOGIN_URL, DEFAULT_AUTH_RESPONSE);
|
116
152
|
|
117
|
-
await socket.connect(
|
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
|
165
|
+
const { socket } = await getConnectedMockSocket();
|
130
166
|
socket.onSessionReset = sessionResetCallback;
|
131
167
|
socket.onDisconnected = disconnectedCallback;
|
132
168
|
|
133
169
|
// Dummy listener
|
134
|
-
server.
|
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
|
-
|
139
|
-
|
140
|
-
|
141
|
-
});
|
174
|
+
server.ignoreMissingHandler('DELETE', 'dummyLogoutDelete');
|
175
|
+
|
176
|
+
const pendingRequestPromise = defusedPromise(socket.delete('dummyLogoutDelete'));
|
142
177
|
|
143
178
|
// Logout
|
144
|
-
server.
|
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
|
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
|
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
|
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
|
-
|
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 =
|
215
|
-
server.
|
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
|
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
|
293
|
+
const { socket } = await getConnectedMockSocket();
|
262
294
|
|
263
295
|
socket.disconnect();
|
264
296
|
await waitForExpect(() => expect(socket.isActive()).toEqual(false));
|
265
297
|
|
266
|
-
server.
|
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
|
-
|
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
|
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
|
-
|
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
|
359
|
+
const { socket } = await getConnectedMockSocket();
|
336
360
|
|
337
|
-
|
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
|
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
|
397
|
-
server.
|
398
|
-
server.
|
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
|
449
|
+
const { socket } = await getConnectedMockSocket();
|
423
450
|
|
424
|
-
const
|
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(
|
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(
|
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(
|
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
|
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
|
476
|
-
|
477
|
-
|
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
|
512
|
+
const { socket } = await getConnectedMockSocket();
|
492
513
|
let removeListener: SubscriptionRemoveHandler | null = null;
|
493
514
|
|
494
515
|
// Add hook
|
495
516
|
{
|
496
|
-
const
|
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
|
-
|
501
|
-
|
520
|
+
HOOK_MODULE,
|
521
|
+
HOOK_NAME,
|
502
522
|
rejectCallback,
|
503
523
|
hookSubscriberInfo
|
504
524
|
);
|
505
525
|
|
506
|
-
expect((
|
507
|
-
expect(
|
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
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
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
|
-
|
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
|
534
|
-
|
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,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
|
+
}
|