@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,279 @@
1
+ import * as Utils from '../../../../../src/services/core/Utils';
2
+ import LoggerProxy from '../../../../../src/logger-proxy';
3
+ import WebexRequest from '../../../../../src/services/core/WebexRequest';
4
+ import {LoginOption, WebexRequestPayload} from '../../../../../src/types';
5
+ import {Failure} from '../../../../../src/services/core/GlobalTypes';
6
+
7
+ // Mock dependencies
8
+ jest.mock('../../../../../src/logger-proxy', () => ({
9
+ __esModule: true,
10
+ default: {
11
+ log: jest.fn(),
12
+ error: jest.fn(),
13
+ info: jest.fn(),
14
+ initialize: jest.fn(),
15
+ },
16
+ }));
17
+
18
+ jest.mock('../../../../../src/services/core/WebexRequest', () => ({
19
+ __esModule: true,
20
+ default: {
21
+ getInstance: jest.fn().mockReturnValue({
22
+ uploadLogs: jest.fn(),
23
+ }),
24
+ },
25
+ }));
26
+
27
+ // Mock Err module
28
+ jest.mock('../../../../../src/services/core/Err', () => {
29
+ return {
30
+ __esModule: true,
31
+ Details: class Details {
32
+ code: string;
33
+ data: any;
34
+ constructor(code: string, data: any) {
35
+ this.code = code;
36
+ this.data = data;
37
+ }
38
+ },
39
+ };
40
+ });
41
+
42
+ describe('Utils', () => {
43
+ beforeEach(() => {
44
+ jest.clearAllMocks();
45
+ });
46
+
47
+ // Skip getCommonErrorDetails tests as it's a private function
48
+ // and we'll test its behavior through createErrDetailsObject instead
49
+
50
+ describe('getErrorDetails', () => {
51
+ const methodName = 'testMethod';
52
+ const moduleName = 'testModule';
53
+
54
+ it('should extract reason from error details', () => {
55
+ const error = {
56
+ details: {
57
+ data: {
58
+ reason: 'Test reason',
59
+ },
60
+ trackingId: 'test-tracking-id',
61
+ },
62
+ };
63
+
64
+ const result = Utils.getErrorDetails(error, methodName, moduleName);
65
+
66
+ expect(result).toEqual({
67
+ error: new Error('Test reason'),
68
+ reason: 'Test reason',
69
+ });
70
+ expect(LoggerProxy.error).toHaveBeenCalledWith(
71
+ `${methodName} failed with reason: ${error.details.data.reason}`,
72
+ {module: moduleName, method: methodName, trackingId: 'test-tracking-id'}
73
+ );
74
+ });
75
+
76
+ it('should use default reason when reason is not provided', () => {
77
+ const error = {
78
+ details: {
79
+ data: {},
80
+ trackingId: 'test-tracking-id',
81
+ },
82
+ };
83
+
84
+ const result = Utils.getErrorDetails(error, methodName, moduleName);
85
+
86
+ expect(result).toEqual({
87
+ error: new Error(`Error while performing ${methodName}`),
88
+ reason: `Error while performing ${methodName}`,
89
+ });
90
+ });
91
+
92
+ it('should not upload logs when reason is AGENT_NOT_FOUND and method is silentReLogin', () => {
93
+ const error = {
94
+ details: {
95
+ data: {
96
+ reason: 'AGENT_NOT_FOUND',
97
+ trackingId: 'test-tracking-id',
98
+ },
99
+ },
100
+ };
101
+
102
+ Utils.getErrorDetails(error, 'silentRelogin', moduleName);
103
+
104
+ expect(LoggerProxy.error).not.toHaveBeenCalled();
105
+ expect(WebexRequest.getInstance().uploadLogs).not.toHaveBeenCalled();
106
+ });
107
+
108
+ it('should upload logs for normal error scenarios', () => {
109
+ const trackingId = 'normal-error-tracking-id';
110
+ const error = {
111
+ details: {
112
+ data: {
113
+ reason: 'SOME_OTHER_ERROR',
114
+ trackingId: trackingId,
115
+ },
116
+ trackingId: trackingId,
117
+ },
118
+ };
119
+
120
+ Utils.getErrorDetails(error, 'someMethod', moduleName);
121
+
122
+ expect(LoggerProxy.error).toHaveBeenCalledWith(
123
+ `someMethod failed with reason: ${error.details.data.reason}`,
124
+ {module: moduleName, method: 'someMethod', trackingId: trackingId}
125
+ );
126
+ expect(WebexRequest.getInstance().uploadLogs).toHaveBeenCalledWith({
127
+ correlationId: trackingId,
128
+ });
129
+ });
130
+
131
+ it('should handle null or undefined error object gracefully', () => {
132
+ // This should throw an error because the function tries to access error.details
133
+ expect(() => {
134
+ Utils.getErrorDetails(null, methodName, moduleName);
135
+ }).toThrow(TypeError);
136
+
137
+ expect(() => {
138
+ Utils.getErrorDetails(undefined, methodName, moduleName);
139
+ }).toThrow(TypeError);
140
+ });
141
+
142
+ it('should handle error objects with unexpected structure', () => {
143
+ const unexpectedError = {
144
+ // No details property
145
+ message: 'Unexpected error structure',
146
+ code: 500,
147
+ };
148
+
149
+ const result = Utils.getErrorDetails(unexpectedError, methodName, moduleName);
150
+
151
+ // Should use default error message when structure is unexpected
152
+ expect(result).toEqual({
153
+ error: new Error(`Error while performing ${methodName}`),
154
+ reason: `Error while performing ${methodName}`,
155
+ });
156
+
157
+ // Should not throw when accessing properties with optional chaining
158
+ expect(LoggerProxy.error).toHaveBeenCalledWith(
159
+ `${methodName} failed with reason: Error while performing ${methodName}`,
160
+ {module: moduleName, method: methodName, trackingId: undefined}
161
+ );
162
+ });
163
+
164
+ it('should prioritize trackingId from the correct location when present in multiple places', () => {
165
+ const detailsTrackingId = 'details-level-tracking-id';
166
+ const dataTrackingId = 'data-level-tracking-id';
167
+
168
+ const error = {
169
+ details: {
170
+ data: {
171
+ reason: 'TEST_REASON',
172
+ trackingId: dataTrackingId, // This should be used for uploadLogs
173
+ },
174
+ trackingId: detailsTrackingId, // This should be used for error logging
175
+ },
176
+ };
177
+
178
+ Utils.getErrorDetails(error, methodName, moduleName);
179
+
180
+ // Check if error logging uses the trackingId from the details level
181
+ expect(LoggerProxy.error).toHaveBeenCalledWith(
182
+ `${methodName} failed with reason: ${error.details.data.reason}`,
183
+ {module: moduleName, method: methodName, trackingId: detailsTrackingId}
184
+ );
185
+
186
+ // Check if uploadLogs uses the trackingId from the details level
187
+ expect(WebexRequest.getInstance().uploadLogs).toHaveBeenCalledWith({
188
+ correlationId: detailsTrackingId,
189
+ });
190
+ });
191
+ });
192
+
193
+ describe('createErrDetailsObject', () => {
194
+ it('should create error details object with correct parameters', () => {
195
+ const errObj: WebexRequestPayload = {
196
+ headers: {trackingid: 'test-tracking-id'},
197
+ body: {message: 'Error message'},
198
+ };
199
+
200
+ const result = Utils.createErrDetailsObject(errObj);
201
+
202
+ expect(result.code).toBe('Service.reqs.generic.failure');
203
+ expect(result.data).toEqual({
204
+ trackingId: 'test-tracking-id',
205
+ msg: {message: 'Error message'},
206
+ });
207
+ });
208
+
209
+ it('should handle missing data in error payload', () => {
210
+ const errObj: WebexRequestPayload = {};
211
+
212
+ const result = Utils.createErrDetailsObject(errObj);
213
+
214
+ expect(result.code).toBe('Service.reqs.generic.failure');
215
+ expect(result.data).toEqual({
216
+ trackingId: undefined,
217
+ msg: undefined,
218
+ });
219
+ });
220
+ });
221
+
222
+ describe('getStationLoginErrorData', () => {
223
+ it('should return DUPLICATE_LOCATION message and fieldName for extension', () => {
224
+ const failure = {data: {reason: 'DUPLICATE_LOCATION'}} as Failure;
225
+ const result = Utils.getStationLoginErrorData(failure, LoginOption.EXTENSION);
226
+ expect(result).toEqual({
227
+ message: 'This extension is already in use',
228
+ fieldName: LoginOption.EXTENSION,
229
+ });
230
+ });
231
+
232
+ it('should return DUPLICATE_LOCATION message and fieldName for DN number', () => {
233
+ const failure = {data: {reason: 'DUPLICATE_LOCATION'}} as Failure;
234
+ const result = Utils.getStationLoginErrorData(failure, LoginOption.AGENT_DN);
235
+ expect(result).toEqual({
236
+ message:
237
+ 'Dial number is in use. Try a different one. For help, reach out to your administrator or support team.',
238
+ fieldName: LoginOption.AGENT_DN,
239
+ });
240
+ });
241
+
242
+ it('should return INVALID_DIAL_NUMBER message and fieldName', () => {
243
+ const failure = {data: {reason: 'INVALID_DIAL_NUMBER'}} as Failure;
244
+ const result = Utils.getStationLoginErrorData(failure, LoginOption.AGENT_DN);
245
+ expect(result).toEqual({
246
+ message:
247
+ 'Enter a valid US dial number. For help, reach out to your administrator or support team.',
248
+ fieldName: LoginOption.AGENT_DN,
249
+ });
250
+ });
251
+
252
+ it('should return default message and fieldName for empty reason', () => {
253
+ const failure = {data: {reason: ''}} as Failure;
254
+ const result = Utils.getStationLoginErrorData(failure, LoginOption.EXTENSION);
255
+ expect(result).toEqual({
256
+ message: 'An error occurred while logging in to the station',
257
+ fieldName: 'generic',
258
+ });
259
+ });
260
+
261
+ it('should return default message and fieldName for missing reason', () => {
262
+ const failure = {data: {}} as Failure;
263
+ const result = Utils.getStationLoginErrorData(failure, LoginOption.EXTENSION);
264
+ expect(result).toEqual({
265
+ message: 'An error occurred while logging in to the station',
266
+ fieldName: 'generic',
267
+ });
268
+ });
269
+
270
+ it('should return default message and fieldName for unknown reason', () => {
271
+ const failure = {data: {reason: 'UNKNOWN_REASON'}} as Failure;
272
+ const result = Utils.getStationLoginErrorData(failure, LoginOption.EXTENSION);
273
+ expect(result).toEqual({
274
+ message: 'An error occurred while logging in to the station',
275
+ fieldName: 'generic',
276
+ });
277
+ });
278
+ });
279
+ });
@@ -0,0 +1,144 @@
1
+ import WebexRequest from '../../../../../src/services/core/WebexRequest';
2
+ import {HTTP_METHODS, WebexSDK} from '../../../../../src/types';
3
+ import {IHttpResponse} from '../../../../../src/types';
4
+ import LoggerProxy from '../../../../../src/logger-proxy';
5
+ import {WEBEX_REQUEST_FILE} from '../../../../../src/constants';
6
+ import MetricsManager from '../../../../../src/metrics/MetricsManager';
7
+ const mockWebex = {
8
+ request: jest.fn(),
9
+ logger: {
10
+ log: jest.fn(),
11
+ error: jest.fn(),
12
+ },
13
+ } as unknown as WebexSDK;
14
+
15
+ // Cast the request function to a Jest mock function
16
+ const mockRequest = mockWebex.request as jest.Mock;
17
+
18
+ jest.mock('../../../../../src/logger-proxy', () => ({
19
+ __esModule: true,
20
+ default: {
21
+ log: jest.fn(),
22
+ error: jest.fn(),
23
+ info: jest.fn(),
24
+ initialize: jest.fn(),
25
+ },
26
+ }));
27
+
28
+ beforeEach(() => {
29
+ jest.clearAllMocks();
30
+ });
31
+
32
+ describe('WebexRequest', () => {
33
+ let webexRequest;
34
+ beforeEach(() => {
35
+ webexRequest = WebexRequest.getInstance({webex: mockWebex});
36
+ });
37
+
38
+ describe('request', () => {
39
+ it('should send a request and return the response', async () => {
40
+ const mockResponse: IHttpResponse = {
41
+ statusCode: 200,
42
+ body: { message: 'Success' },
43
+ method: 'POST',
44
+ url: 'https://example.com/resource',
45
+ };
46
+
47
+ mockRequest.mockResolvedValueOnce(mockResponse);
48
+
49
+ const result = await webexRequest.request({
50
+ service: 'service',
51
+ resource: 'resource',
52
+ method: HTTP_METHODS.POST,
53
+ body: { key: 'value' },
54
+ });
55
+
56
+ expect(result).toEqual(mockResponse);
57
+ expect(mockRequest).toHaveBeenCalledWith({
58
+ service: 'service',
59
+ resource: 'resource',
60
+ method: HTTP_METHODS.POST,
61
+ body: { key: 'value' },
62
+ });
63
+ });
64
+
65
+ it('should log and throw an error if the request fails', async () => {
66
+ const mockError = new Error('Request failed');
67
+ mockRequest.mockRejectedValueOnce(mockError);
68
+
69
+ await expect(
70
+ webexRequest.request({
71
+ service: 'service',
72
+ resource: 'resource',
73
+ method: HTTP_METHODS.POST,
74
+ body: { key: 'value' },
75
+ })
76
+ ).rejects.toThrow('Request failed');
77
+ });
78
+ });
79
+
80
+ describe('uploadLogs', () => {
81
+ let mockMetricsManager;
82
+ beforeEach(() => {
83
+ // Mock the crypto.randomUUID function
84
+ global.crypto = {
85
+ randomUUID: jest.fn().mockReturnValue("mocked-uuid-12345")
86
+ } as unknown as Crypto;
87
+
88
+ mockMetricsManager = {
89
+ trackEvent: jest.fn(),
90
+ timeEvent: jest.fn(),
91
+ };
92
+
93
+ jest.spyOn(MetricsManager, 'getInstance').mockReturnValue(mockMetricsManager);
94
+
95
+ });
96
+
97
+ it('should upload logs and return the response', async () => {
98
+ const mockMetaData = { key: 'value' };
99
+ const mockResponse = { trackingid: '1234'};
100
+
101
+ mockWebex.internal = {
102
+ support: {
103
+ submitLogs: jest.fn().mockResolvedValueOnce(mockResponse),
104
+ },
105
+ };
106
+
107
+ const result = await webexRequest.uploadLogs(mockMetaData);
108
+
109
+ expect(result).toEqual({...mockResponse, feedbackId: "mocked-uuid-12345"});
110
+ expect(LoggerProxy.info).toHaveBeenCalledWith(
111
+ `Logs uploaded successfully with feedbackId: mocked-uuid-12345`,
112
+ {module: WEBEX_REQUEST_FILE, method: 'uploadLogs'}
113
+ );
114
+ expect(mockMetricsManager.trackEvent).toBeCalledWith(
115
+ "Upload Logs Success",
116
+ {feedbackId: "mocked-uuid-12345", trackingId: '1234'},
117
+ ["behavioral"]
118
+ );
119
+ expect(mockWebex.internal.support.submitLogs).toHaveBeenCalledWith({... mockMetaData, feedbackId: "mocked-uuid-12345"}, undefined, {type: 'diff'});
120
+ });
121
+
122
+ it('should log and throw an error if the upload fails', async () => {
123
+ const mockMetaData = { key: 'value' , correlationId: 'correlation-id' };
124
+ const mockError = new Error('Upload failed');
125
+ mockError.stack = "My stack"
126
+ mockWebex.internal = {
127
+ support: {
128
+ submitLogs: jest.fn().mockRejectedValueOnce(mockError),
129
+ },
130
+ };
131
+
132
+ await expect(webexRequest.uploadLogs(mockMetaData)).rejects.toThrow('Upload failed');
133
+ expect(LoggerProxy.error).toHaveBeenCalledWith(
134
+ `Error uploading logs: ${mockError}`,
135
+ {module: WEBEX_REQUEST_FILE, method: 'uploadLogs'}
136
+ );
137
+ expect(mockMetricsManager.trackEvent).toBeCalledWith(
138
+ "Upload Logs Failed",
139
+ {stack: "My stack", feedbackId: "mocked-uuid-12345", correlationId: 'correlation-id'},
140
+ ["behavioral"]
141
+ );
142
+ });
143
+ });
144
+ });