airdcpp-apisocket 3.0.0-beta.7 → 3.0.0-beta.9
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/SocketBase.js +5 -2
- package/dist-es/SocketBase.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 +52 -0
- package/dist-es/tests/mocks/mock-data.js +33 -0
- package/dist-es/tests/mocks/mock-data.js.map +1 -0
- package/dist-es/tests/mocks/mock-server.d.ts +39 -0
- package/dist-es/tests/{mock-server.js → mocks/mock-server.js} +16 -79
- package/dist-es/tests/mocks/mock-server.js.map +1 -0
- package/dist-es/tests/mocks/mock-socket.d.ts +23 -0
- package/dist-es/tests/mocks/mock-socket.js +31 -0
- package/dist-es/tests/mocks/mock-socket.js.map +1 -0
- package/dist-es/tests/test-utils.d.ts +6 -0
- package/dist-es/tests/test-utils.js +18 -0
- package/dist-es/tests/test-utils.js.map +1 -1
- package/dist-es/types/socket.d.ts +1 -0
- package/package.json +7 -7
- package/src/SocketBase.ts +6 -2
- package/src/tests/Socket.test.ts +48 -26
- package/src/tests/mocks/index.ts +3 -0
- package/src/tests/mocks/mock-data.ts +35 -0
- package/src/tests/{mock-server.ts → mocks/mock-server.ts} +24 -114
- package/src/tests/mocks/mock-socket.ts +68 -0
- package/src/tests/public_helpers.test.ts +4 -2
- package/src/tests/test-utils.ts +19 -0
- package/src/types/socket.ts +1 -0
- package/dist/ApiConstants.d.ts +0 -6
- package/dist/ApiConstants.js +0 -6
- package/dist/ApiConstants.js.map +0 -1
- package/dist/NodeSocket.d.ts +0 -4
- package/dist/NodeSocket.js +0 -5
- package/dist/NodeSocket.js.map +0 -1
- package/dist/Promise.d.ts +0 -8
- package/dist/Promise.js +0 -25
- package/dist/Promise.js.map +0 -1
- package/dist/PublicHelpers.d.ts +0 -2
- package/dist/PublicHelpers.js +0 -108
- package/dist/PublicHelpers.js.map +0 -1
- package/dist/SocketBase.d.ts +0 -4
- package/dist/SocketBase.js +0 -347
- package/dist/SocketBase.js.map +0 -1
- package/dist/SocketLogger.d.ts +0 -9
- package/dist/SocketLogger.js +0 -69
- package/dist/SocketLogger.js.map +0 -1
- package/dist/SocketRequestHandler.d.ts +0 -14
- package/dist/SocketRequestHandler.js +0 -164
- package/dist/SocketRequestHandler.js.map +0 -1
- package/dist/SocketSubscriptionHandler.d.ts +0 -11
- package/dist/SocketSubscriptionHandler.js +0 -157
- package/dist/SocketSubscriptionHandler.js.map +0 -1
- package/dist/tests/helpers.d.ts +0 -57
- package/dist/tests/helpers.js +0 -127
- package/dist/tests/helpers.js.map +0 -1
- package/dist/types/api.d.ts +0 -30
- package/dist/types/api.js +0 -3
- package/dist/types/api.js.map +0 -1
- package/dist/types/api_internal.d.ts +0 -24
- package/dist/types/api_internal.js +0 -2
- package/dist/types/api_internal.js.map +0 -1
- package/dist/types/index.d.ts +0 -7
- package/dist/types/index.js +0 -8
- package/dist/types/index.js.map +0 -1
- package/dist/types/logger.d.ts +0 -6
- package/dist/types/logger.js +0 -2
- package/dist/types/logger.js.map +0 -1
- package/dist/types/options.d.ts +0 -31
- package/dist/types/options.js +0 -3
- package/dist/types/options.js.map +0 -1
- package/dist/types/public_helpers.d.ts +0 -28
- package/dist/types/public_helpers.js +0 -2
- package/dist/types/public_helpers.js.map +0 -1
- package/dist/types/public_helpers_internal.d.ts +0 -27
- package/dist/types/public_helpers_internal.js +0 -2
- package/dist/types/public_helpers_internal.js.map +0 -1
- package/dist/types/requests.d.ts +0 -14
- package/dist/types/requests.js +0 -2
- package/dist/types/requests.js.map +0 -1
- package/dist/types/socket.d.ts +0 -23
- package/dist/types/socket.js +0 -2
- package/dist/types/socket.js.map +0 -1
- package/dist/types/subscriptions.d.ts +0 -20
- package/dist/types/subscriptions.js +0 -2
- package/dist/types/subscriptions.js.map +0 -1
- package/dist/utils.d.ts +0 -2
- package/dist/utils.js +0 -12
- package/dist/utils.js.map +0 -1
- package/dist-es/tests/mock-server.d.ts +0 -100
- package/dist-es/tests/mock-server.js.map +0 -1
package/src/tests/Socket.test.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import {
|
2
2
|
DEFAULT_AUTH_RESPONSE, DEFAULT_CONNECT_PARAMS,
|
3
|
-
getConnectedSocket, getMockServer, getSocket
|
4
|
-
} from './
|
3
|
+
getConnectedSocket as getOriginalConnectedSocket, getMockServer as getOriginalMockServer, getSocket as getOriginalSocket
|
4
|
+
} from './mocks';
|
5
5
|
|
6
6
|
import ApiConstants from '../ApiConstants.js';
|
7
7
|
|
@@ -9,18 +9,23 @@ import { HookCallback, HookSubscriberInfo, SubscriptionRemoveHandler } from '../
|
|
9
9
|
import { IncomingSubscriptionEvent } from '../types/api_internal.js';
|
10
10
|
|
11
11
|
import { jest } from '@jest/globals';
|
12
|
-
import { defusedPromise, waitForExpect } from './test-utils.js';
|
13
|
-
|
14
|
-
let server: ReturnType<typeof getMockServer>;
|
12
|
+
import { defusedPromise, getMockConsole, waitForExpect } from './test-utils.js';
|
15
13
|
|
16
14
|
const dummyfn = () => {
|
17
15
|
// ..
|
18
16
|
};
|
19
17
|
|
18
|
+
|
20
19
|
// tslint:disable:no-empty
|
21
20
|
describe('socket', () => {
|
21
|
+
let server: ReturnType<typeof getOriginalMockServer>;
|
22
|
+
let mockConsole: ReturnType<typeof getMockConsole>;
|
23
|
+
|
22
24
|
beforeEach(() => {
|
23
|
-
|
25
|
+
mockConsole = getMockConsole();
|
26
|
+
server = getOriginalMockServer({
|
27
|
+
mockF: jest,
|
28
|
+
});
|
24
29
|
});
|
25
30
|
|
26
31
|
afterEach(() => {
|
@@ -28,12 +33,27 @@ describe('socket', () => {
|
|
28
33
|
jest.useRealTimers();
|
29
34
|
});
|
30
35
|
|
36
|
+
const getDefaultSocketOptions = () => ({
|
37
|
+
logOutput: mockConsole,
|
38
|
+
});
|
39
|
+
|
40
|
+
const getMockSocket = () => {
|
41
|
+
return getOriginalSocket(getDefaultSocketOptions());
|
42
|
+
}
|
43
|
+
|
44
|
+
|
45
|
+
const getConnectedMockSocket = () => {
|
46
|
+
return getOriginalConnectedSocket(server, {
|
47
|
+
socketOptions: getDefaultSocketOptions(),
|
48
|
+
});
|
49
|
+
}
|
50
|
+
|
31
51
|
describe('auth', () => {
|
32
52
|
test('should handle valid credentials', async () => {
|
33
53
|
server.addRequestHandler('POST', ApiConstants.LOGIN_URL, DEFAULT_AUTH_RESPONSE);
|
34
54
|
const connectedCallback = jest.fn();
|
35
55
|
|
36
|
-
const { socket
|
56
|
+
const { socket } = getMockSocket();
|
37
57
|
socket.onConnected = connectedCallback;
|
38
58
|
const response = await socket.connect();
|
39
59
|
|
@@ -52,7 +72,7 @@ describe('socket', () => {
|
|
52
72
|
server.addRequestHandler('POST', ApiConstants.LOGIN_URL, DEFAULT_AUTH_RESPONSE);
|
53
73
|
const connectedCallback = jest.fn();
|
54
74
|
|
55
|
-
const { socket
|
75
|
+
const { socket } = getMockSocket();
|
56
76
|
socket.onConnected = connectedCallback;
|
57
77
|
const response = await socket.connectRefreshToken('refresh token');
|
58
78
|
|
@@ -70,7 +90,7 @@ describe('socket', () => {
|
|
70
90
|
test('should handle invalid credentials', async () => {
|
71
91
|
server.addErrorHandler('POST', ApiConstants.LOGIN_URL, 'Invalid username or password', 401);
|
72
92
|
|
73
|
-
const { socket
|
93
|
+
const { socket } = getMockSocket();
|
74
94
|
let error;
|
75
95
|
|
76
96
|
try {
|
@@ -89,9 +109,10 @@ describe('socket', () => {
|
|
89
109
|
|
90
110
|
test('should handle connect with custom credentials', async () => {
|
91
111
|
server.stop();
|
92
|
-
const { socket } =
|
112
|
+
const { socket } = getOriginalSocket({
|
93
113
|
username: 'dummy',
|
94
114
|
password: 'dummy',
|
115
|
+
...getDefaultSocketOptions(),
|
95
116
|
});
|
96
117
|
|
97
118
|
// Fail without a server handler with auto reconnect disabled
|
@@ -106,7 +127,7 @@ describe('socket', () => {
|
|
106
127
|
await waitForExpect(() => expect(socket.isActive()).toEqual(false));
|
107
128
|
|
108
129
|
// Valid connect attempt
|
109
|
-
server =
|
130
|
+
server = getOriginalMockServer();
|
110
131
|
server.addRequestHandler('POST', ApiConstants.LOGIN_URL, DEFAULT_AUTH_RESPONSE);
|
111
132
|
|
112
133
|
await socket.connect(DEFAULT_CONNECT_PARAMS.username, DEFAULT_CONNECT_PARAMS.password, false);
|
@@ -121,7 +142,7 @@ describe('socket', () => {
|
|
121
142
|
const sessionResetCallback = jest.fn();
|
122
143
|
const disconnectedCallback = jest.fn();
|
123
144
|
|
124
|
-
const { socket
|
145
|
+
const { socket } = await getConnectedMockSocket();
|
125
146
|
socket.onSessionReset = sessionResetCallback;
|
126
147
|
socket.onDisconnected = disconnectedCallback;
|
127
148
|
|
@@ -154,7 +175,7 @@ describe('socket', () => {
|
|
154
175
|
|
155
176
|
describe('disconnect', () => {
|
156
177
|
test('should handle disconnect', async () => {
|
157
|
-
const { socket
|
178
|
+
const { socket } = await getConnectedMockSocket();
|
158
179
|
|
159
180
|
socket.disconnect();
|
160
181
|
|
@@ -166,7 +187,7 @@ describe('socket', () => {
|
|
166
187
|
});
|
167
188
|
|
168
189
|
test('should handle wait disconnected timeout', async () => {
|
169
|
-
const { socket
|
190
|
+
const { socket } = await getConnectedMockSocket();
|
170
191
|
|
171
192
|
let error: Error | null = null;
|
172
193
|
try {
|
@@ -187,7 +208,7 @@ describe('socket', () => {
|
|
187
208
|
|
188
209
|
describe('reconnect', () => {
|
189
210
|
test('should handle auto reconnect', async () => {
|
190
|
-
const { socket
|
211
|
+
const { socket } = await getConnectedMockSocket();
|
191
212
|
|
192
213
|
jest.useFakeTimers();
|
193
214
|
|
@@ -202,7 +223,7 @@ describe('socket', () => {
|
|
202
223
|
jest.runOnlyPendingTimers();
|
203
224
|
expect(mockConsole.error.mock.calls.length).toBe(1);
|
204
225
|
|
205
|
-
server =
|
226
|
+
server = getOriginalMockServer();
|
206
227
|
server.addRequestHandler('POST', ApiConstants.CONNECT_URL, undefined);
|
207
228
|
jest.runOnlyPendingTimers();
|
208
229
|
jest.runOnlyPendingTimers();
|
@@ -223,7 +244,7 @@ describe('socket', () => {
|
|
223
244
|
});
|
224
245
|
|
225
246
|
test('should cancel auto reconnect', async () => {
|
226
|
-
const { socket
|
247
|
+
const { socket } = await getConnectedMockSocket();
|
227
248
|
|
228
249
|
jest.useFakeTimers();
|
229
250
|
|
@@ -249,7 +270,7 @@ describe('socket', () => {
|
|
249
270
|
});
|
250
271
|
|
251
272
|
test('should handle manual reconnect', async () => {
|
252
|
-
const { socket
|
273
|
+
const { socket } = await getConnectedMockSocket();
|
253
274
|
|
254
275
|
socket.disconnect();
|
255
276
|
await waitForExpect(() => expect(socket.isActive()).toEqual(false));
|
@@ -271,7 +292,7 @@ describe('socket', () => {
|
|
271
292
|
const connectErrorCallback = jest.fn();
|
272
293
|
|
273
294
|
// Connect and disconnect
|
274
|
-
const { socket
|
295
|
+
const { socket } = await getConnectedMockSocket();
|
275
296
|
|
276
297
|
jest.useFakeTimers();
|
277
298
|
socket.disconnect();
|
@@ -315,7 +336,7 @@ describe('socket', () => {
|
|
315
336
|
|
316
337
|
describe('requests', () => {
|
317
338
|
test('should report request timeouts', async () => {
|
318
|
-
const { socket
|
339
|
+
const { socket } = await getConnectedMockSocket();
|
319
340
|
|
320
341
|
server.ignoreMissingHandler('POST', 'hubs/listeners/hub_updated');
|
321
342
|
server.ignoreMissingHandler('POST', 'hubs/listeners/hub_added');
|
@@ -345,7 +366,7 @@ describe('socket', () => {
|
|
345
366
|
});
|
346
367
|
|
347
368
|
test('should handle missing error messages', async () => {
|
348
|
-
const { socket } = await
|
369
|
+
const { socket } = await getConnectedMockSocket();
|
349
370
|
|
350
371
|
server.addErrorHandler('POST', 'test/test', null, 401);
|
351
372
|
|
@@ -379,7 +400,7 @@ describe('socket', () => {
|
|
379
400
|
};
|
380
401
|
|
381
402
|
test('should handle listener messages', async () => {
|
382
|
-
const { socket
|
403
|
+
const { socket } = await getConnectedMockSocket();
|
383
404
|
server.addSubscriptionHandler('hubs', 'hub_updated');
|
384
405
|
server.addSubscriptionHandler('hubs', 'hub_updated', entityId);
|
385
406
|
|
@@ -405,7 +426,7 @@ describe('socket', () => {
|
|
405
426
|
});
|
406
427
|
|
407
428
|
test('should handle listener removal', async () => {
|
408
|
-
const { socket
|
429
|
+
const { socket } = await getConnectedMockSocket();
|
409
430
|
|
410
431
|
const hubUpdatedListener = server.addSubscriptionHandler('hubs', 'hub_updated');
|
411
432
|
|
@@ -437,7 +458,7 @@ describe('socket', () => {
|
|
437
458
|
});
|
438
459
|
|
439
460
|
test('should handle view updates', async () => {
|
440
|
-
const { socket
|
461
|
+
const { socket } = await getConnectedMockSocket();
|
441
462
|
const viewUpdateCallback = jest.fn();
|
442
463
|
|
443
464
|
const removeListener = socket.addViewUpdateListener('hub_user_view', viewUpdateCallback, entityId);
|
@@ -468,7 +489,7 @@ describe('socket', () => {
|
|
468
489
|
};
|
469
490
|
|
470
491
|
test('should handle hook actions', async () => {
|
471
|
-
const { socket
|
492
|
+
const { socket } = await getConnectedMockSocket();
|
472
493
|
let removeListener: SubscriptionRemoveHandler | null = null;
|
473
494
|
|
474
495
|
// Add hook
|
@@ -504,9 +525,10 @@ describe('socket', () => {
|
|
504
525
|
|
505
526
|
describe('logging', () => {
|
506
527
|
const connect = async (logLevel: string) => {
|
507
|
-
const { socket
|
528
|
+
const { socket } = await getOriginalConnectedSocket(server, {
|
508
529
|
socketOptions: {
|
509
530
|
logLevel,
|
531
|
+
...getDefaultSocketOptions(),
|
510
532
|
},
|
511
533
|
});
|
512
534
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
export const DEFAULT_CONNECT_PARAMS = {
|
3
|
+
username: 'test',
|
4
|
+
password: 'test',
|
5
|
+
url: 'ws://localhost:7171/api/v1/',
|
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
|
+
},
|
29
|
+
wizard_pending: false,
|
30
|
+
};
|
31
|
+
|
32
|
+
export const DEFAULT_AUTH_RESPONSE = {
|
33
|
+
...DEFAULT_CONNECT_RESPONSE,
|
34
|
+
refresh_token: '5124faasf-4aab-4b71-9764-e63e88401a26',
|
35
|
+
}
|
@@ -1,127 +1,33 @@
|
|
1
|
-
import { Socket } from '../NodeSocket.js';
|
2
1
|
import { Client, Server, WebSocket } from 'mock-socket';
|
3
|
-
import { jest } from '@jest/globals';
|
4
2
|
|
5
|
-
import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '
|
6
|
-
import * as Options from '../types/options.js';
|
7
|
-
import ApiConstants from '../ApiConstants.js';
|
3
|
+
import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '../../types/api_internal.js';
|
8
4
|
import { EventEmitter } from 'events';
|
5
|
+
import { DEFAULT_CONNECT_PARAMS } from './mock-data.js';
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
export const getMockConsole = () => ({
|
13
|
-
log: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
|
14
|
-
if (VERBOSE) {
|
15
|
-
console.log(a1, a2, a3, a4);
|
16
|
-
}
|
17
|
-
}),
|
18
|
-
info: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
|
19
|
-
if (VERBOSE) {
|
20
|
-
console.info(a1, a2, a3, a4);
|
21
|
-
}
|
22
|
-
}),
|
23
|
-
warn: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
|
24
|
-
console.warn(a1, a2, a3, a4);
|
25
|
-
}),
|
26
|
-
error: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
|
27
|
-
console.error(a1, a2, a3, a4);
|
28
|
-
}),
|
29
|
-
});
|
30
|
-
|
31
|
-
const DEFAULT_CONNECT_PARAMS = {
|
32
|
-
username: 'test',
|
33
|
-
password: 'test',
|
34
|
-
url: 'ws://localhost:7171/api/v1/',
|
7
|
+
interface MockFunctionCreator {
|
8
|
+
fn: (...args: any[]) => any;
|
35
9
|
};
|
36
10
|
|
37
|
-
|
38
|
-
...DEFAULT_CONNECT_PARAMS,
|
39
|
-
logOutput: mockConsole,
|
40
|
-
logLevel: VERBOSE ? 'verbose' : 'warn',
|
41
|
-
});
|
42
|
-
|
43
|
-
const DEFAULT_AUTH_RESPONSE = {
|
44
|
-
auth_token: 'b823187f-4aab-4b71-9764-e63e88401a26',
|
45
|
-
refresh_token: '5124faasf-4aab-4b71-9764-e63e88401a26',
|
46
|
-
user: {
|
47
|
-
permissions: [ 'admin' ],
|
48
|
-
username: 'test',
|
49
|
-
active_sessions: 1,
|
50
|
-
last_login: 0,
|
51
|
-
},
|
52
|
-
system: {
|
53
|
-
cid: 'AHLUODI2YZ2U7FDWMHFNJU65ERGKUN4MH7GW5LY',
|
54
|
-
hostname: 'ubuntu-htpc',
|
55
|
-
network_type: 'private',
|
56
|
-
path_separator: '/',
|
57
|
-
platform: 'other',
|
58
|
-
language: 'fi',
|
59
|
-
},
|
60
|
-
wizard_pending: false,
|
61
|
-
};
|
62
|
-
|
63
|
-
export type MockSocketOptions = Omit<Options.APISocketOptions, 'username' | 'password' | 'url'> & {
|
64
|
-
username?: string;
|
65
|
-
password?: string;
|
66
|
-
url?: string;
|
67
|
-
};
|
68
|
-
|
69
|
-
const getSocket = (socketOptions: MockSocketOptions = {}, mockConsole = getMockConsole()) => {
|
70
|
-
const socket = Socket(
|
71
|
-
{
|
72
|
-
...getDefaultSocketOptions(mockConsole),
|
73
|
-
...socketOptions,
|
74
|
-
},
|
75
|
-
WebSocket as any
|
76
|
-
);
|
77
|
-
|
78
|
-
return { socket, mockConsole };
|
79
|
-
};
|
80
|
-
|
81
|
-
|
82
|
-
type Callback = (requestData: object) => void;
|
83
|
-
|
84
|
-
interface ConnectOptions {
|
85
|
-
socketOptions?: MockSocketOptions;
|
86
|
-
authCallback?: Callback;
|
87
|
-
authResponse?: object;
|
88
|
-
console?: ReturnType<typeof getMockConsole>;
|
89
|
-
}
|
90
|
-
|
91
|
-
const getDefaultConnectOptions = () => ({
|
92
|
-
console: getMockConsole(),
|
93
|
-
authResponse: DEFAULT_AUTH_RESPONSE,
|
94
|
-
});
|
95
|
-
|
96
|
-
const getConnectedSocket = async (
|
97
|
-
server: ReturnType<typeof getMockServer>,
|
98
|
-
userOptions?: ConnectOptions,
|
99
|
-
) => {
|
100
|
-
const options = {
|
101
|
-
...getDefaultConnectOptions(),
|
102
|
-
...userOptions,
|
103
|
-
};
|
104
|
-
|
105
|
-
server.addRequestHandler('POST', ApiConstants.LOGIN_URL, options.authResponse, options.authCallback);
|
106
|
-
|
107
|
-
const { socket, mockConsole } = getSocket(options.socketOptions, options.console);
|
108
|
-
await socket.connect();
|
109
|
-
|
110
|
-
return { socket, mockConsole };
|
111
|
-
};
|
11
|
+
type RequestCallback = (requestData: object) => void;
|
112
12
|
|
113
13
|
const toEmitId = (path: string, method: string) => {
|
114
14
|
return `${path}_${method}`;
|
115
15
|
};
|
116
16
|
|
17
|
+
const getDefaultMockCreatorF = () => ({
|
18
|
+
fn: () => {},
|
19
|
+
});
|
20
|
+
|
117
21
|
interface MockServerOptions {
|
118
22
|
url: string;
|
119
23
|
reportMissingListeners?: boolean;
|
24
|
+
mockF: MockFunctionCreator;
|
120
25
|
}
|
121
26
|
|
122
27
|
const DEFAULT_MOCK_SERVER_OPTIONS: MockServerOptions = {
|
123
28
|
url: DEFAULT_CONNECT_PARAMS.url,
|
124
29
|
reportMissingListeners: true,
|
30
|
+
mockF: getDefaultMockCreatorF(),
|
125
31
|
}
|
126
32
|
|
127
33
|
type MockRequestResponseDataObject<DataT extends object | undefined> = Omit<RequestSuccessResponse<DataT>, 'callback_id'> | Omit<RequestErrorResponse, 'callback_id'>;
|
@@ -129,7 +35,7 @@ type MockRequestResponseDataHandler<DataT extends object | undefined> = (request
|
|
129
35
|
type MockRequestResponseData<DataT extends object | undefined> = MockRequestResponseDataObject<DataT> | MockRequestResponseDataHandler<DataT>;
|
130
36
|
|
131
37
|
const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
132
|
-
const { url, reportMissingListeners }: MockServerOptions = {
|
38
|
+
const { url, reportMissingListeners, mockF }: MockServerOptions = {
|
133
39
|
...DEFAULT_MOCK_SERVER_OPTIONS,
|
134
40
|
...initialOptions,
|
135
41
|
};
|
@@ -146,7 +52,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
146
52
|
method: string,
|
147
53
|
path: string,
|
148
54
|
responseData: MockRequestResponseData<DataT>,
|
149
|
-
subscriptionCallback?:
|
55
|
+
subscriptionCallback?: RequestCallback
|
150
56
|
) => {
|
151
57
|
emitter.addListener(
|
152
58
|
toEmitId(path, method),
|
@@ -156,6 +62,10 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
156
62
|
}
|
157
63
|
|
158
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
|
+
|
159
69
|
const response: RequestSuccessResponse | RequestErrorResponse = {
|
160
70
|
callback_id: request.callback_id,
|
161
71
|
...data,
|
@@ -179,7 +89,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
179
89
|
method: string,
|
180
90
|
path: string,
|
181
91
|
data?: DataT | MockRequestResponseDataHandler<DataT>,
|
182
|
-
subscriptionCallback?:
|
92
|
+
subscriptionCallback?: RequestCallback
|
183
93
|
) => {
|
184
94
|
const handlerData = typeof data === 'function' ? data : {
|
185
95
|
data,
|
@@ -199,7 +109,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
199
109
|
path: string,
|
200
110
|
errorStr: string | null,
|
201
111
|
errorCode: number,
|
202
|
-
subscriptionCallback?:
|
112
|
+
subscriptionCallback?: RequestCallback
|
203
113
|
) => {
|
204
114
|
addServerHandler(
|
205
115
|
method,
|
@@ -220,8 +130,8 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
220
130
|
listenerName: string,
|
221
131
|
entityId?: string | number,
|
222
132
|
) => {
|
223
|
-
const subscribeFn =
|
224
|
-
const unsubscribeFn =
|
133
|
+
const subscribeFn = mockF.fn();
|
134
|
+
const unsubscribeFn = mockF.fn();
|
225
135
|
|
226
136
|
const path = entityId ? `${moduleName}/${entityId}/${type}/${listenerName}` : `${moduleName}/${type}/${listenerName}`;
|
227
137
|
|
@@ -262,8 +172,8 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
262
172
|
const subscriber = addSubscriptionHandlerImpl(moduleName, 'hooks', listenerName);
|
263
173
|
|
264
174
|
const addResolver = (completionId: number) => {
|
265
|
-
const resolveFn =
|
266
|
-
const rejectFn =
|
175
|
+
const resolveFn = mockF.fn();
|
176
|
+
const rejectFn = mockF.fn();
|
267
177
|
|
268
178
|
addRequestHandler(
|
269
179
|
'POST',
|
@@ -333,4 +243,4 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
333
243
|
};
|
334
244
|
};
|
335
245
|
|
336
|
-
export { getMockServer
|
246
|
+
export { getMockServer };
|
@@ -0,0 +1,68 @@
|
|
1
|
+
import { Socket } from '../../NodeSocket.js';
|
2
|
+
import { WebSocket } from 'mock-socket';
|
3
|
+
|
4
|
+
import * as Options from '../../types/options.js';
|
5
|
+
import ApiConstants from '../../ApiConstants.js';
|
6
|
+
|
7
|
+
import { getMockServer } from './mock-server.js';
|
8
|
+
import { DEFAULT_AUTH_RESPONSE, DEFAULT_CONNECT_PARAMS } from './mock-data.js';
|
9
|
+
|
10
|
+
const getDefaultSocketOptions = (): Options.APISocketOptions => ({
|
11
|
+
...DEFAULT_CONNECT_PARAMS,
|
12
|
+
logOutput: console,
|
13
|
+
logLevel: 'warn',
|
14
|
+
});
|
15
|
+
|
16
|
+
export type MockSocketConnectOptions = Omit<Options.APISocketOptions, 'username' | 'password' | 'url'> & {
|
17
|
+
username?: string;
|
18
|
+
password?: string;
|
19
|
+
url?: string;
|
20
|
+
};
|
21
|
+
|
22
|
+
|
23
|
+
type RequestCallback = (requestData: object) => void;
|
24
|
+
|
25
|
+
interface MockSocketOptions {
|
26
|
+
console: Options.LogOutput;
|
27
|
+
socketOptions?: MockSocketConnectOptions;
|
28
|
+
}
|
29
|
+
|
30
|
+
interface MockConnectedSocketOptions extends MockSocketOptions {
|
31
|
+
authCallback?: RequestCallback;
|
32
|
+
authResponse: object;
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
export const getSocket = (socketOptions: MockSocketConnectOptions = {}) => {
|
37
|
+
const socket = Socket(
|
38
|
+
{
|
39
|
+
...getDefaultSocketOptions(),
|
40
|
+
...socketOptions,
|
41
|
+
},
|
42
|
+
WebSocket as any
|
43
|
+
);
|
44
|
+
|
45
|
+
return { socket };
|
46
|
+
};
|
47
|
+
|
48
|
+
const getDefaultConnectOptions = () => ({
|
49
|
+
console,
|
50
|
+
authResponse: DEFAULT_AUTH_RESPONSE,
|
51
|
+
});
|
52
|
+
|
53
|
+
export const getConnectedSocket = async (
|
54
|
+
server: ReturnType<typeof getMockServer>,
|
55
|
+
userOptions?: Partial<MockConnectedSocketOptions>,
|
56
|
+
) => {
|
57
|
+
const options: MockConnectedSocketOptions = {
|
58
|
+
...getDefaultConnectOptions(),
|
59
|
+
...userOptions,
|
60
|
+
};
|
61
|
+
|
62
|
+
server.addRequestHandler('POST', ApiConstants.LOGIN_URL, options.authResponse, options.authCallback);
|
63
|
+
|
64
|
+
const { socket } = getSocket(options.socketOptions);
|
65
|
+
await socket.connect();
|
66
|
+
|
67
|
+
return { socket };
|
68
|
+
};
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import {
|
2
2
|
getMockServer,
|
3
3
|
getConnectedSocket,
|
4
|
-
} from './
|
4
|
+
} from './mocks';
|
5
5
|
import { waitForExpect } from './test-utils.js';
|
6
6
|
|
7
7
|
import { jest } from '@jest/globals';
|
@@ -17,7 +17,9 @@ let server: ReturnType<typeof getMockServer>;
|
|
17
17
|
describe('public helpers', () => {
|
18
18
|
|
19
19
|
beforeEach(() => {
|
20
|
-
server = getMockServer(
|
20
|
+
server = getMockServer({
|
21
|
+
mockF: jest,
|
22
|
+
});
|
21
23
|
});
|
22
24
|
|
23
25
|
afterEach(() => {
|
package/src/tests/test-utils.ts
CHANGED
@@ -10,3 +10,22 @@ export const defusedPromise = (promise: Promise<any>) => {
|
|
10
10
|
promise.catch(() => {});
|
11
11
|
return promise;
|
12
12
|
}
|
13
|
+
|
14
|
+
export const getMockConsole = (verbose = false) => ({
|
15
|
+
log: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
|
16
|
+
if (verbose) {
|
17
|
+
console.log(a1, a2, a3, a4);
|
18
|
+
}
|
19
|
+
}),
|
20
|
+
info: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
|
21
|
+
if (verbose) {
|
22
|
+
console.info(a1, a2, a3, a4);
|
23
|
+
}
|
24
|
+
}),
|
25
|
+
warn: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
|
26
|
+
console.warn(a1, a2, a3, a4);
|
27
|
+
}),
|
28
|
+
error: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
|
29
|
+
console.error(a1, a2, a3, a4);
|
30
|
+
}),
|
31
|
+
});
|
package/src/types/socket.ts
CHANGED
package/dist/ApiConstants.d.ts
DELETED
package/dist/ApiConstants.js
DELETED
package/dist/ApiConstants.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"ApiConstants.js","sourceRoot":"","sources":["../src/ApiConstants.ts"],"names":[],"mappings":"AAAA,eAAe;IACb,SAAS,EAAE,oBAAoB;IAC/B,WAAW,EAAE,iBAAiB;IAC9B,UAAU,EAAE,eAAe;CAC5B,CAAC"}
|
package/dist/NodeSocket.d.ts
DELETED
package/dist/NodeSocket.js
DELETED
package/dist/NodeSocket.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"NodeSocket.js","sourceRoot":"","sources":["../src/NodeSocket.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAGzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,CAAC"}
|
package/dist/Promise.d.ts
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
export interface PendingResult extends Pick<PromiseConstructor, 'resolve' | 'reject'> {
|
2
|
-
promise: Promise<any>;
|
3
|
-
}
|
4
|
-
export interface AppPromise extends PromiseConstructor {
|
5
|
-
pending: () => PendingResult;
|
6
|
-
}
|
7
|
-
declare const PendingPromise: AppPromise;
|
8
|
-
export default PendingPromise;
|
package/dist/Promise.js
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
// Use native promises when available
|
2
|
-
let AppPromise;
|
3
|
-
if (typeof Promise !== 'undefined') {
|
4
|
-
AppPromise = Promise;
|
5
|
-
}
|
6
|
-
else {
|
7
|
-
AppPromise = require('promise');
|
8
|
-
}
|
9
|
-
function pending() {
|
10
|
-
let resolve, reject;
|
11
|
-
let promise = new AppPromise(function () {
|
12
|
-
resolve = arguments[0];
|
13
|
-
reject = arguments[1];
|
14
|
-
});
|
15
|
-
return {
|
16
|
-
resolve: resolve,
|
17
|
-
reject: reject,
|
18
|
-
promise
|
19
|
-
};
|
20
|
-
}
|
21
|
-
const PendingPromise = Object.assign(AppPromise, {
|
22
|
-
pending
|
23
|
-
});
|
24
|
-
export default PendingPromise;
|
25
|
-
//# sourceMappingURL=Promise.js.map
|
package/dist/Promise.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"Promise.js","sourceRoot":"","sources":["../src/Promise.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,IAAI,UAA8B,CAAC;AACnC,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;IACnC,UAAU,GAAG,OAAO,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAOD,SAAS,OAAO;IACd,IAAI,OAAkC,EAAE,MAAgC,CAAC;IACzE,IAAI,OAAO,GAAG,IAAI,UAAU,CAAC;QAC3B,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,OAAQ;QACjB,MAAM,EAAE,MAAO;QACf,OAAO;KACR,CAAC;AACJ,CAAC;AAMD,MAAM,cAAc,GAAe,MAAM,CAAC,MAAM,CAC9C,UAAU,EACV;IACE,OAAO;CACR,CACF,CAAC;AAEF,eAAe,cAAc,CAAC"}
|