airdcpp-apisocket 3.0.0-beta.7 → 3.0.0-beta.8
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/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 +24 -0
- package/dist-es/tests/mocks/mock-data.js +25 -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} +13 -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/package.json +2 -2
- package/src/tests/Socket.test.ts +48 -26
- package/src/tests/mocks/index.ts +3 -0
- package/src/tests/mocks/mock-data.ts +26 -0
- package/src/tests/{mock-server.ts → mocks/mock-server.ts} +20 -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/dist-es/tests/mock-server.d.ts +0 -100
- package/dist-es/tests/mock-server.js.map +0 -1
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tests/mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
export declare const DEFAULT_CONNECT_PARAMS: {
|
2
|
+
username: string;
|
3
|
+
password: string;
|
4
|
+
url: string;
|
5
|
+
};
|
6
|
+
export declare const DEFAULT_AUTH_RESPONSE: {
|
7
|
+
auth_token: string;
|
8
|
+
refresh_token: string;
|
9
|
+
user: {
|
10
|
+
permissions: string[];
|
11
|
+
username: string;
|
12
|
+
active_sessions: number;
|
13
|
+
last_login: number;
|
14
|
+
};
|
15
|
+
system: {
|
16
|
+
cid: string;
|
17
|
+
hostname: string;
|
18
|
+
network_type: string;
|
19
|
+
path_separator: string;
|
20
|
+
platform: string;
|
21
|
+
language: string;
|
22
|
+
};
|
23
|
+
wizard_pending: boolean;
|
24
|
+
};
|
@@ -0,0 +1,25 @@
|
|
1
|
+
export const DEFAULT_CONNECT_PARAMS = {
|
2
|
+
username: 'test',
|
3
|
+
password: 'test',
|
4
|
+
url: 'ws://localhost:7171/api/v1/',
|
5
|
+
};
|
6
|
+
export const DEFAULT_AUTH_RESPONSE = {
|
7
|
+
auth_token: 'b823187f-4aab-4b71-9764-e63e88401a26',
|
8
|
+
refresh_token: '5124faasf-4aab-4b71-9764-e63e88401a26',
|
9
|
+
user: {
|
10
|
+
permissions: ['admin'],
|
11
|
+
username: 'test',
|
12
|
+
active_sessions: 1,
|
13
|
+
last_login: 0,
|
14
|
+
},
|
15
|
+
system: {
|
16
|
+
cid: 'AHLUODI2YZ2U7FDWMHFNJU65ERGKUN4MH7GW5LY',
|
17
|
+
hostname: 'ubuntu-htpc',
|
18
|
+
network_type: 'private',
|
19
|
+
path_separator: '/',
|
20
|
+
platform: 'other',
|
21
|
+
language: 'fi',
|
22
|
+
},
|
23
|
+
wizard_pending: false,
|
24
|
+
};
|
25
|
+
//# sourceMappingURL=mock-data.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"mock-data.js","sourceRoot":"","sources":["../../../src/tests/mocks/mock-data.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,GAAG,EAAE,6BAA6B;CACnC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,sCAAsC;IAClD,aAAa,EAAE,uCAAuC;IACtD,IAAI,EAAE;QACJ,WAAW,EAAE,CAAE,OAAO,CAAE;QACxB,QAAQ,EAAE,MAAM;QAChB,eAAe,EAAE,CAAC;QAClB,UAAU,EAAE,CAAC;KACd;IACD,MAAM,EAAE;QACN,GAAG,EAAE,yCAAyC;QAC9C,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,SAAS;QACvB,cAAc,EAAE,GAAG;QACnB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,IAAI;KACf;IACD,cAAc,EAAE,KAAK;CACtB,CAAC"}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import { WebSocket } from 'mock-socket';
|
2
|
+
import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '../../types/api_internal.js';
|
3
|
+
interface MockFunctionCreator {
|
4
|
+
fn: (...args: any[]) => any;
|
5
|
+
}
|
6
|
+
type RequestCallback = (requestData: object) => void;
|
7
|
+
interface MockServerOptions {
|
8
|
+
url: string;
|
9
|
+
reportMissingListeners?: boolean;
|
10
|
+
mockF: MockFunctionCreator;
|
11
|
+
}
|
12
|
+
type MockRequestResponseDataObject<DataT extends object | undefined> = Omit<RequestSuccessResponse<DataT>, 'callback_id'> | Omit<RequestErrorResponse, 'callback_id'>;
|
13
|
+
type MockRequestResponseDataHandler<DataT extends object | undefined> = (request: OutgoingRequest, s: WebSocket) => MockRequestResponseDataObject<DataT>;
|
14
|
+
declare const getMockServer: (initialOptions?: Partial<MockServerOptions>) => {
|
15
|
+
addRequestHandler: <DataT extends object | undefined>(method: string, path: string, data?: DataT | MockRequestResponseDataHandler<DataT>, subscriptionCallback?: RequestCallback) => void;
|
16
|
+
addErrorHandler: (method: string, path: string, errorStr: string | null, errorCode: number, subscriptionCallback?: RequestCallback) => void;
|
17
|
+
addSubscriptionHandler: (moduleName: string, listenerName: string, entityId?: string | number) => {
|
18
|
+
fire: (data: object, entityId?: string | number) => void;
|
19
|
+
subscribeFn: any;
|
20
|
+
unsubscribeFn: any;
|
21
|
+
path: string;
|
22
|
+
};
|
23
|
+
addHookHandler: (moduleName: string, listenerName: string) => {
|
24
|
+
fire: (data: object, entityId?: string | number) => void;
|
25
|
+
subscribeFn: any;
|
26
|
+
unsubscribeFn: any;
|
27
|
+
path: string;
|
28
|
+
addResolver: (completionId: number) => {
|
29
|
+
fire: (data: object) => void;
|
30
|
+
resolveFn: any;
|
31
|
+
rejectFn: any;
|
32
|
+
};
|
33
|
+
};
|
34
|
+
ignoreMissingHandler: (method: string, path: string) => void;
|
35
|
+
stop: () => void;
|
36
|
+
send: (data: object) => void;
|
37
|
+
url: string;
|
38
|
+
};
|
39
|
+
export { getMockServer };
|
@@ -1,86 +1,20 @@
|
|
1
|
-
import {
|
2
|
-
import { Server, WebSocket } from 'mock-socket';
|
3
|
-
import { jest } from '@jest/globals';
|
4
|
-
import ApiConstants from '../ApiConstants.js';
|
1
|
+
import { Server } from 'mock-socket';
|
5
2
|
import { EventEmitter } from 'events';
|
6
|
-
|
7
|
-
|
8
|
-
log: jest.fn((a1, a2, a3, a4) => {
|
9
|
-
if (VERBOSE) {
|
10
|
-
console.log(a1, a2, a3, a4);
|
11
|
-
}
|
12
|
-
}),
|
13
|
-
info: jest.fn((a1, a2, a3, a4) => {
|
14
|
-
if (VERBOSE) {
|
15
|
-
console.info(a1, a2, a3, a4);
|
16
|
-
}
|
17
|
-
}),
|
18
|
-
warn: jest.fn((a1, a2, a3, a4) => {
|
19
|
-
console.warn(a1, a2, a3, a4);
|
20
|
-
}),
|
21
|
-
error: jest.fn((a1, a2, a3, a4) => {
|
22
|
-
console.error(a1, a2, a3, a4);
|
23
|
-
}),
|
24
|
-
});
|
25
|
-
const DEFAULT_CONNECT_PARAMS = {
|
26
|
-
username: 'test',
|
27
|
-
password: 'test',
|
28
|
-
url: 'ws://localhost:7171/api/v1/',
|
29
|
-
};
|
30
|
-
const getDefaultSocketOptions = (mockConsole) => ({
|
31
|
-
...DEFAULT_CONNECT_PARAMS,
|
32
|
-
logOutput: mockConsole,
|
33
|
-
logLevel: VERBOSE ? 'verbose' : 'warn',
|
34
|
-
});
|
35
|
-
const DEFAULT_AUTH_RESPONSE = {
|
36
|
-
auth_token: 'b823187f-4aab-4b71-9764-e63e88401a26',
|
37
|
-
refresh_token: '5124faasf-4aab-4b71-9764-e63e88401a26',
|
38
|
-
user: {
|
39
|
-
permissions: ['admin'],
|
40
|
-
username: 'test',
|
41
|
-
active_sessions: 1,
|
42
|
-
last_login: 0,
|
43
|
-
},
|
44
|
-
system: {
|
45
|
-
cid: 'AHLUODI2YZ2U7FDWMHFNJU65ERGKUN4MH7GW5LY',
|
46
|
-
hostname: 'ubuntu-htpc',
|
47
|
-
network_type: 'private',
|
48
|
-
path_separator: '/',
|
49
|
-
platform: 'other',
|
50
|
-
language: 'fi',
|
51
|
-
},
|
52
|
-
wizard_pending: false,
|
53
|
-
};
|
54
|
-
const getSocket = (socketOptions = {}, mockConsole = getMockConsole()) => {
|
55
|
-
const socket = Socket({
|
56
|
-
...getDefaultSocketOptions(mockConsole),
|
57
|
-
...socketOptions,
|
58
|
-
}, WebSocket);
|
59
|
-
return { socket, mockConsole };
|
60
|
-
};
|
61
|
-
const getDefaultConnectOptions = () => ({
|
62
|
-
console: getMockConsole(),
|
63
|
-
authResponse: DEFAULT_AUTH_RESPONSE,
|
64
|
-
});
|
65
|
-
const getConnectedSocket = async (server, userOptions) => {
|
66
|
-
const options = {
|
67
|
-
...getDefaultConnectOptions(),
|
68
|
-
...userOptions,
|
69
|
-
};
|
70
|
-
server.addRequestHandler('POST', ApiConstants.LOGIN_URL, options.authResponse, options.authCallback);
|
71
|
-
const { socket, mockConsole } = getSocket(options.socketOptions, options.console);
|
72
|
-
await socket.connect();
|
73
|
-
return { socket, mockConsole };
|
74
|
-
};
|
3
|
+
import { DEFAULT_CONNECT_PARAMS } from './mock-data.js';
|
4
|
+
;
|
75
5
|
const toEmitId = (path, method) => {
|
76
6
|
return `${path}_${method}`;
|
77
7
|
};
|
8
|
+
const getDefaultMockCreatorF = () => ({
|
9
|
+
fn: () => { },
|
10
|
+
});
|
78
11
|
const DEFAULT_MOCK_SERVER_OPTIONS = {
|
79
12
|
url: DEFAULT_CONNECT_PARAMS.url,
|
80
13
|
reportMissingListeners: true,
|
14
|
+
mockF: getDefaultMockCreatorF(),
|
81
15
|
};
|
82
16
|
const getMockServer = (initialOptions = {}) => {
|
83
|
-
const { url, reportMissingListeners } = {
|
17
|
+
const { url, reportMissingListeners, mockF } = {
|
84
18
|
...DEFAULT_MOCK_SERVER_OPTIONS,
|
85
19
|
...initialOptions,
|
86
20
|
};
|
@@ -124,8 +58,8 @@ const getMockServer = (initialOptions = {}) => {
|
|
124
58
|
}, subscriptionCallback);
|
125
59
|
};
|
126
60
|
const addSubscriptionHandlerImpl = (moduleName, type, listenerName, entityId) => {
|
127
|
-
const subscribeFn =
|
128
|
-
const unsubscribeFn =
|
61
|
+
const subscribeFn = mockF.fn();
|
62
|
+
const unsubscribeFn = mockF.fn();
|
129
63
|
const path = entityId ? `${moduleName}/${entityId}/${type}/${listenerName}` : `${moduleName}/${type}/${listenerName}`;
|
130
64
|
addRequestHandler('POST', path, undefined, subscribeFn);
|
131
65
|
addRequestHandler('DELETE', path, undefined, unsubscribeFn);
|
@@ -149,8 +83,8 @@ const getMockServer = (initialOptions = {}) => {
|
|
149
83
|
const addHookHandler = (moduleName, listenerName) => {
|
150
84
|
const subscriber = addSubscriptionHandlerImpl(moduleName, 'hooks', listenerName);
|
151
85
|
const addResolver = (completionId) => {
|
152
|
-
const resolveFn =
|
153
|
-
const rejectFn =
|
86
|
+
const resolveFn = mockF.fn();
|
87
|
+
const rejectFn = mockF.fn();
|
154
88
|
addRequestHandler('POST', `${subscriber.path}/${completionId}/resolve`, undefined, resolveFn);
|
155
89
|
addRequestHandler('POST', `${subscriber.path}/${completionId}/reject`, undefined, rejectFn);
|
156
90
|
const fire = (data) => {
|
@@ -196,5 +130,5 @@ const getMockServer = (initialOptions = {}) => {
|
|
196
130
|
url,
|
197
131
|
};
|
198
132
|
};
|
199
|
-
export { getMockServer
|
133
|
+
export { getMockServer };
|
200
134
|
//# sourceMappingURL=mock-server.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../../src/tests/mocks/mock-server.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import * as Options from '../../types/options.js';
|
2
|
+
import { getMockServer } from './mock-server.js';
|
3
|
+
export type MockSocketConnectOptions = Omit<Options.APISocketOptions, 'username' | 'password' | 'url'> & {
|
4
|
+
username?: string;
|
5
|
+
password?: string;
|
6
|
+
url?: string;
|
7
|
+
};
|
8
|
+
type RequestCallback = (requestData: object) => void;
|
9
|
+
interface MockSocketOptions {
|
10
|
+
console: Options.LogOutput;
|
11
|
+
socketOptions?: MockSocketConnectOptions;
|
12
|
+
}
|
13
|
+
interface MockConnectedSocketOptions extends MockSocketOptions {
|
14
|
+
authCallback?: RequestCallback;
|
15
|
+
authResponse: object;
|
16
|
+
}
|
17
|
+
export declare const getSocket: (socketOptions?: MockSocketConnectOptions) => {
|
18
|
+
socket: import("../../NodeSocket.js").APISocket;
|
19
|
+
};
|
20
|
+
export declare const getConnectedSocket: (server: ReturnType<typeof getMockServer>, userOptions?: Partial<MockConnectedSocketOptions>) => Promise<{
|
21
|
+
socket: import("../../NodeSocket.js").APISocket;
|
22
|
+
}>;
|
23
|
+
export {};
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { Socket } from '../../NodeSocket.js';
|
2
|
+
import { WebSocket } from 'mock-socket';
|
3
|
+
import ApiConstants from '../../ApiConstants.js';
|
4
|
+
import { DEFAULT_AUTH_RESPONSE, DEFAULT_CONNECT_PARAMS } from './mock-data.js';
|
5
|
+
const getDefaultSocketOptions = () => ({
|
6
|
+
...DEFAULT_CONNECT_PARAMS,
|
7
|
+
logOutput: console,
|
8
|
+
logLevel: 'warn',
|
9
|
+
});
|
10
|
+
export const getSocket = (socketOptions = {}) => {
|
11
|
+
const socket = Socket({
|
12
|
+
...getDefaultSocketOptions(),
|
13
|
+
...socketOptions,
|
14
|
+
}, WebSocket);
|
15
|
+
return { socket };
|
16
|
+
};
|
17
|
+
const getDefaultConnectOptions = () => ({
|
18
|
+
console,
|
19
|
+
authResponse: DEFAULT_AUTH_RESPONSE,
|
20
|
+
});
|
21
|
+
export const getConnectedSocket = async (server, userOptions) => {
|
22
|
+
const options = {
|
23
|
+
...getDefaultConnectOptions(),
|
24
|
+
...userOptions,
|
25
|
+
};
|
26
|
+
server.addRequestHandler('POST', ApiConstants.LOGIN_URL, options.authResponse, options.authCallback);
|
27
|
+
const { socket } = getSocket(options.socketOptions);
|
28
|
+
await socket.connect();
|
29
|
+
return { socket };
|
30
|
+
};
|
31
|
+
//# sourceMappingURL=mock-socket.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"mock-socket.js","sourceRoot":"","sources":["../../../src/tests/mocks/mock-socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,MAAM,uBAAuB,GAAG,GAA6B,EAAE,CAAC,CAAC;IAC/D,GAAG,sBAAsB;IACzB,SAAS,EAAE,OAAO;IAClB,QAAQ,EAAE,MAAM;CACjB,CAAC,CAAC;AAsBH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,gBAA0C,EAAE,EAAE,EAAE;IACxE,MAAM,MAAM,GAAG,MAAM,CACnB;QACE,GAAG,uBAAuB,EAAE;QAC5B,GAAG,aAAa;KACjB,EACD,SAAgB,CACjB,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,GAAG,EAAE,CAAC,CAAC;IACtC,OAAO;IACP,YAAY,EAAE,qBAAqB;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,MAAwC,EACxC,WAAiD,EACjD,EAAE;IACF,MAAM,OAAO,GAA+B;QAC1C,GAAG,wBAAwB,EAAE;QAC7B,GAAG,WAAW;KACf,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAErG,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAEvB,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC,CAAC"}
|
@@ -1,2 +1,8 @@
|
|
1
1
|
export declare const waitForExpect: (func: () => void | Promise<void>) => Promise<{}>;
|
2
2
|
export declare const defusedPromise: (promise: Promise<any>) => Promise<any>;
|
3
|
+
export declare const getMockConsole: (verbose?: boolean) => {
|
4
|
+
log: jest.Mock<void, [a1: any, a2: any, a3: any, a4: any], any>;
|
5
|
+
info: jest.Mock<void, [a1: any, a2: any, a3: any, a4: any], any>;
|
6
|
+
warn: jest.Mock<void, [a1: any, a2: any, a3: any, a4: any], any>;
|
7
|
+
error: jest.Mock<void, [a1: any, a2: any, a3: any, a4: any], any>;
|
8
|
+
};
|
@@ -7,4 +7,22 @@ export const defusedPromise = (promise) => {
|
|
7
7
|
promise.catch(() => { });
|
8
8
|
return promise;
|
9
9
|
};
|
10
|
+
export const getMockConsole = (verbose = false) => ({
|
11
|
+
log: jest.fn((a1, a2, a3, a4) => {
|
12
|
+
if (verbose) {
|
13
|
+
console.log(a1, a2, a3, a4);
|
14
|
+
}
|
15
|
+
}),
|
16
|
+
info: jest.fn((a1, a2, a3, a4) => {
|
17
|
+
if (verbose) {
|
18
|
+
console.info(a1, a2, a3, a4);
|
19
|
+
}
|
20
|
+
}),
|
21
|
+
warn: jest.fn((a1, a2, a3, a4) => {
|
22
|
+
console.warn(a1, a2, a3, a4);
|
23
|
+
}),
|
24
|
+
error: jest.fn((a1, a2, a3, a4) => {
|
25
|
+
console.error(a1, a2, a3, a4);
|
26
|
+
}),
|
27
|
+
});
|
10
28
|
//# sourceMappingURL=test-utils.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/tests/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,iBAAiB,CAAC;AAEpD,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,YAAY;AACZ,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAgC,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AAGvH,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAqB,EAAE,EAAE;IACtD,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC,CAAA"}
|
1
|
+
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/tests/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,iBAAiB,CAAC;AAEpD,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,YAAY;AACZ,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAgC,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AAGvH,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAqB,EAAE,EAAE;IACtD,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IAClD,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAE;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IACF,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAE;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IACF,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAE;QACnD,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAE;QACpD,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC;CACH,CAAC,CAAC"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "airdcpp-apisocket",
|
3
|
-
"version": "3.0.0-beta.
|
3
|
+
"version": "3.0.0-beta.8",
|
4
4
|
"description": "Javascript connector for AirDC++ Web API",
|
5
5
|
"license": "MIT",
|
6
6
|
"authors": [
|
@@ -59,7 +59,7 @@
|
|
59
59
|
"main": "./dist/NodeSocket.js",
|
60
60
|
"exports": {
|
61
61
|
".": "./dist-es/NodeSocket.js",
|
62
|
-
"./tests
|
62
|
+
"./tests": "./dist-es/tests/mocks/index.js"
|
63
63
|
},
|
64
64
|
"type": "module"
|
65
65
|
}
|
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,26 @@
|
|
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_AUTH_RESPONSE = {
|
9
|
+
auth_token: 'b823187f-4aab-4b71-9764-e63e88401a26',
|
10
|
+
refresh_token: '5124faasf-4aab-4b71-9764-e63e88401a26',
|
11
|
+
user: {
|
12
|
+
permissions: [ 'admin' ],
|
13
|
+
username: 'test',
|
14
|
+
active_sessions: 1,
|
15
|
+
last_login: 0,
|
16
|
+
},
|
17
|
+
system: {
|
18
|
+
cid: 'AHLUODI2YZ2U7FDWMHFNJU65ERGKUN4MH7GW5LY',
|
19
|
+
hostname: 'ubuntu-htpc',
|
20
|
+
network_type: 'private',
|
21
|
+
path_separator: '/',
|
22
|
+
platform: 'other',
|
23
|
+
language: 'fi',
|
24
|
+
},
|
25
|
+
wizard_pending: false,
|
26
|
+
};
|
@@ -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/',
|
35
|
-
};
|
36
|
-
|
37
|
-
const getDefaultSocketOptions = (mockConsole: Options.LogOutput): Options.APISocketOptions => ({
|
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 };
|
7
|
+
interface MockFunctionCreator {
|
8
|
+
fn: (...args: any[]) => any;
|
79
9
|
};
|
80
10
|
|
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),
|
@@ -179,7 +85,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
179
85
|
method: string,
|
180
86
|
path: string,
|
181
87
|
data?: DataT | MockRequestResponseDataHandler<DataT>,
|
182
|
-
subscriptionCallback?:
|
88
|
+
subscriptionCallback?: RequestCallback
|
183
89
|
) => {
|
184
90
|
const handlerData = typeof data === 'function' ? data : {
|
185
91
|
data,
|
@@ -199,7 +105,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
199
105
|
path: string,
|
200
106
|
errorStr: string | null,
|
201
107
|
errorCode: number,
|
202
|
-
subscriptionCallback?:
|
108
|
+
subscriptionCallback?: RequestCallback
|
203
109
|
) => {
|
204
110
|
addServerHandler(
|
205
111
|
method,
|
@@ -220,8 +126,8 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
220
126
|
listenerName: string,
|
221
127
|
entityId?: string | number,
|
222
128
|
) => {
|
223
|
-
const subscribeFn =
|
224
|
-
const unsubscribeFn =
|
129
|
+
const subscribeFn = mockF.fn();
|
130
|
+
const unsubscribeFn = mockF.fn();
|
225
131
|
|
226
132
|
const path = entityId ? `${moduleName}/${entityId}/${type}/${listenerName}` : `${moduleName}/${type}/${listenerName}`;
|
227
133
|
|
@@ -262,8 +168,8 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
262
168
|
const subscriber = addSubscriptionHandlerImpl(moduleName, 'hooks', listenerName);
|
263
169
|
|
264
170
|
const addResolver = (completionId: number) => {
|
265
|
-
const resolveFn =
|
266
|
-
const rejectFn =
|
171
|
+
const resolveFn = mockF.fn();
|
172
|
+
const rejectFn = mockF.fn();
|
267
173
|
|
268
174
|
addRequestHandler(
|
269
175
|
'POST',
|
@@ -333,4 +239,4 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
333
239
|
};
|
334
240
|
};
|
335
241
|
|
336
|
-
export { getMockServer
|
242
|
+
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
|
+
});
|
@@ -1,100 +0,0 @@
|
|
1
|
-
import { WebSocket } from 'mock-socket';
|
2
|
-
import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '../types/api_internal.js';
|
3
|
-
import * as Options from '../types/options.js';
|
4
|
-
export declare const getMockConsole: () => {
|
5
|
-
log: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
6
|
-
info: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
7
|
-
warn: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
8
|
-
error: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
9
|
-
};
|
10
|
-
declare const DEFAULT_CONNECT_PARAMS: {
|
11
|
-
username: string;
|
12
|
-
password: string;
|
13
|
-
url: string;
|
14
|
-
};
|
15
|
-
declare const DEFAULT_AUTH_RESPONSE: {
|
16
|
-
auth_token: string;
|
17
|
-
refresh_token: string;
|
18
|
-
user: {
|
19
|
-
permissions: string[];
|
20
|
-
username: string;
|
21
|
-
active_sessions: number;
|
22
|
-
last_login: number;
|
23
|
-
};
|
24
|
-
system: {
|
25
|
-
cid: string;
|
26
|
-
hostname: string;
|
27
|
-
network_type: string;
|
28
|
-
path_separator: string;
|
29
|
-
platform: string;
|
30
|
-
language: string;
|
31
|
-
};
|
32
|
-
wizard_pending: boolean;
|
33
|
-
};
|
34
|
-
export type MockSocketOptions = Omit<Options.APISocketOptions, 'username' | 'password' | 'url'> & {
|
35
|
-
username?: string;
|
36
|
-
password?: string;
|
37
|
-
url?: string;
|
38
|
-
};
|
39
|
-
declare const getSocket: (socketOptions?: MockSocketOptions, mockConsole?: {
|
40
|
-
log: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
41
|
-
info: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
42
|
-
warn: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
43
|
-
error: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
44
|
-
}) => {
|
45
|
-
socket: import("../NodeSocket.js").APISocket;
|
46
|
-
mockConsole: {
|
47
|
-
log: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
48
|
-
info: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
49
|
-
warn: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
50
|
-
error: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
51
|
-
};
|
52
|
-
};
|
53
|
-
type Callback = (requestData: object) => void;
|
54
|
-
interface ConnectOptions {
|
55
|
-
socketOptions?: MockSocketOptions;
|
56
|
-
authCallback?: Callback;
|
57
|
-
authResponse?: object;
|
58
|
-
console?: ReturnType<typeof getMockConsole>;
|
59
|
-
}
|
60
|
-
declare const getConnectedSocket: (server: ReturnType<typeof getMockServer>, userOptions?: ConnectOptions) => Promise<{
|
61
|
-
socket: import("../NodeSocket.js").APISocket;
|
62
|
-
mockConsole: {
|
63
|
-
log: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
64
|
-
info: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
65
|
-
warn: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
66
|
-
error: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
|
67
|
-
};
|
68
|
-
}>;
|
69
|
-
interface MockServerOptions {
|
70
|
-
url: string;
|
71
|
-
reportMissingListeners?: boolean;
|
72
|
-
}
|
73
|
-
type MockRequestResponseDataObject<DataT extends object | undefined> = Omit<RequestSuccessResponse<DataT>, 'callback_id'> | Omit<RequestErrorResponse, 'callback_id'>;
|
74
|
-
type MockRequestResponseDataHandler<DataT extends object | undefined> = (request: OutgoingRequest, s: WebSocket) => MockRequestResponseDataObject<DataT>;
|
75
|
-
declare const getMockServer: (initialOptions?: Partial<MockServerOptions>) => {
|
76
|
-
addRequestHandler: <DataT extends object | undefined>(method: string, path: string, data?: DataT | MockRequestResponseDataHandler<DataT>, subscriptionCallback?: Callback) => void;
|
77
|
-
addErrorHandler: (method: string, path: string, errorStr: string | null, errorCode: number, subscriptionCallback?: Callback) => void;
|
78
|
-
addSubscriptionHandler: (moduleName: string, listenerName: string, entityId?: string | number) => {
|
79
|
-
fire: (data: object, entityId?: string | number) => void;
|
80
|
-
subscribeFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
|
81
|
-
unsubscribeFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
|
82
|
-
path: string;
|
83
|
-
};
|
84
|
-
addHookHandler: (moduleName: string, listenerName: string) => {
|
85
|
-
fire: (data: object, entityId?: string | number) => void;
|
86
|
-
subscribeFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
|
87
|
-
unsubscribeFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
|
88
|
-
path: string;
|
89
|
-
addResolver: (completionId: number) => {
|
90
|
-
fire: (data: object) => void;
|
91
|
-
resolveFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
|
92
|
-
rejectFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
|
93
|
-
};
|
94
|
-
};
|
95
|
-
ignoreMissingHandler: (method: string, path: string) => void;
|
96
|
-
stop: () => void;
|
97
|
-
send: (data: object) => void;
|
98
|
-
url: string;
|
99
|
-
};
|
100
|
-
export { getMockServer, getSocket, getConnectedSocket, DEFAULT_CONNECT_PARAMS, DEFAULT_AUTH_RESPONSE };
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../src/tests/mock-server.ts"],"names":[],"mappings":"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"}
|