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.
@@ -0,0 +1,3 @@
1
+ export * from './mock-data.js';
2
+ export * from './mock-server.js';
3
+ export * from './mock-socket.js';
@@ -0,0 +1,4 @@
1
+ export * from './mock-data.js';
2
+ export * from './mock-server.js';
3
+ export * from './mock-socket.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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 { Socket } from '../NodeSocket.js';
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
- const VERBOSE = false;
7
- export const getMockConsole = () => ({
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 = jest.fn();
128
- const unsubscribeFn = jest.fn();
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 = jest.fn();
153
- const rejectFn = jest.fn();
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, getSocket, getConnectedSocket, DEFAULT_CONNECT_PARAMS, DEFAULT_AUTH_RESPONSE };
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.7",
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/": "./dist-es/tests/"
62
+ "./tests": "./dist-es/tests/mocks/index.js"
63
63
  },
64
64
  "type": "module"
65
65
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_AUTH_RESPONSE, DEFAULT_CONNECT_PARAMS,
3
- getConnectedSocket, getMockServer, getSocket
4
- } from './mock-server.js';
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
- server = getMockServer();
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, mockConsole } = getSocket();
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, mockConsole } = getSocket();
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, mockConsole } = getSocket();
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 } = getSocket({
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 = getMockServer();
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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 = getMockServer();
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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 getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server);
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, mockConsole } = await getConnectedSocket(server, {
528
+ const { socket } = await getOriginalConnectedSocket(server, {
508
529
  socketOptions: {
509
530
  logLevel,
531
+ ...getDefaultSocketOptions(),
510
532
  },
511
533
  });
512
534
 
@@ -0,0 +1,3 @@
1
+ export * from './mock-data.js';
2
+ export * from './mock-server.js';
3
+ export * from './mock-socket.js';
@@ -0,0 +1,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 '../types/api_internal.js';
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
- const VERBOSE = false;
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?: Callback
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?: Callback
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?: Callback
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 = jest.fn();
224
- const unsubscribeFn = jest.fn();
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 = jest.fn();
266
- const rejectFn = jest.fn();
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, getSocket, getConnectedSocket, DEFAULT_CONNECT_PARAMS, DEFAULT_AUTH_RESPONSE };
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 './mock-server.js';
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(() => {
@@ -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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"}