airdcpp-apisocket 3.0.0-beta.5 → 3.0.0-beta.7

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.
@@ -1,15 +1,14 @@
1
1
  import {
2
2
  getMockServer,
3
3
  getConnectedSocket,
4
- waitForExpect,
5
- } from './helpers.js';
4
+ } from './mock-server.js';
5
+ import { waitForExpect } from './test-utils.js';
6
6
 
7
7
  import { jest } from '@jest/globals';
8
8
 
9
9
  import { addContextMenuItems } from '../PublicHelpers.js';
10
10
  import { SelectedMenuItemListenerData, MenuItemListHookData, MenuItemListHookAcceptData } from '../types/public_helpers_internal.js';
11
11
  import { HookSubscriberInfo, MenuCallbackProperties, MenuClickHandlerProperties } from '../types/index.js';
12
- import { IncomingSubscriptionEvent } from '../types/api_internal.js';
13
12
 
14
13
 
15
14
  let server: ReturnType<typeof getMockServer>;
@@ -97,19 +96,10 @@ describe('public helpers', () => {
97
96
  // Socket handlers
98
97
  const { socket } = await getConnectedSocket(server);
99
98
 
100
- const listenerAddCallback = jest.fn();
101
- server.addDataHandler('POST', `menus/listeners/${MENU_ID}_menuitem_selected`, undefined, listenerAddCallback);
102
-
103
- const hookAddCallback = jest.fn();
104
- const hookResolveCallback = jest.fn();
105
- server.addDataHandler('POST', `menus/hooks/${MENU_ID}_list_menuitems`, undefined, hookAddCallback);
106
- server.addDataHandler(
107
- 'POST',
108
- `menus/hooks/${MENU_ID}_list_menuitems/${HOOK_COMPLETION_ID}/resolve`,
109
- menuItemListData,
110
- hookResolveCallback
111
- );
99
+ const itemSelectedListener = server.addSubscriptionHandler('menus', `${MENU_ID}_menuitem_selected`);
112
100
 
101
+ const listItemsHook = server.addHookHandler('menus', `${MENU_ID}_list_menuitems`);
102
+ const listItemsResolver = listItemsHook.addResolver(HOOK_COMPLETION_ID);
113
103
 
114
104
  // Add menu items
115
105
  const onClickItem1Mock = jest.fn();
@@ -166,33 +156,29 @@ describe('public helpers', () => {
166
156
  SUBSCRIBER_INFO,
167
157
  );
168
158
 
169
- expect(listenerAddCallback).toHaveBeenCalledTimes(1);
170
- expect(hookAddCallback).toHaveBeenCalledTimes(1);
159
+ expect(itemSelectedListener.subscribeFn).toHaveBeenCalledTimes(1);
160
+ expect(listItemsHook.subscribeFn).toHaveBeenCalledTimes(1);
171
161
 
172
162
 
173
163
  // List items hook
174
164
  {
175
- const hookEventData: IncomingSubscriptionEvent<MenuItemListHookData<string, null>> = {
176
- event: `${MENU_ID}_list_menuitems`,
177
- data: {
178
- selected_ids: selectedMenuIds,
179
- entity_id: null,
180
- permissions: PERMISSIONS,
181
- supports: SUPPORTS,
182
- },
183
- completion_id: 1,
165
+ const menuItemListData: MenuItemListHookData<string, null> = {
166
+ selected_ids: selectedMenuIds,
167
+ entity_id: null,
168
+ permissions: PERMISSIONS,
169
+ supports: SUPPORTS,
184
170
  };
185
171
 
186
- server.send(hookEventData);
172
+ listItemsResolver.fire(menuItemListData);
187
173
  }
188
174
 
189
175
  // Validate list items results
190
176
  {
191
177
  await waitForExpect(() => {
192
- expect(hookResolveCallback).toHaveBeenCalledTimes(1);
178
+ expect(listItemsResolver.resolveFn).toHaveBeenCalledTimes(1);
193
179
  });
194
180
 
195
- expect(hookResolveCallback).toHaveBeenCalledWith(
181
+ expect(listItemsResolver.resolveFn).toHaveBeenCalledWith(
196
182
  expect.objectContaining({
197
183
  data: menuItemListData
198
184
  }),
@@ -214,22 +200,18 @@ describe('public helpers', () => {
214
200
 
215
201
  // Select event listener
216
202
  {
217
- const selectEventData: IncomingSubscriptionEvent<SelectedMenuItemListenerData<string, null>> = {
218
- event: `${MENU_ID}_menuitem_selected`,
219
- data: {
220
- menuitem_id: MENU_ITEM1_ID,
221
- hook_id: SUBSCRIBER_INFO.id,
222
- menu_id: MENU_ID,
223
- entity_id: null,
224
- selected_ids: selectedMenuIds,
225
- permissions: PERMISSIONS,
226
- supports: SUPPORTS,
227
- form_values: FORM_VALUES
228
- },
229
- completion_id: HOOK_COMPLETION_ID,
203
+ const selectData: SelectedMenuItemListenerData<string, null> = {
204
+ menuitem_id: MENU_ITEM1_ID,
205
+ hook_id: SUBSCRIBER_INFO.id,
206
+ menu_id: MENU_ID,
207
+ entity_id: null,
208
+ selected_ids: selectedMenuIds,
209
+ permissions: PERMISSIONS,
210
+ supports: SUPPORTS,
211
+ form_values: FORM_VALUES
230
212
  };
231
213
 
232
- server.send(selectEventData);
214
+ itemSelectedListener.fire(selectData);
233
215
  }
234
216
 
235
217
  // Validate select event results
@@ -0,0 +1,12 @@
1
+ import waitForExpectOriginal from 'wait-for-expect';
2
+
3
+ const EXCEPT_TIMEOUT = 1000;
4
+ //@ts-ignore
5
+ export const waitForExpect = (func: () => void | Promise<void>) => waitForExpectOriginal.default(func, EXCEPT_TIMEOUT);
6
+
7
+
8
+ // This is a helper function that will suppress the error of a promise.
9
+ export const defusedPromise = (promise: Promise<any>) => {
10
+ promise.catch(() => {});
11
+ return promise;
12
+ }
@@ -1,6 +1,5 @@
1
1
  // HELPERS
2
2
  export type CompletionIdType = number;
3
- //export type SubscriptionIdType = string;
4
3
 
5
4
 
6
5
  // REQUESTS
@@ -20,8 +20,8 @@ export interface MenuItemListHookData<IdT, EntityIdT> {
20
20
  }
21
21
 
22
22
  export interface ResponseMenuItemCallbackFields {
23
- urls?: string[] | undefined;
24
- form_definitions?: object[] | undefined;
23
+ urls?: string[];
24
+ form_definitions?: object[];
25
25
  }
26
26
 
27
27
  export type ResponseMenuItem<IdT, EntityIdT> = Omit<ContextMenuItem<IdT, EntityIdT>, 'onClick' | 'filter' | 'urls' | 'form_definitions'> & ResponseMenuItemCallbackFields;
@@ -1,135 +0,0 @@
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';
5
- import { EventEmitter } from 'events';
6
- import waitForExpectOriginal from 'wait-for-expect';
7
- const EXCEPT_TIMEOUT = 1000;
8
- //@ts-ignore
9
- export const waitForExpect = (func) => waitForExpectOriginal.default(func, EXCEPT_TIMEOUT);
10
- const VERBOSE = false;
11
- const getMockConsole = () => ({
12
- log: jest.fn((a1, a2, a3, a4) => {
13
- if (VERBOSE) {
14
- console.log(a1, a2, a3, a4);
15
- }
16
- }),
17
- info: jest.fn((a1, a2, a3, a4) => {
18
- if (VERBOSE) {
19
- console.info(a1, a2, a3, a4);
20
- }
21
- }),
22
- warn: jest.fn((a1, a2, a3, a4) => {
23
- console.warn(a1, a2, a3, a4);
24
- }),
25
- error: jest.fn((a1, a2, a3, a4) => {
26
- console.error(a1, a2, a3, a4);
27
- }),
28
- });
29
- const DEFAULT_CONNECT_PARAMS = {
30
- username: 'test',
31
- password: 'test',
32
- url: 'ws://localhost:7171/api/v1/',
33
- };
34
- const getDefaultSocketOptions = (mockConsole) => ({
35
- ...DEFAULT_CONNECT_PARAMS,
36
- logOutput: mockConsole,
37
- logLevel: VERBOSE ? 'verbose' : 'warn',
38
- });
39
- const DEFAULT_AUTH_RESPONSE = {
40
- auth_token: 'b823187f-4aab-4b71-9764-e63e88401a26',
41
- refresh_token: '5124faasf-4aab-4b71-9764-e63e88401a26',
42
- user: {
43
- permissions: ['admin'],
44
- username: 'test',
45
- active_sessions: 1,
46
- last_login: 0,
47
- },
48
- system: {
49
- cid: 'AHLUODI2YZ2U7FDWMHFNJU65ERGKUN4MH7GW5LY',
50
- hostname: 'ubuntu-htpc',
51
- network_type: 'private',
52
- path_separator: '/',
53
- platform: 'other',
54
- language: 'fi',
55
- },
56
- wizard_pending: false,
57
- };
58
- const getSocket = (socketOptions = {}, mockConsole = getMockConsole()) => {
59
- const socket = Socket({
60
- ...getDefaultSocketOptions(mockConsole),
61
- ...socketOptions,
62
- }, WebSocket);
63
- return { socket, mockConsole };
64
- };
65
- const getDefaultConnectOptions = () => ({
66
- console: getMockConsole(),
67
- authResponse: DEFAULT_AUTH_RESPONSE,
68
- });
69
- const getConnectedSocket = async (server, userOptions) => {
70
- const options = {
71
- ...getDefaultConnectOptions(),
72
- ...userOptions,
73
- };
74
- server.addDataHandler('POST', ApiConstants.LOGIN_URL, options.authResponse, options.authCallback);
75
- const { socket, mockConsole } = getSocket(options.socketOptions, options.console);
76
- await socket.connect();
77
- return { socket, mockConsole };
78
- };
79
- const toEmitId = (path, method) => {
80
- return `${path}_${method}`;
81
- };
82
- const getMockServer = (url = DEFAULT_CONNECT_PARAMS.url) => {
83
- const mockServer = new Server(url);
84
- let socket;
85
- const emitter = new EventEmitter();
86
- const addServerHandler = (method, path, responseData, subscriptionCallback) => {
87
- emitter.addListener(toEmitId(path, method), (request, s) => {
88
- if (subscriptionCallback) {
89
- subscriptionCallback(request);
90
- }
91
- const response = {
92
- callback_id: request.callback_id,
93
- ...responseData,
94
- };
95
- s.send(JSON.stringify(response));
96
- });
97
- };
98
- mockServer.on('connection', s => {
99
- socket = s;
100
- socket.on('message', (messageObj) => {
101
- const request = JSON.parse(messageObj);
102
- emitter.emit(toEmitId(request.path, request.method), request, s);
103
- });
104
- });
105
- mockServer.on('close', () => {
106
- emitter.removeAllListeners();
107
- });
108
- return {
109
- addDataHandler: (method, path, data, subscriptionCallback) => {
110
- addServerHandler(method, path, {
111
- data,
112
- code: 200,
113
- }, subscriptionCallback);
114
- },
115
- addErrorHandler: (method, path, errorStr, errorCode, subscriptionCallback) => {
116
- addServerHandler(method, path, {
117
- error: !errorStr ? null : {
118
- message: errorStr,
119
- },
120
- code: errorCode,
121
- }, subscriptionCallback);
122
- },
123
- stop: () => {
124
- mockServer.stop(() => {
125
- // ...
126
- });
127
- },
128
- send: (data) => {
129
- socket.send(JSON.stringify(data));
130
- },
131
- url,
132
- };
133
- };
134
- export { getMockServer, getSocket, getConnectedSocket, DEFAULT_CONNECT_PARAMS, DEFAULT_AUTH_RESPONSE };
135
- //# sourceMappingURL=helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tests/helpers.ts"],"names":[],"mappings":"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"}
@@ -1,211 +0,0 @@
1
- import { Socket } from '../NodeSocket.js';
2
- import { Client, Server, WebSocket } from 'mock-socket';
3
- import { jest } from '@jest/globals';
4
-
5
- import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '../types/api_internal.js';
6
- import * as Options from '../types/options.js';
7
- import ApiConstants from '../ApiConstants.js';
8
- import { EventEmitter } from 'events';
9
-
10
- import waitForExpectOriginal from 'wait-for-expect';
11
-
12
- const EXCEPT_TIMEOUT = 1000;
13
- //@ts-ignore
14
- export const waitForExpect = (func: () => void | Promise<void>) => waitForExpectOriginal.default(func, EXCEPT_TIMEOUT);
15
-
16
- const VERBOSE = false;
17
-
18
- const getMockConsole = () => ({
19
- log: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
20
- if (VERBOSE) {
21
- console.log(a1, a2, a3, a4);
22
- }
23
- }),
24
- info: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
25
- if (VERBOSE) {
26
- console.info(a1, a2, a3, a4);
27
- }
28
- }),
29
- warn: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
30
- console.warn(a1, a2, a3, a4);
31
- }),
32
- error: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
33
- console.error(a1, a2, a3, a4);
34
- }),
35
- });
36
-
37
- const DEFAULT_CONNECT_PARAMS = {
38
- username: 'test',
39
- password: 'test',
40
- url: 'ws://localhost:7171/api/v1/',
41
- };
42
-
43
- const getDefaultSocketOptions = (mockConsole: Options.LogOutput): Options.APISocketOptions => ({
44
- ...DEFAULT_CONNECT_PARAMS,
45
- logOutput: mockConsole,
46
- logLevel: VERBOSE ? 'verbose' : 'warn',
47
- });
48
-
49
- const DEFAULT_AUTH_RESPONSE = {
50
- auth_token: 'b823187f-4aab-4b71-9764-e63e88401a26',
51
- refresh_token: '5124faasf-4aab-4b71-9764-e63e88401a26',
52
- user: {
53
- permissions: [ 'admin' ],
54
- username: 'test',
55
- active_sessions: 1,
56
- last_login: 0,
57
- },
58
- system: {
59
- cid: 'AHLUODI2YZ2U7FDWMHFNJU65ERGKUN4MH7GW5LY',
60
- hostname: 'ubuntu-htpc',
61
- network_type: 'private',
62
- path_separator: '/',
63
- platform: 'other',
64
- language: 'fi',
65
- },
66
- wizard_pending: false,
67
- };
68
-
69
- export type MockSocketOptions = Omit<Options.APISocketOptions, 'username' | 'password' | 'url'> & {
70
- username?: string;
71
- password?: string;
72
- url?: string;
73
- };
74
-
75
- const getSocket = (socketOptions: MockSocketOptions = {}, mockConsole = getMockConsole()) => {
76
- const socket = Socket(
77
- {
78
- ...getDefaultSocketOptions(mockConsole),
79
- ...socketOptions,
80
- },
81
- WebSocket as any
82
- );
83
-
84
- return { socket, mockConsole };
85
- };
86
-
87
-
88
- type Callback = (requestData: object) => void;
89
-
90
- interface ConnectOptions {
91
- socketOptions?: MockSocketOptions;
92
- authCallback?: Callback;
93
- authResponse?: object;
94
- console?: ReturnType<typeof getMockConsole>;
95
- }
96
-
97
- const getDefaultConnectOptions = () => ({
98
- console: getMockConsole(),
99
- authResponse: DEFAULT_AUTH_RESPONSE,
100
- });
101
-
102
- const getConnectedSocket = async (
103
- server: ReturnType<typeof getMockServer>,
104
- userOptions?: ConnectOptions,
105
- ) => {
106
- const options = {
107
- ...getDefaultConnectOptions(),
108
- ...userOptions,
109
- };
110
-
111
- server.addDataHandler('POST', ApiConstants.LOGIN_URL, options.authResponse, options.authCallback);
112
-
113
- const { socket, mockConsole } = getSocket(options.socketOptions, options.console);
114
- await socket.connect();
115
-
116
- return { socket, mockConsole };
117
- };
118
-
119
- const toEmitId = (path: string, method: string) => {
120
- return `${path}_${method}`;
121
- };
122
-
123
- const getMockServer = (url = DEFAULT_CONNECT_PARAMS.url) => {
124
- const mockServer = new Server(url);
125
- let socket: Client;
126
- const emitter = new EventEmitter();
127
-
128
- const addServerHandler = <DataT extends object | undefined>(
129
- method: string,
130
- path: string,
131
- responseData: Omit<RequestSuccessResponse<DataT>, 'callback_id'> | Omit<RequestErrorResponse, 'callback_id'>,
132
- subscriptionCallback?: Callback
133
- ) => {
134
- emitter.addListener(
135
- toEmitId(path, method),
136
- (request: OutgoingRequest, s: WebSocket) => {
137
- if (subscriptionCallback) {
138
- subscriptionCallback(request);
139
- }
140
-
141
- const response: RequestSuccessResponse | RequestErrorResponse = {
142
- callback_id: request.callback_id,
143
- ...responseData,
144
- };
145
-
146
- s.send(JSON.stringify(response));
147
- }
148
- );
149
- };
150
-
151
- mockServer.on('connection', s => {
152
- socket = s;
153
-
154
- socket.on('message', (messageObj) => {
155
- const request: OutgoingRequest = JSON.parse(messageObj as string);
156
- emitter.emit(toEmitId(request.path, request.method), request, s);
157
- });
158
- });
159
-
160
- mockServer.on('close', () => {
161
- emitter.removeAllListeners();
162
- });
163
-
164
- return {
165
- addDataHandler: <DataT extends object | undefined>(
166
- method: string,
167
- path: string,
168
- data?: DataT,
169
- subscriptionCallback?: Callback
170
- ) => {
171
- addServerHandler<DataT>(
172
- method,
173
- path, {
174
- data,
175
- code: 200,
176
- },
177
- subscriptionCallback
178
- );
179
- },
180
- addErrorHandler: (
181
- method: string,
182
- path: string,
183
- errorStr: string | null,
184
- errorCode: number,
185
- subscriptionCallback?: Callback
186
- ) => {
187
- addServerHandler(
188
- method,
189
- path,
190
- {
191
- error: !errorStr ? null as any : {
192
- message: errorStr,
193
- },
194
- code: errorCode,
195
- },
196
- subscriptionCallback
197
- );
198
- },
199
- stop: () => {
200
- mockServer.stop(() => {
201
- // ...
202
- });
203
- },
204
- send: (data: object) => {
205
- socket.send(JSON.stringify(data));
206
- },
207
- url,
208
- };
209
- };
210
-
211
- export { getMockServer, getSocket, getConnectedSocket, DEFAULT_CONNECT_PARAMS, DEFAULT_AUTH_RESPONSE };