@webex/contact-center 0.0.0-next.1

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.
Files changed (177) hide show
  1. package/README.md +81 -0
  2. package/__mocks__/workerMock.js +15 -0
  3. package/babel.config.js +15 -0
  4. package/dist/cc.js +1416 -0
  5. package/dist/cc.js.map +1 -0
  6. package/dist/config.js +72 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/constants.js +58 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/index.js +142 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/logger-proxy.js +115 -0
  13. package/dist/logger-proxy.js.map +1 -0
  14. package/dist/metrics/MetricsManager.js +474 -0
  15. package/dist/metrics/MetricsManager.js.map +1 -0
  16. package/dist/metrics/behavioral-events.js +322 -0
  17. package/dist/metrics/behavioral-events.js.map +1 -0
  18. package/dist/metrics/constants.js +134 -0
  19. package/dist/metrics/constants.js.map +1 -0
  20. package/dist/services/WebCallingService.js +323 -0
  21. package/dist/services/WebCallingService.js.map +1 -0
  22. package/dist/services/agent/index.js +177 -0
  23. package/dist/services/agent/index.js.map +1 -0
  24. package/dist/services/agent/types.js +137 -0
  25. package/dist/services/agent/types.js.map +1 -0
  26. package/dist/services/config/Util.js +203 -0
  27. package/dist/services/config/Util.js.map +1 -0
  28. package/dist/services/config/constants.js +221 -0
  29. package/dist/services/config/constants.js.map +1 -0
  30. package/dist/services/config/index.js +607 -0
  31. package/dist/services/config/index.js.map +1 -0
  32. package/dist/services/config/types.js +334 -0
  33. package/dist/services/config/types.js.map +1 -0
  34. package/dist/services/constants.js +117 -0
  35. package/dist/services/constants.js.map +1 -0
  36. package/dist/services/core/Err.js +43 -0
  37. package/dist/services/core/Err.js.map +1 -0
  38. package/dist/services/core/GlobalTypes.js +6 -0
  39. package/dist/services/core/GlobalTypes.js.map +1 -0
  40. package/dist/services/core/Utils.js +126 -0
  41. package/dist/services/core/Utils.js.map +1 -0
  42. package/dist/services/core/WebexRequest.js +96 -0
  43. package/dist/services/core/WebexRequest.js.map +1 -0
  44. package/dist/services/core/aqm-reqs.js +246 -0
  45. package/dist/services/core/aqm-reqs.js.map +1 -0
  46. package/dist/services/core/constants.js +109 -0
  47. package/dist/services/core/constants.js.map +1 -0
  48. package/dist/services/core/types.js +6 -0
  49. package/dist/services/core/types.js.map +1 -0
  50. package/dist/services/core/websocket/WebSocketManager.js +187 -0
  51. package/dist/services/core/websocket/WebSocketManager.js.map +1 -0
  52. package/dist/services/core/websocket/connection-service.js +111 -0
  53. package/dist/services/core/websocket/connection-service.js.map +1 -0
  54. package/dist/services/core/websocket/keepalive.worker.js +94 -0
  55. package/dist/services/core/websocket/keepalive.worker.js.map +1 -0
  56. package/dist/services/core/websocket/types.js +6 -0
  57. package/dist/services/core/websocket/types.js.map +1 -0
  58. package/dist/services/index.js +78 -0
  59. package/dist/services/index.js.map +1 -0
  60. package/dist/services/task/AutoWrapup.js +88 -0
  61. package/dist/services/task/AutoWrapup.js.map +1 -0
  62. package/dist/services/task/TaskManager.js +369 -0
  63. package/dist/services/task/TaskManager.js.map +1 -0
  64. package/dist/services/task/constants.js +58 -0
  65. package/dist/services/task/constants.js.map +1 -0
  66. package/dist/services/task/contact.js +464 -0
  67. package/dist/services/task/contact.js.map +1 -0
  68. package/dist/services/task/dialer.js +60 -0
  69. package/dist/services/task/dialer.js.map +1 -0
  70. package/dist/services/task/index.js +1188 -0
  71. package/dist/services/task/index.js.map +1 -0
  72. package/dist/services/task/types.js +214 -0
  73. package/dist/services/task/types.js.map +1 -0
  74. package/dist/types/cc.d.ts +676 -0
  75. package/dist/types/config.d.ts +66 -0
  76. package/dist/types/constants.d.ts +45 -0
  77. package/dist/types/index.d.ts +178 -0
  78. package/dist/types/logger-proxy.d.ts +71 -0
  79. package/dist/types/metrics/MetricsManager.d.ts +223 -0
  80. package/dist/types/metrics/behavioral-events.d.ts +29 -0
  81. package/dist/types/metrics/constants.d.ts +127 -0
  82. package/dist/types/services/WebCallingService.d.ts +1 -0
  83. package/dist/types/services/agent/index.d.ts +46 -0
  84. package/dist/types/services/agent/types.d.ts +413 -0
  85. package/dist/types/services/config/Util.d.ts +19 -0
  86. package/dist/types/services/config/constants.d.ts +203 -0
  87. package/dist/types/services/config/index.d.ts +171 -0
  88. package/dist/types/services/config/types.d.ts +1113 -0
  89. package/dist/types/services/constants.d.ts +97 -0
  90. package/dist/types/services/core/Err.d.ts +119 -0
  91. package/dist/types/services/core/GlobalTypes.d.ts +33 -0
  92. package/dist/types/services/core/Utils.d.ts +36 -0
  93. package/dist/types/services/core/WebexRequest.d.ts +22 -0
  94. package/dist/types/services/core/aqm-reqs.d.ts +16 -0
  95. package/dist/types/services/core/constants.d.ts +85 -0
  96. package/dist/types/services/core/types.d.ts +47 -0
  97. package/dist/types/services/core/websocket/WebSocketManager.d.ts +34 -0
  98. package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
  99. package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
  100. package/dist/types/services/core/websocket/types.d.ts +37 -0
  101. package/dist/types/services/index.d.ts +52 -0
  102. package/dist/types/services/task/AutoWrapup.d.ts +40 -0
  103. package/dist/types/services/task/TaskManager.d.ts +1 -0
  104. package/dist/types/services/task/constants.d.ts +46 -0
  105. package/dist/types/services/task/contact.d.ts +59 -0
  106. package/dist/types/services/task/dialer.d.ts +28 -0
  107. package/dist/types/services/task/index.d.ts +569 -0
  108. package/dist/types/services/task/types.d.ts +1041 -0
  109. package/dist/types/types.d.ts +452 -0
  110. package/dist/types/webex-config.d.ts +53 -0
  111. package/dist/types/webex.d.ts +7 -0
  112. package/dist/types.js +292 -0
  113. package/dist/types.js.map +1 -0
  114. package/dist/webex-config.js +60 -0
  115. package/dist/webex-config.js.map +1 -0
  116. package/dist/webex.js +99 -0
  117. package/dist/webex.js.map +1 -0
  118. package/jest.config.js +45 -0
  119. package/package.json +83 -0
  120. package/src/cc.ts +1618 -0
  121. package/src/config.ts +65 -0
  122. package/src/constants.ts +51 -0
  123. package/src/index.ts +220 -0
  124. package/src/logger-proxy.ts +110 -0
  125. package/src/metrics/MetricsManager.ts +512 -0
  126. package/src/metrics/behavioral-events.ts +332 -0
  127. package/src/metrics/constants.ts +135 -0
  128. package/src/services/WebCallingService.ts +351 -0
  129. package/src/services/agent/index.ts +149 -0
  130. package/src/services/agent/types.ts +440 -0
  131. package/src/services/config/Util.ts +261 -0
  132. package/src/services/config/constants.ts +249 -0
  133. package/src/services/config/index.ts +743 -0
  134. package/src/services/config/types.ts +1117 -0
  135. package/src/services/constants.ts +111 -0
  136. package/src/services/core/Err.ts +126 -0
  137. package/src/services/core/GlobalTypes.ts +34 -0
  138. package/src/services/core/Utils.ts +132 -0
  139. package/src/services/core/WebexRequest.ts +103 -0
  140. package/src/services/core/aqm-reqs.ts +272 -0
  141. package/src/services/core/constants.ts +106 -0
  142. package/src/services/core/types.ts +48 -0
  143. package/src/services/core/websocket/WebSocketManager.ts +196 -0
  144. package/src/services/core/websocket/connection-service.ts +142 -0
  145. package/src/services/core/websocket/keepalive.worker.js +88 -0
  146. package/src/services/core/websocket/types.ts +40 -0
  147. package/src/services/index.ts +71 -0
  148. package/src/services/task/AutoWrapup.ts +86 -0
  149. package/src/services/task/TaskManager.ts +420 -0
  150. package/src/services/task/constants.ts +52 -0
  151. package/src/services/task/contact.ts +429 -0
  152. package/src/services/task/dialer.ts +52 -0
  153. package/src/services/task/index.ts +1375 -0
  154. package/src/services/task/types.ts +1113 -0
  155. package/src/types.ts +639 -0
  156. package/src/webex-config.ts +54 -0
  157. package/src/webex.js +96 -0
  158. package/test/unit/spec/cc.ts +1985 -0
  159. package/test/unit/spec/metrics/MetricsManager.ts +491 -0
  160. package/test/unit/spec/metrics/behavioral-events.ts +102 -0
  161. package/test/unit/spec/services/WebCallingService.ts +416 -0
  162. package/test/unit/spec/services/agent/index.ts +65 -0
  163. package/test/unit/spec/services/config/index.ts +1035 -0
  164. package/test/unit/spec/services/core/Utils.ts +279 -0
  165. package/test/unit/spec/services/core/WebexRequest.ts +144 -0
  166. package/test/unit/spec/services/core/aqm-reqs.ts +570 -0
  167. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +378 -0
  168. package/test/unit/spec/services/core/websocket/connection-service.ts +178 -0
  169. package/test/unit/spec/services/task/TaskManager.ts +1351 -0
  170. package/test/unit/spec/services/task/contact.ts +204 -0
  171. package/test/unit/spec/services/task/dialer.ts +157 -0
  172. package/test/unit/spec/services/task/index.ts +1474 -0
  173. package/tsconfig.json +6 -0
  174. package/typedoc.json +37 -0
  175. package/typedoc.md +240 -0
  176. package/umd/contact-center.min.js +3 -0
  177. package/umd/contact-center.min.js.map +1 -0
@@ -0,0 +1,570 @@
1
+ import AqmReqs from '../../../../../src/services/core/aqm-reqs';
2
+ import WebexRequest from '../../../../../src/services/core/WebexRequest';
3
+
4
+ import LoggerProxy from '../../../../../src/logger-proxy';
5
+ import {IHttpResponse} from '../../../../../src/types';
6
+ import {AQM_REQS_FILE} from '../../../../../src/constants';
7
+ import {WebSocketManager} from '../../../../../src/services/core/websocket/WebSocketManager';
8
+
9
+ jest.mock('../../../../../src/services/core/WebexRequest');
10
+ jest.mock('../../../../../src/logger-proxy', () => ({
11
+ __esModule: true,
12
+ default: {
13
+ log: jest.fn(),
14
+ error: jest.fn(),
15
+ info: jest.fn(),
16
+ initialize: jest.fn(),
17
+ },
18
+ }));
19
+ jest.mock('../../../../../src/services/core/websocket/WebSocketManager');
20
+
21
+ // Mock CustomEvent class
22
+ class MockCustomEvent<T> extends Event {
23
+ detail: T;
24
+
25
+ constructor(event: string, params: { detail: T }) {
26
+ super(event);
27
+ this.detail = params.detail;
28
+ }
29
+ }
30
+
31
+ global.CustomEvent = MockCustomEvent as any;
32
+
33
+ global.window = {
34
+ setTimeout: global.setTimeout,
35
+ } as any;
36
+
37
+ const mockWebexRequest = WebexRequest as jest.MockedClass<typeof WebexRequest>;
38
+ const mockWebSocketManager = WebSocketManager as jest.MockedClass<typeof WebSocketManager>;
39
+
40
+ describe('AqmReqs', () => {
41
+ let webexRequestInstance: jest.Mocked<WebexRequest>;
42
+ let webSocketManagerInstance: jest.Mocked<WebSocketManager>;
43
+ const mockWebexRequestResolvedValue: IHttpResponse = {
44
+ status: 202,
45
+ data: { webSocketUrl: 'fake-url' },
46
+ statusText: 'OK',
47
+ headers: {},
48
+ config: {},
49
+ };
50
+ let aqm: AqmReqs;
51
+
52
+ beforeEach(() => {
53
+ jest.clearAllMocks();
54
+ webexRequestInstance = new WebexRequest() as jest.Mocked<WebexRequest>;
55
+ mockWebexRequest.getInstance = jest.fn().mockReturnValue(webexRequestInstance);
56
+
57
+ const mockWorker = {
58
+ postMessage: jest.fn(),
59
+ onmessage: jest.fn(),
60
+ };
61
+
62
+ global.Worker = jest.fn(() => mockWorker) as any;
63
+
64
+ webSocketManagerInstance = new WebSocketManager({
65
+ webex: {} as any,
66
+ }) as jest.Mocked<WebSocketManager>;
67
+
68
+ // Mock the on method to handle event listeners
69
+ const eventListeners: { [key: string]: Function[] } = {};
70
+ webSocketManagerInstance.on = jest.fn((event: string, listener: Function) => {
71
+ if (!eventListeners[event]) {
72
+ eventListeners[event] = [];
73
+ }
74
+ eventListeners[event].push(listener);
75
+ });
76
+
77
+ // Mock the emit method to directly call the registered listeners
78
+ webSocketManagerInstance.emit = (event: string, ...args: any[]) => {
79
+ if (eventListeners[event]) {
80
+ eventListeners[event].forEach((listener) => listener(...args));
81
+ }
82
+ };
83
+
84
+
85
+ aqm = new AqmReqs(webSocketManagerInstance);
86
+ mockWebSocketManager.mockImplementation(() => webSocketManagerInstance);
87
+ });
88
+
89
+ it('AqmReqs should be defined', async () => {
90
+ webexRequestInstance.request.mockResolvedValueOnce(mockWebexRequestResolvedValue);
91
+
92
+ const req = aqm.req(() => ({
93
+ url: '/url',
94
+ timeout: 2000,
95
+ notifSuccess: {
96
+ bind: {
97
+ type: 'RoutingMessage',
98
+ data: { type: 'AgentConsultConferenced', interactionId: 'intrid' },
99
+ },
100
+ msg: {},
101
+ },
102
+ notifFail: {
103
+ bind: {
104
+ type: 'RoutingMessage',
105
+ data: { type: 'AgentConsultConferenceFailed' },
106
+ },
107
+ errId: 'Service.aqm.contact.consult',
108
+ },
109
+ }));
110
+
111
+ try {
112
+ await req({});
113
+ } catch (e) {
114
+ expect(e).toBeDefined();
115
+ }
116
+ });
117
+
118
+ describe('Aqm notifs', () => {
119
+ it('AqmReqs notifcancel', async () => {
120
+ webexRequestInstance.request.mockResolvedValueOnce(mockWebexRequestResolvedValue);
121
+
122
+ const req = aqm.req(() => ({
123
+ url: '/url',
124
+ timeout: 4000,
125
+ notifSuccess: {
126
+ bind: {
127
+ type: 'RoutingMessage',
128
+ data: {
129
+ type: 'AgentConsultCreated',
130
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9905',
131
+ },
132
+ },
133
+ msg: {},
134
+ },
135
+ notifFail: {
136
+ bind: {
137
+ type: 'RoutingMessage',
138
+ data: { type: 'AgentConsultFailed' },
139
+ },
140
+ errId: 'Service.aqm.contact.consult',
141
+ },
142
+ notifCancel: {
143
+ bind: {
144
+ type: 'RoutingMessage',
145
+ data: {
146
+ type: 'AgentCtqCancelled',
147
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9905',
148
+ },
149
+ },
150
+ msg: {},
151
+ },
152
+ }));
153
+
154
+ try {
155
+ const p = await Promise.all([
156
+ req({}),
157
+ new Promise<void>((resolve) => {
158
+ setTimeout(() => {
159
+ webSocketManagerInstance.emit(
160
+ 'message',
161
+ JSON.stringify({
162
+ type: 'RoutingMessage',
163
+ data: {
164
+ type: 'AgentCtqCancelled',
165
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9905',
166
+ },
167
+ })
168
+ );
169
+ resolve();
170
+ }, 1000);
171
+ }),
172
+ ]);
173
+ expect(p).toBeDefined();
174
+ } catch (e) {}
175
+ });
176
+
177
+ it('AqmReqs notif success', async () => {
178
+ webexRequestInstance.request.mockResolvedValueOnce(mockWebexRequestResolvedValue);
179
+
180
+ const req = aqm.req(() => ({
181
+ url: '/url',
182
+ timeout: 4000,
183
+ notifSuccess: {
184
+ bind: {
185
+ type: 'RoutingMessage',
186
+ data: {
187
+ type: 'AgentConsultCreated',
188
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9906',
189
+ },
190
+ },
191
+ msg: {},
192
+ },
193
+ notifFail: {
194
+ bind: {
195
+ type: 'RoutingMessage',
196
+ data: { type: 'AgentConsultFailed' },
197
+ },
198
+ errId: 'Service.aqm.contact.consult',
199
+ },
200
+ notifCancel: {
201
+ bind: {
202
+ type: 'RoutingMessage',
203
+ data: {
204
+ type: 'AgentCtqCancelled',
205
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9906',
206
+ },
207
+ },
208
+ msg: {},
209
+ },
210
+ }));
211
+
212
+ try {
213
+ const p = await Promise.all([
214
+ req({}),
215
+ new Promise<void>((resolve) => {
216
+ setTimeout(() => {
217
+ webSocketManagerInstance.emit(
218
+ 'message',
219
+ JSON.stringify({
220
+ type: 'RoutingMessage',
221
+ data: {
222
+ type: 'AgentConsultCreated',
223
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9906',
224
+ },
225
+ })
226
+ );
227
+ resolve();
228
+ }, 1000);
229
+ }),
230
+ ]);
231
+ expect(p).toBeDefined();
232
+ } catch (e) {}
233
+ });
234
+
235
+ it('AqmReqs notif success with async error', async () => {
236
+ webexRequestInstance.request.mockRejectedValueOnce(new Error('Async error'));
237
+
238
+ const req = aqm.req(() => ({
239
+ url: '/url',
240
+ timeout: 4000,
241
+ notifSuccess: {
242
+ bind: {
243
+ type: 'RoutingMessage',
244
+ data: {
245
+ type: 'AgentConsultCreated',
246
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9906',
247
+ },
248
+ },
249
+ msg: {},
250
+ },
251
+ notifFail: {
252
+ bind: {
253
+ type: 'RoutingMessage',
254
+ data: { type: 'AgentConsultFailed' },
255
+ },
256
+ errId: 'Service.aqm.contact.consult',
257
+ },
258
+ notifCancel: {
259
+ bind: {
260
+ type: 'RoutingMessage',
261
+ data: {
262
+ type: 'AgentCtqCancelled',
263
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9906',
264
+ },
265
+ },
266
+ msg: {},
267
+ },
268
+ }));
269
+
270
+ try {
271
+ await req({});
272
+ } catch (e) {
273
+ expect(e).toBeDefined();
274
+ }
275
+ });
276
+
277
+ it('AqmReqs notif fail', async () => {
278
+ webexRequestInstance.request.mockResolvedValueOnce(mockWebexRequestResolvedValue);
279
+
280
+ const req = aqm.req(() => ({
281
+ url: '/url',
282
+ timeout: 4000,
283
+ notifSuccess: {
284
+ bind: {
285
+ type: 'RoutingMessage',
286
+ data: {
287
+ type: 'AgentConsultCreated',
288
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9907',
289
+ },
290
+ },
291
+ msg: {},
292
+ },
293
+ notifFail: {
294
+ bind: {
295
+ type: 'RoutingMessage',
296
+ data: { type: 'AgentConsultFailed' },
297
+ },
298
+ errId: 'Service.aqm.contact.consult',
299
+ },
300
+ notifCancel: {
301
+ bind: {
302
+ type: 'RoutingMessage',
303
+ data: {
304
+ type: 'AgentCtqCancelled',
305
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9907',
306
+ },
307
+ },
308
+ msg: {},
309
+ },
310
+ }));
311
+
312
+ try {
313
+ const p = await Promise.all([
314
+ req({}),
315
+ new Promise<void>((resolve) => {
316
+ setTimeout(() => {
317
+ webSocketManagerInstance.emit(
318
+ 'message',
319
+ JSON.stringify({
320
+ type: 'RoutingMessage',
321
+ data: {
322
+ type: 'AgentConsultFailed',
323
+ interactionId: '6920dda3-337a-48b1-b82d-2333392f9907',
324
+ },
325
+ })
326
+ );
327
+ resolve();
328
+ }, 1000);
329
+ }),
330
+ ]);
331
+ expect(p).toBeDefined();
332
+ } catch (e) {}
333
+ });
334
+ });
335
+
336
+ describe('Event tests', () => {
337
+ it('should handle onMessage events', async () => {
338
+ webexRequestInstance.request.mockResolvedValueOnce(mockWebexRequestResolvedValue);
339
+
340
+ const req = aqm.req(() => ({
341
+ url: '/url',
342
+ timeout: 2000,
343
+ notifSuccess: {
344
+ bind: {
345
+ type: 'RoutingMessage',
346
+ data: { type: 'AgentConsultConferenced', interactionId: 'intrid' },
347
+ },
348
+ msg: {},
349
+ },
350
+ notifFail: {
351
+ bind: {
352
+ type: 'RoutingMessage',
353
+ data: { type: 'AgentConsultConferenceFailed' },
354
+ },
355
+ errId: 'Service.aqm.contact.consult',
356
+ },
357
+ }));
358
+
359
+ try {
360
+ await req({});
361
+ } catch (e) {
362
+ expect(e).toBeDefined();
363
+ }
364
+
365
+ // Welcome event
366
+ webSocketManagerInstance.emit(
367
+ 'message',
368
+ JSON.stringify({
369
+ type: 'Welcome',
370
+ data: { type: 'WelcomeEvent' },
371
+ })
372
+ );
373
+
374
+ expect(LoggerProxy.info).toHaveBeenCalledWith("Welcome message from Notifs Websocket", {"method": "onMessage", "module": AQM_REQS_FILE});
375
+
376
+ // Keep-alive events
377
+ webSocketManagerInstance.emit(
378
+ 'message',
379
+ JSON.stringify({
380
+ keepalive: 'true',
381
+ data: { type: 'KeepaliveEvent' },
382
+ })
383
+ );
384
+
385
+ expect(LoggerProxy.info).toHaveBeenCalledWith('Keepalive from web socket', {"method": "onMessage", "module": AQM_REQS_FILE});
386
+
387
+ // Unhandled event
388
+ webSocketManagerInstance.emit(
389
+ 'message',
390
+ JSON.stringify({
391
+ type: 'UnhandledMessage',
392
+ data: { type: 'UnhandledEvent' },
393
+ })
394
+ );
395
+
396
+ expect(LoggerProxy.info).toHaveBeenCalledWith(
397
+ 'event=missingEventHandler | [AqmReqs] missing routing message handler', {"method": "onMessage", "module": AQM_REQS_FILE}
398
+ );
399
+ });
400
+
401
+ it('should correctly print bind object', () => {
402
+ const bind = {
403
+ type: 'RoutingMessage',
404
+ data: {
405
+ type: 'AgentConsultCreated',
406
+ interactionId: 'intrid',
407
+ },
408
+ };
409
+ const result = aqm['bindPrint'](bind);
410
+ expect(result).toBe(
411
+ 'type=RoutingMessage,data=(type=AgentConsultCreated,interactionId=intrid)'
412
+ );
413
+ });
414
+
415
+ it('should correctly check bind object', () => {
416
+ const bind = {
417
+ type: 'RoutingMessage',
418
+ data: {
419
+ type: 'AgentConsultCreated',
420
+ interactionId: 'intrid',
421
+ },
422
+ };
423
+ const msg = {
424
+ type: 'RoutingMessage',
425
+ data: {
426
+ type: 'AgentConsultCreated',
427
+ interactionId: 'intrid',
428
+ },
429
+ };
430
+ const result = aqm['bindCheck'](bind, msg);
431
+ expect(result).toBe(true);
432
+ });
433
+
434
+ it('should return false when message value does not match any of the values in the array', () => {
435
+ const bind = {
436
+ type: 'RoutingMessage',
437
+ data: {
438
+ type: ['AgentConsultCreated', 'AgentConsultFailed'],
439
+ interactionId: 'intrid',
440
+ },
441
+ };
442
+ const msg = {
443
+ type: 'RoutingMessage',
444
+ data: {
445
+ type: 'AgentConsultConferenced', // This value does not match any value in the bind array
446
+ interactionId: 'intrid',
447
+ },
448
+ };
449
+ const result = aqm['bindCheck'](bind, msg);
450
+ expect(result).toBe(false);
451
+ });
452
+
453
+ it('should handle reqEmpty', async () => {
454
+ webexRequestInstance.request.mockResolvedValueOnce(mockWebexRequestResolvedValue);
455
+
456
+ const reqEmpty = aqm.reqEmpty(() => ({
457
+ url: '/url',
458
+ timeout: 2000,
459
+ notifSuccess: {
460
+ bind: {
461
+ type: 'RoutingMessage',
462
+ data: { type: 'AgentConsultConferenced', interactionId: 'intrid' },
463
+ },
464
+ msg: {},
465
+ },
466
+ notifFail: {
467
+ bind: {
468
+ type: 'RoutingMessage',
469
+ data: { type: 'AgentConsultConferenceFailed' },
470
+ },
471
+ errId: 'Service.aqm.contact.consult',
472
+ },
473
+ }));
474
+
475
+ try {
476
+ await reqEmpty();
477
+ } catch (e) {
478
+ expect(e).toBeDefined();
479
+ }
480
+ });
481
+
482
+ it('should handle failed request with err function', async () => {
483
+ webexRequestInstance.request.mockResolvedValueOnce(mockWebexRequestResolvedValue);
484
+
485
+ const conf = {
486
+ host: 'fake-host',
487
+ url: '/url',
488
+ method: 'POST',
489
+ data: {},
490
+ notifSuccess: {
491
+ bind: {
492
+ type: 'RoutingMessage',
493
+ data: { type: 'AgentConsultCreated', interactionId: 'intrid' },
494
+ },
495
+ },
496
+ notifFail: {
497
+ bind: {
498
+ type: 'RoutingMessage',
499
+ data: { type: 'AgentConsultFailed' },
500
+ },
501
+ err: (msg: any) => new Error('Custom error'),
502
+ },
503
+ };
504
+
505
+ const promise = aqm['createPromise'](conf);
506
+ global.setTimeout(() => {
507
+ webSocketManagerInstance.emit(
508
+ 'message',
509
+ JSON.stringify({
510
+ type: 'RoutingMessage',
511
+ data: {
512
+ type: 'AgentConsultFailed',
513
+ interactionId: 'intrid',
514
+ },
515
+ })
516
+ );
517
+ }, 0);
518
+
519
+ await expect(promise).rejects.toThrow('Custom error');
520
+ });
521
+
522
+ it('should handle request with notifCancel', async () => {
523
+ webexRequestInstance.request.mockResolvedValueOnce(mockWebexRequestResolvedValue);
524
+
525
+ const conf = {
526
+ host: 'fake-host',
527
+ url: '/url',
528
+ method: 'POST',
529
+ data: {},
530
+ notifSuccess: {
531
+ bind: {
532
+ type: 'RoutingMessage',
533
+ data: { type: 'AgentConsultCreated', interactionId: 'intrid' },
534
+ },
535
+ },
536
+ notifFail: {
537
+ bind: {
538
+ type: 'RoutingMessage',
539
+ data: { type: 'AgentConsultFailed' },
540
+ },
541
+ errId: 'Service.aqm.contact.consult',
542
+ },
543
+ notifCancel: {
544
+ bind: {
545
+ type: 'RoutingMessage',
546
+ data: { type: 'AgentCtqCancelled', interactionId: 'intrid' },
547
+ },
548
+ },
549
+ };
550
+
551
+ const promise = aqm['createPromise'](conf);
552
+ const eventData = {
553
+ type: 'RoutingMessage',
554
+ data: {
555
+ type: 'AgentCtqCancelled',
556
+ interactionId: 'intrid',
557
+ },
558
+ };
559
+ global.setTimeout(() => {
560
+ webSocketManagerInstance.emit(
561
+ 'message',
562
+ JSON.stringify(eventData)
563
+ );
564
+ }, 0);
565
+
566
+ const result = await promise;
567
+ expect(result).toEqual(eventData);
568
+ });
569
+ });
570
+ });