@webex/calling 3.11.0 → 3.12.0

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 (188) hide show
  1. package/dist/CallHistory/CallHistory.js +596 -0
  2. package/dist/CallHistory/CallHistory.js.map +1 -0
  3. package/dist/CallHistory/CallHistory.test.js +916 -0
  4. package/dist/CallHistory/CallHistory.test.js.map +1 -0
  5. package/dist/CallHistory/callHistoryFixtures.js +650 -0
  6. package/dist/CallHistory/callHistoryFixtures.js.map +1 -0
  7. package/dist/CallHistory/constants.js +38 -0
  8. package/dist/CallHistory/constants.js.map +1 -0
  9. package/dist/CallHistory/types.js +7 -0
  10. package/dist/CallHistory/types.js.map +1 -0
  11. package/dist/CallSettings/CallSettings.js +311 -0
  12. package/dist/CallSettings/CallSettings.js.map +1 -0
  13. package/dist/CallSettings/CallSettings.test.js +122 -0
  14. package/dist/CallSettings/CallSettings.test.js.map +1 -0
  15. package/dist/CallSettings/UcmBackendConnector.js +308 -0
  16. package/dist/CallSettings/UcmBackendConnector.js.map +1 -0
  17. package/dist/CallSettings/UcmBackendConnector.test.js +411 -0
  18. package/dist/CallSettings/UcmBackendConnector.test.js.map +1 -0
  19. package/dist/CallSettings/WxCallBackendConnector.js +597 -0
  20. package/dist/CallSettings/WxCallBackendConnector.js.map +1 -0
  21. package/dist/CallSettings/WxCallBackendConnector.test.js +904 -0
  22. package/dist/CallSettings/WxCallBackendConnector.test.js.map +1 -0
  23. package/dist/CallSettings/constants.js +31 -0
  24. package/dist/CallSettings/constants.js.map +1 -0
  25. package/dist/CallSettings/testFixtures.js +68 -0
  26. package/dist/CallSettings/testFixtures.js.map +1 -0
  27. package/dist/CallSettings/types.js +7 -0
  28. package/dist/CallSettings/types.js.map +1 -0
  29. package/dist/CallingClient/CallingClient.js +1119 -0
  30. package/dist/CallingClient/CallingClient.js.map +1 -0
  31. package/dist/CallingClient/CallingClient.test.js +1266 -0
  32. package/dist/CallingClient/CallingClient.test.js.map +1 -0
  33. package/dist/CallingClient/callRecordFixtures.js +101 -0
  34. package/dist/CallingClient/callRecordFixtures.js.map +1 -0
  35. package/dist/CallingClient/calling/CallerId/index.js +275 -0
  36. package/dist/CallingClient/calling/CallerId/index.js.map +1 -0
  37. package/dist/CallingClient/calling/CallerId/index.test.js +275 -0
  38. package/dist/CallingClient/calling/CallerId/index.test.js.map +1 -0
  39. package/dist/CallingClient/calling/CallerId/types.js +7 -0
  40. package/dist/CallingClient/calling/CallerId/types.js.map +1 -0
  41. package/dist/CallingClient/calling/call.js +3486 -0
  42. package/dist/CallingClient/calling/call.js.map +1 -0
  43. package/dist/CallingClient/calling/call.test.js +3612 -0
  44. package/dist/CallingClient/calling/call.test.js.map +1 -0
  45. package/dist/CallingClient/calling/callManager.js +460 -0
  46. package/dist/CallingClient/calling/callManager.js.map +1 -0
  47. package/dist/CallingClient/calling/callManager.test.js +741 -0
  48. package/dist/CallingClient/calling/callManager.test.js.map +1 -0
  49. package/dist/CallingClient/calling/index.js +30 -0
  50. package/dist/CallingClient/calling/index.js.map +1 -0
  51. package/dist/CallingClient/calling/types.js +74 -0
  52. package/dist/CallingClient/calling/types.js.map +1 -0
  53. package/dist/CallingClient/callingClientFixtures.js +143 -0
  54. package/dist/CallingClient/callingClientFixtures.js.map +1 -0
  55. package/dist/CallingClient/constants.js +243 -0
  56. package/dist/CallingClient/constants.js.map +1 -0
  57. package/dist/CallingClient/line/index.js +332 -0
  58. package/dist/CallingClient/line/index.js.map +1 -0
  59. package/dist/CallingClient/line/line.test.js +327 -0
  60. package/dist/CallingClient/line/line.test.js.map +1 -0
  61. package/dist/CallingClient/line/types.js +21 -0
  62. package/dist/CallingClient/line/types.js.map +1 -0
  63. package/dist/CallingClient/registration/index.js +19 -0
  64. package/dist/CallingClient/registration/index.js.map +1 -0
  65. package/dist/CallingClient/registration/register.js +1686 -0
  66. package/dist/CallingClient/registration/register.js.map +1 -0
  67. package/dist/CallingClient/registration/register.test.js +1885 -0
  68. package/dist/CallingClient/registration/register.test.js.map +1 -0
  69. package/dist/CallingClient/registration/registerFixtures.js +36 -0
  70. package/dist/CallingClient/registration/registerFixtures.js.map +1 -0
  71. package/dist/CallingClient/registration/types.js +7 -0
  72. package/dist/CallingClient/registration/types.js.map +1 -0
  73. package/dist/CallingClient/registration/webWorker.js +130 -0
  74. package/dist/CallingClient/registration/webWorker.js.map +1 -0
  75. package/dist/CallingClient/registration/webWorker.test.js +303 -0
  76. package/dist/CallingClient/registration/webWorker.test.js.map +1 -0
  77. package/dist/CallingClient/registration/webWorkerStr.js +15 -0
  78. package/dist/CallingClient/registration/webWorkerStr.js.map +1 -0
  79. package/dist/CallingClient/types.js +7 -0
  80. package/dist/CallingClient/types.js.map +1 -0
  81. package/dist/CallingClient/windowsChromiumIceWarmupUtils.js +142 -0
  82. package/dist/CallingClient/windowsChromiumIceWarmupUtils.js.map +1 -0
  83. package/dist/Contacts/ContactsClient.js +1206 -0
  84. package/dist/Contacts/ContactsClient.js.map +1 -0
  85. package/dist/Contacts/ContactsClient.test.js +1004 -0
  86. package/dist/Contacts/ContactsClient.test.js.map +1 -0
  87. package/dist/Contacts/constants.js +40 -0
  88. package/dist/Contacts/constants.js.map +1 -0
  89. package/dist/Contacts/contactFixtures.js +430 -0
  90. package/dist/Contacts/contactFixtures.js.map +1 -0
  91. package/dist/Contacts/types.js +43 -0
  92. package/dist/Contacts/types.js.map +1 -0
  93. package/dist/Errors/catalog/CallError.js +89 -0
  94. package/dist/Errors/catalog/CallError.js.map +1 -0
  95. package/dist/Errors/catalog/CallingDeviceError.js +83 -0
  96. package/dist/Errors/catalog/CallingDeviceError.js.map +1 -0
  97. package/dist/Errors/catalog/ExtendedError.js +42 -0
  98. package/dist/Errors/catalog/ExtendedError.js.map +1 -0
  99. package/dist/Errors/catalog/LineError.js +85 -0
  100. package/dist/Errors/catalog/LineError.js.map +1 -0
  101. package/dist/Errors/index.js +28 -0
  102. package/dist/Errors/index.js.map +1 -0
  103. package/dist/Errors/types.js +59 -0
  104. package/dist/Errors/types.js.map +1 -0
  105. package/dist/Events/impl/index.js +79 -0
  106. package/dist/Events/impl/index.js.map +1 -0
  107. package/dist/Events/types.js +107 -0
  108. package/dist/Events/types.js.map +1 -0
  109. package/dist/Logger/index.js +228 -0
  110. package/dist/Logger/index.js.map +1 -0
  111. package/dist/Logger/index.test.js +87 -0
  112. package/dist/Logger/index.test.js.map +1 -0
  113. package/dist/Logger/types.js +34 -0
  114. package/dist/Logger/types.js.map +1 -0
  115. package/dist/Metrics/index.js +534 -0
  116. package/dist/Metrics/index.js.map +1 -0
  117. package/dist/Metrics/index.test.js +463 -0
  118. package/dist/Metrics/index.test.js.map +1 -0
  119. package/dist/Metrics/types.js +64 -0
  120. package/dist/Metrics/types.js.map +1 -0
  121. package/dist/SDKConnector/index.js +102 -0
  122. package/dist/SDKConnector/index.js.map +1 -0
  123. package/dist/SDKConnector/index.test.js +9 -0
  124. package/dist/SDKConnector/index.test.js.map +1 -0
  125. package/dist/SDKConnector/types.js +7 -0
  126. package/dist/SDKConnector/types.js.map +1 -0
  127. package/dist/SDKConnector/utils.js +39 -0
  128. package/dist/SDKConnector/utils.js.map +1 -0
  129. package/dist/SDKConnector/utils.test.js +9 -0
  130. package/dist/SDKConnector/utils.test.js.map +1 -0
  131. package/dist/Voicemail/BroadworksBackendConnector.js +699 -0
  132. package/dist/Voicemail/BroadworksBackendConnector.js.map +1 -0
  133. package/dist/Voicemail/BroadworksBackendConnector.test.js +820 -0
  134. package/dist/Voicemail/BroadworksBackendConnector.test.js.map +1 -0
  135. package/dist/Voicemail/UcmBackendConnector.js +628 -0
  136. package/dist/Voicemail/UcmBackendConnector.js.map +1 -0
  137. package/dist/Voicemail/UcmBackendConnector.test.js +738 -0
  138. package/dist/Voicemail/UcmBackendConnector.test.js.map +1 -0
  139. package/dist/Voicemail/Voicemail.js +472 -0
  140. package/dist/Voicemail/Voicemail.js.map +1 -0
  141. package/dist/Voicemail/Voicemail.test.js +391 -0
  142. package/dist/Voicemail/Voicemail.test.js.map +1 -0
  143. package/dist/Voicemail/WxCallBackendConnector.js +657 -0
  144. package/dist/Voicemail/WxCallBackendConnector.js.map +1 -0
  145. package/dist/Voicemail/WxCallBackendConnector.test.js +1225 -0
  146. package/dist/Voicemail/WxCallBackendConnector.test.js.map +1 -0
  147. package/dist/Voicemail/constants.js +61 -0
  148. package/dist/Voicemail/constants.js.map +1 -0
  149. package/dist/Voicemail/types.js +7 -0
  150. package/dist/Voicemail/types.js.map +1 -0
  151. package/dist/Voicemail/voicemailFixture.js +524 -0
  152. package/dist/Voicemail/voicemailFixture.js.map +1 -0
  153. package/dist/api.js +157 -0
  154. package/dist/api.js.map +1 -0
  155. package/dist/common/Utils.js +1483 -0
  156. package/dist/common/Utils.js.map +1 -0
  157. package/dist/common/Utils.test.js +1989 -0
  158. package/dist/common/Utils.test.js.map +1 -0
  159. package/dist/common/constants.js +62 -0
  160. package/dist/common/constants.js.map +1 -0
  161. package/dist/common/index.js +19 -0
  162. package/dist/common/index.js.map +1 -0
  163. package/dist/common/testUtil.js +983 -0
  164. package/dist/common/testUtil.js.map +1 -0
  165. package/dist/common/types.js +75 -0
  166. package/dist/common/types.js.map +1 -0
  167. package/dist/index.js +321 -0
  168. package/dist/index.js.map +1 -0
  169. package/dist/module/CallHistory/CallHistory.js +28 -17
  170. package/dist/module/CallingClient/CallingClient.js +43 -1
  171. package/dist/module/CallingClient/calling/call.js +3 -2
  172. package/dist/module/CallingClient/constants.js +2 -0
  173. package/dist/module/CallingClient/registration/register.js +8 -0
  174. package/dist/types/CallHistory/CallHistory.d.ts.map +1 -1
  175. package/dist/types/CallingClient/CallingClient.d.ts +2 -1
  176. package/dist/types/CallingClient/CallingClient.d.ts.map +1 -1
  177. package/dist/types/CallingClient/calling/call.d.ts.map +1 -1
  178. package/dist/types/CallingClient/constants.d.ts +2 -0
  179. package/dist/types/CallingClient/constants.d.ts.map +1 -1
  180. package/dist/types/CallingClient/registration/register.d.ts +2 -1
  181. package/dist/types/CallingClient/registration/register.d.ts.map +1 -1
  182. package/dist/types/CallingClient/registration/types.d.ts +2 -1
  183. package/dist/types/CallingClient/registration/types.d.ts.map +1 -1
  184. package/dist/types/CallingClient/types.d.ts +2 -1
  185. package/dist/types/CallingClient/types.d.ts.map +1 -1
  186. package/dist/types/common/types.d.ts +4 -0
  187. package/dist/types/common/types.d.ts.map +1 -1
  188. package/package.json +4 -4
@@ -0,0 +1,1004 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
4
+ var _Object$keys = require("@babel/runtime-corejs2/core-js/object/keys");
5
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
7
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
8
+ var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
9
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
10
+ var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
11
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
12
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
15
+ var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));
16
+ var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
17
+ var _types = require("../common/types");
18
+ var _testUtil = require("../common/testUtil");
19
+ var _types2 = require("../Logger/types");
20
+ var _ContactsClient = require("./ContactsClient");
21
+ var _constants = require("../common/constants");
22
+ var _Logger = _interopRequireDefault(require("../Logger"));
23
+ var _constants2 = require("./constants");
24
+ var utils = _interopRequireWildcard(require("../common/Utils"));
25
+ var _contactFixtures = require("./contactFixtures");
26
+ function _interopRequireWildcard(e, t) { if ("function" == typeof _WeakMap) var r = new _WeakMap(), n = new _WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = _Object$defineProperty) && _Object$getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
27
+ function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
28
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
29
+ describe('ContactClient Tests', function () {
30
+ var webex = (0, _testUtil.getTestUtilsWebex)();
31
+ var contactClient;
32
+
33
+ // eslint-disable-next-line no-underscore-dangle
34
+ var contactServiceUrl = "".concat(webex.internal.services._serviceUrls.contactsService, "/").concat(_constants2.ENCRYPT_FILTER, "/").concat(_constants2.USERS, "/").concat(_constants2.CONTACT_FILTER);
35
+ var scimUrl = "".concat(_constants.WEBEX_API_BTS, "/").concat(_constants.IDENTITY_ENDPOINT_RESOURCE, "/").concat(_constants.SCIM_ENDPOINT_RESOURCE, "/").concat(webex.internal.device.orgId, "/").concat(_constants.SCIM_USER_FILTER, "id%20eq%20%22801bb994-343b-4f6b-97ae-d13c91d4b877%22");
36
+ // eslint-disable-next-line no-underscore-dangle
37
+ var contactServiceGroupUrl = "".concat(webex.internal.services._serviceUrls.contactsService, "/").concat(_constants2.ENCRYPT_FILTER, "/").concat(_constants2.USERS, "/").concat(_constants2.GROUP_FILTER);
38
+ var serviceErrorCodeHandlerSpy = jest.spyOn(utils, 'serviceErrorCodeHandler');
39
+ var uploadLogsSpy = jest.spyOn(utils, 'uploadLogs').mockResolvedValue();
40
+ var failureResponsePayload = {
41
+ statusCode: 503,
42
+ body: {}
43
+ };
44
+ var mockGroupResponse = _contactFixtures.mockContactResponseBodyOne.groups[0];
45
+ beforeEach(function () {
46
+ contactClient = (0, _ContactsClient.createContactsClient)(webex, {
47
+ level: _types2.LOGGER.INFO
48
+ });
49
+ expect(contactClient).toBeTruthy();
50
+ expect(contactClient.getSDKConnector().getWebex()).toBeTruthy();
51
+
52
+ // Set up log spies for each test
53
+ jest.spyOn(_Logger.default, 'info');
54
+ jest.spyOn(_Logger.default, 'log');
55
+ jest.spyOn(_Logger.default, 'warn');
56
+ jest.spyOn(_Logger.default, 'error');
57
+ });
58
+ afterEach(function () {
59
+ webex.request.mockClear();
60
+ jest.clearAllMocks();
61
+ });
62
+
63
+ /**
64
+ * TestCase inputs
65
+ * name: TestCase name
66
+ * payloadData: Response body
67
+ * inputStatusCode: Status code received in response
68
+ * expectedData: Expected data field in ContactResponse after processing
69
+ * expectedMessage: Expected message field in ContactResponse after processing
70
+ * expectedStatusCode: Expected status code field in ContactResponse after processing
71
+ * decryptTextList: Array of decrypted contact list.
72
+ */
73
+ var errorCodes = [{
74
+ name: 'Success case 1: fetch contacts using get contacts api, custom and cloud contact present',
75
+ payloadData: _contactFixtures.mockContactResponseBodyOne,
76
+ inputStatusCode: 200,
77
+ expectedData: {
78
+ contacts: _contactFixtures.mockContactListOne,
79
+ groups: _contactFixtures.mockContactGroupListOne
80
+ },
81
+ expectedMessage: _constants.SUCCESS_MESSAGE,
82
+ expectedStatusCode: 200,
83
+ decryptTextList: [_contactFixtures.mockCity, _contactFixtures.mockCountry, _contactFixtures.mockState, _contactFixtures.mockStreet, _contactFixtures.mockZipCode, _contactFixtures.mockAvatarURL, _contactFixtures.mockCompany, _contactFixtures.mockDisplayNameOne, _contactFixtures.mockEmail, _contactFixtures.mockFirstName, _contactFixtures.mockLastName, _contactFixtures.mockNumber1, _contactFixtures.mockNumber2, _contactFixtures.mockSipAddress, _contactFixtures.mockTitle, _contactFixtures.mockNumber2, _contactFixtures.mockSipAddress, _contactFixtures.mockGroupName],
84
+ cloudContactPresent: true,
85
+ scimResponse: _contactFixtures.mockSCIMListResponse
86
+ }, {
87
+ name: 'Success case 2: fetch contacts using get contacts api, single custom contact with mandatory details present',
88
+ payloadData: _contactFixtures.mockContactResponseBodyTwo,
89
+ inputStatusCode: 200,
90
+ expectedData: {
91
+ contacts: _contactFixtures.mockContactListTwo,
92
+ groups: _contactFixtures.mockContactGroupListTwo
93
+ },
94
+ expectedMessage: _constants.SUCCESS_MESSAGE,
95
+ expectedStatusCode: 200,
96
+ decryptTextList: [_contactFixtures.mockDisplayNameTwo, _contactFixtures.mockGroupName]
97
+ }, {
98
+ name: 'Success case 3: fetch contacts using get contacts api, no contacts returned',
99
+ payloadData: _contactFixtures.mockContactResponseBodyThird,
100
+ inputStatusCode: 200,
101
+ expectedData: {
102
+ contacts: [],
103
+ groups: []
104
+ },
105
+ expectedMessage: _constants.SUCCESS_MESSAGE,
106
+ expectedStatusCode: 200,
107
+ decryptTextList: []
108
+ }, {
109
+ name: 'Failed case: 200 OK with no response body',
110
+ payloadData: undefined,
111
+ inputStatusCode: 200,
112
+ expectedData: {
113
+ error: '422 Exception has occurred'
114
+ },
115
+ expectedMessage: _constants.FAILURE_MESSAGE,
116
+ expectedStatusCode: 422,
117
+ decryptTextList: []
118
+ }, {
119
+ name: 'Failed case 403: fetch contacts using get contacts api',
120
+ payloadData: {
121
+ error: '403 Forbidden'
122
+ },
123
+ inputStatusCode: 403,
124
+ expectedData: {
125
+ error: 'User request is forbidden'
126
+ },
127
+ expectedMessage: _constants.FAILURE_MESSAGE,
128
+ expectedStatusCode: 403,
129
+ decryptTextList: []
130
+ }, {
131
+ name: 'Failed case 408: fetch contacts using get contacts api',
132
+ payloadData: {
133
+ error: '408 Request Timeout'
134
+ },
135
+ inputStatusCode: 408,
136
+ expectedData: {
137
+ error: 'Request to the server timedout'
138
+ },
139
+ expectedMessage: _constants.FAILURE_MESSAGE,
140
+ expectedStatusCode: 408,
141
+ decryptTextList: []
142
+ }, {
143
+ name: 'Failed case 500: fetch contacts using get contacts api',
144
+ payloadData: {
145
+ error: '500 Internal Server Error'
146
+ },
147
+ inputStatusCode: 500,
148
+ expectedData: {
149
+ error: 'Internal server error occurred'
150
+ },
151
+ expectedMessage: _constants.FAILURE_MESSAGE,
152
+ expectedStatusCode: 500,
153
+ decryptTextList: []
154
+ }, {
155
+ name: 'Failed case 503: fetch contacts using get contacts api',
156
+ payloadData: {
157
+ error: '503 Service Unavailable'
158
+ },
159
+ inputStatusCode: 503,
160
+ expectedData: {
161
+ error: 'Unable to establish a connection with the server'
162
+ },
163
+ expectedMessage: _constants.FAILURE_MESSAGE,
164
+ expectedStatusCode: 503,
165
+ decryptTextList: []
166
+ }].map(function (stat) {
167
+ return (0, _assign.default)(stat, {
168
+ toString: function toString() {
169
+ /* eslint-disable dot-notation */
170
+ return this['name'];
171
+ }
172
+ });
173
+ });
174
+ it.each(errorCodes)('%s', /*#__PURE__*/function () {
175
+ var _ref = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(codeObj) {
176
+ var respPayload, contactsResponse;
177
+ return _regenerator.default.wrap(function (_context) {
178
+ while (1) switch (_context.prev = _context.next) {
179
+ case 0:
180
+ respPayload = {
181
+ statusCode: codeObj.inputStatusCode
182
+ };
183
+ if (codeObj.inputStatusCode === 200) {
184
+ respPayload['body'] = codeObj.payloadData;
185
+ webex.request.mockResolvedValueOnce(respPayload);
186
+ codeObj.decryptTextList.forEach(function (text) {
187
+ webex.internal.encryption.decryptText.mockResolvedValueOnce(text);
188
+ });
189
+ if (codeObj.scimResponse) {
190
+ webex.request.mockResolvedValueOnce(_contactFixtures.mockSCIMListResponse);
191
+ }
192
+ } else {
193
+ respPayload['message'] = _constants.FAILURE_MESSAGE;
194
+ respPayload['data'] = codeObj.payloadData;
195
+ webex.request.mockRejectedValueOnce(respPayload);
196
+ }
197
+ _context.next = 1;
198
+ return contactClient.getContacts();
199
+ case 1:
200
+ contactsResponse = _context.sent;
201
+ if (codeObj.inputStatusCode === 200) {
202
+ if (codeObj.cloudContactPresent) {
203
+ expect(webex.request).toBeCalledTimes(2);
204
+ } else {
205
+ expect(webex.request).toBeCalledTimes(1);
206
+ }
207
+ expect(webex.request).toHaveBeenNthCalledWith(1, {
208
+ uri: contactServiceUrl,
209
+ method: _types.HTTP_METHODS.GET
210
+ });
211
+ if (codeObj.cloudContactPresent) {
212
+ expect(webex.request).toHaveBeenNthCalledWith(2, {
213
+ uri: scimUrl,
214
+ method: _types.HTTP_METHODS.GET,
215
+ headers: {
216
+ 'cisco-device-url': 'https://wdm-intb.ciscospark.com/wdm/api/v1/devices/c5ae3b86-1bb7-40f1-a6a9-c296ee7e61d5',
217
+ 'spark-user-agent': 'webex-calling/beta'
218
+ }
219
+ });
220
+ }
221
+ expect(_Logger.default.info).toHaveBeenCalledWith(_constants.METHOD_START_MESSAGE, {
222
+ file: _constants2.CONTACTS_CLIENT,
223
+ method: _constants2.METHODS.GET_CONTACTS
224
+ });
225
+ if (codeObj.payloadData) {
226
+ expect(_Logger.default.log).toHaveBeenCalledWith('Successfully fetched contacts and groups', {
227
+ file: _constants2.CONTACTS_CLIENT,
228
+ method: _constants2.METHODS.GET_CONTACTS
229
+ });
230
+ } else {
231
+ expect(_Logger.default.error).toHaveBeenCalled();
232
+ }
233
+ } else {
234
+ expect(webex.request).toBeCalledOnceWith({
235
+ uri: contactServiceUrl,
236
+ method: _types.HTTP_METHODS.GET
237
+ });
238
+ expect(_Logger.default.info).toHaveBeenCalledWith(_constants.METHOD_START_MESSAGE, {
239
+ file: _constants2.CONTACTS_CLIENT,
240
+ method: _constants2.METHODS.GET_CONTACTS
241
+ });
242
+ expect(_Logger.default.error).toHaveBeenCalled();
243
+ }
244
+ expect(contactsResponse).toEqual({
245
+ data: expect.any(Object),
246
+ message: codeObj.expectedMessage,
247
+ statusCode: codeObj.expectedStatusCode
248
+ });
249
+ if (codeObj.expectedMessage === _constants.SUCCESS_MESSAGE) {
250
+ expect(serviceErrorCodeHandlerSpy).not.toBeCalled();
251
+ } else {
252
+ expect(serviceErrorCodeHandlerSpy).toBeCalledOnceWith(codeObj.payloadData ? respPayload : expect.any(Error), {
253
+ file: _constants2.CONTACTS_CLIENT,
254
+ method: _constants2.METHODS.GET_CONTACTS
255
+ });
256
+ }
257
+ case 2:
258
+ case "end":
259
+ return _context.stop();
260
+ }
261
+ }, _callee);
262
+ }));
263
+ return function (_x) {
264
+ return _ref.apply(this, arguments);
265
+ };
266
+ }());
267
+ it('create a contact group without encryptionKey', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
268
+ var _contactsResponse$dat;
269
+ var successResponsePayload, contactsResponse;
270
+ return _regenerator.default.wrap(function (_context2) {
271
+ while (1) switch (_context2.prev = _context2.next) {
272
+ case 0:
273
+ successResponsePayload = {
274
+ statusCode: 201,
275
+ body: mockGroupResponse
276
+ };
277
+ contactClient['groups'] = [];
278
+ contactClient['encryptionKeyUrl'] = '';
279
+ webex.request.mockResolvedValue(successResponsePayload);
280
+ webex.internal.encryption.kms.createUnboundKeys.mockResolvedValue([_contactFixtures.mockKmsKey]);
281
+ webex.internal.encryption.kms.createResource.mockResolvedValue(_contactFixtures.mockKmsKey);
282
+ webex.internal.encryption.encryptText.mockResolvedValueOnce('Encrypted Other').mockResolvedValueOnce('Encrypted Top');
283
+ _context2.next = 1;
284
+ return contactClient.createContactGroup('Top Contacts');
285
+ case 1:
286
+ contactsResponse = _context2.sent;
287
+ expect(contactsResponse.statusCode).toEqual(201);
288
+ expect((_contactsResponse$dat = contactsResponse.data.group) === null || _contactsResponse$dat === void 0 ? void 0 : _contactsResponse$dat.groupId).toBe(mockGroupResponse.groupId);
289
+ expect(webex.internal.encryption.kms.createUnboundKeys).toBeCalledOnceWith({
290
+ count: 1
291
+ });
292
+ expect(webex.internal.encryption.kms.createResource).toBeCalledOnceWith({
293
+ keyUris: [_contactFixtures.mockKmsKey.uri]
294
+ });
295
+ expect(webex.request).toBeCalledTimes(2);
296
+ expect(webex.request).toHaveBeenNthCalledWith(1, {
297
+ uri: contactServiceGroupUrl,
298
+ method: 'POST',
299
+ body: {
300
+ displayName: 'Encrypted Other',
301
+ encryptionKeyUrl: _contactFixtures.mockKmsKey.uri,
302
+ groupType: 'NORMAL',
303
+ schemas: 'urn:cisco:codev:identity:contact:core:1.0'
304
+ }
305
+ });
306
+ expect(webex.request).toHaveBeenNthCalledWith(2, {
307
+ uri: contactServiceGroupUrl,
308
+ method: 'POST',
309
+ body: {
310
+ displayName: 'Encrypted Top',
311
+ encryptionKeyUrl: _contactFixtures.mockKmsKey.uri,
312
+ groupType: 'NORMAL',
313
+ schemas: 'urn:cisco:codev:identity:contact:core:1.0'
314
+ }
315
+ });
316
+ expect(contactClient['groups'].length).toEqual(2);
317
+ expect(contactClient['groups'][1].displayName).toEqual('Top Contacts');
318
+ expect(_Logger.default.info).toHaveBeenCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with displayName: Top Contacts"), {
319
+ file: _constants2.CONTACTS_CLIENT,
320
+ method: _constants2.METHODS.CREATE_CONTACT_GROUP
321
+ });
322
+ expect(_Logger.default.info).toHaveBeenCalledWith(_constants.METHOD_START_MESSAGE, {
323
+ file: _constants2.CONTACTS_CLIENT,
324
+ method: _constants2.METHODS.CREATE_NEW_ENCRYPTION_KEY_URL
325
+ });
326
+ expect(_Logger.default.info).toHaveBeenCalledWith('Requesting kms for a new KRO and key', {
327
+ file: _constants2.CONTACTS_CLIENT,
328
+ method: _constants2.METHODS.CREATE_NEW_ENCRYPTION_KEY_URL
329
+ });
330
+ expect(_Logger.default.log).toHaveBeenCalledWith("Creating a default group: ".concat(_constants2.DEFAULT_GROUP_NAME), {
331
+ file: _constants2.CONTACTS_CLIENT,
332
+ method: 'fetchEncryptionKeyUrl'
333
+ });
334
+ expect(_Logger.default.log).toHaveBeenCalledWith("Contact group Top Contacts successfully created", {
335
+ file: _constants2.CONTACTS_CLIENT,
336
+ method: _constants2.METHODS.CREATE_CONTACT_GROUP
337
+ });
338
+ case 2:
339
+ case "end":
340
+ return _context2.stop();
341
+ }
342
+ }, _callee2);
343
+ })));
344
+ it('create a contact group with existing key info', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3() {
345
+ var _contactsResponse$dat2;
346
+ var successResponsePayload, infoSpy, contactsResponse;
347
+ return _regenerator.default.wrap(function (_context3) {
348
+ while (1) switch (_context3.prev = _context3.next) {
349
+ case 0:
350
+ successResponsePayload = {
351
+ statusCode: 201,
352
+ body: mockGroupResponse
353
+ };
354
+ contactClient['groups'] = _contactFixtures.mockContactGroupListOne;
355
+ webex.request.mockResolvedValue(successResponsePayload);
356
+ webex.internal.encryption.encryptText.mockResolvedValue('Encrypted Top Contacts');
357
+ infoSpy = jest.spyOn(_Logger.default, 'info');
358
+ _context3.next = 1;
359
+ return contactClient.createContactGroup('Top Contacts');
360
+ case 1:
361
+ contactsResponse = _context3.sent;
362
+ expect(contactsResponse.statusCode).toEqual(201);
363
+ expect((_contactsResponse$dat2 = contactsResponse.data.group) === null || _contactsResponse$dat2 === void 0 ? void 0 : _contactsResponse$dat2.groupId).toBe(mockGroupResponse.groupId);
364
+ expect(infoSpy).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with displayName: Top Contacts"), {
365
+ file: _constants2.CONTACTS_CLIENT,
366
+ method: _constants2.METHODS.CREATE_CONTACT_GROUP
367
+ });
368
+ expect(_Logger.default.log).toBeCalledWith("Contact group Top Contacts successfully created", {
369
+ file: _constants2.CONTACTS_CLIENT,
370
+ method: _constants2.METHODS.CREATE_CONTACT_GROUP
371
+ });
372
+ expect(infoSpy).not.toBeCalledWith(_constants.METHOD_START_MESSAGE, {
373
+ file: _constants2.CONTACTS_CLIENT,
374
+ method: _constants2.METHODS.CREATE_NEW_ENCRYPTION_KEY_URL
375
+ });
376
+ expect(webex.request).toBeCalledOnceWith({
377
+ uri: contactServiceGroupUrl,
378
+ method: _types.HTTP_METHODS.POST,
379
+ body: {
380
+ displayName: 'Encrypted Top Contacts',
381
+ encryptionKeyUrl: _contactFixtures.mockContactGroupListOne[0].encryptionKeyUrl,
382
+ groupType: 'NORMAL',
383
+ schemas: _constants2.CONTACTS_SCHEMA
384
+ }
385
+ });
386
+ expect(contactClient['groups'].length).toEqual(2);
387
+ expect(contactClient['groups'][1].displayName).toEqual('Top Contacts');
388
+ case 2:
389
+ case "end":
390
+ return _context3.stop();
391
+ }
392
+ }, _callee3);
393
+ })));
394
+ it('create a contact group with same displayName', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
395
+ var logSpy, contactsResponse;
396
+ return _regenerator.default.wrap(function (_context4) {
397
+ while (1) switch (_context4.prev = _context4.next) {
398
+ case 0:
399
+ contactClient['groups'] = _contactFixtures.mockContactResponseBodyOne.groups;
400
+ webex.internal.encryption.kms.createUnboundKeys.mockResolvedValue([_contactFixtures.mockKmsKey]);
401
+ webex.internal.encryption.kms.createResource.mockResolvedValue(_contactFixtures.mockKmsKey);
402
+ logSpy = jest.spyOn(_Logger.default, 'warn');
403
+ _context4.next = 1;
404
+ return contactClient.createContactGroup(mockGroupResponse.displayName);
405
+ case 1:
406
+ contactsResponse = _context4.sent;
407
+ expect(webex.request).not.toBeCalled();
408
+ expect(contactsResponse.statusCode).toBe(400);
409
+ expect(logSpy).toBeCalledOnceWith("Group name ".concat(mockGroupResponse.displayName, " already exists."), {
410
+ file: _constants2.CONTACTS_CLIENT,
411
+ method: _constants2.METHODS.CREATE_CONTACT_GROUP
412
+ });
413
+ expect(_Logger.default.info).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with displayName: ").concat(mockGroupResponse.displayName), {
414
+ file: _constants2.CONTACTS_CLIENT,
415
+ method: _constants2.METHODS.CREATE_CONTACT_GROUP
416
+ });
417
+ expect(contactClient['groups']).toEqual(_contactFixtures.mockContactResponseBodyOne.groups);
418
+ case 2:
419
+ case "end":
420
+ return _context4.stop();
421
+ }
422
+ }, _callee4);
423
+ })));
424
+ it('create a contact group - service unavailable', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee5() {
425
+ var loggerContext, warnSpy, errorSpy, contactsResponse;
426
+ return _regenerator.default.wrap(function (_context5) {
427
+ while (1) switch (_context5.prev = _context5.next) {
428
+ case 0:
429
+ loggerContext = {
430
+ file: _constants2.CONTACTS_CLIENT,
431
+ method: 'createContactGroup'
432
+ };
433
+ contactClient['groups'] = _contactFixtures.mockContactGroupListOne;
434
+ webex.request.mockRejectedValue(failureResponsePayload);
435
+ webex.internal.encryption.kms.createUnboundKeys.mockResolvedValue([_contactFixtures.mockKmsKey]);
436
+ webex.internal.encryption.kms.createResource.mockResolvedValue(_contactFixtures.mockKmsKey);
437
+ webex.internal.encryption.encryptText.mockResolvedValueOnce('Encrypted group name');
438
+ warnSpy = jest.spyOn(_Logger.default, 'warn');
439
+ errorSpy = jest.spyOn(_Logger.default, 'error');
440
+ _context5.next = 1;
441
+ return contactClient.createContactGroup('New group');
442
+ case 1:
443
+ contactsResponse = _context5.sent;
444
+ expect(contactsResponse.statusCode).toBe(503);
445
+ expect(webex.request).toBeCalledOnceWith({
446
+ uri: contactServiceGroupUrl,
447
+ method: _types.HTTP_METHODS.POST,
448
+ body: {
449
+ displayName: 'Encrypted group name',
450
+ encryptionKeyUrl: 'kms://cisco.com/keys/dcf18f9d-155e-44ff-ad61-c8a69b7103ab',
451
+ groupType: 'NORMAL',
452
+ schemas: 'urn:cisco:codev:identity:contact:core:1.0'
453
+ }
454
+ });
455
+ expect(_Logger.default.info).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with displayName: New group"), loggerContext);
456
+ expect(warnSpy).toBeCalledTimes(1);
457
+ expect(warnSpy).toHaveBeenNthCalledWith(1, '503 Unable to establish a connection with the server', loggerContext);
458
+ expect(errorSpy).toBeCalledTimes(1);
459
+ expect(errorSpy).toHaveBeenNthCalledWith(1, "Unable to create contact group: ".concat((0, _stringify.default)(failureResponsePayload)), loggerContext);
460
+ expect(contactClient['groups']).toEqual(_contactFixtures.mockContactGroupListOne);
461
+ expect(serviceErrorCodeHandlerSpy).toBeCalledOnceWith(failureResponsePayload, loggerContext);
462
+ case 2:
463
+ case "end":
464
+ return _context5.stop();
465
+ }
466
+ }, _callee5);
467
+ })));
468
+ it('delete a contact group - service unavailable', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee6() {
469
+ var loggerContext, warnSpy, errorSpy, contactsResponse;
470
+ return _regenerator.default.wrap(function (_context6) {
471
+ while (1) switch (_context6.prev = _context6.next) {
472
+ case 0:
473
+ loggerContext = {
474
+ file: _constants2.CONTACTS_CLIENT,
475
+ method: 'deleteContactGroup'
476
+ };
477
+ contactClient['groups'] = _contactFixtures.mockContactGroupListOne;
478
+ webex.request.mockRejectedValue(failureResponsePayload);
479
+ webex.internal.encryption.kms.createUnboundKeys.mockResolvedValue([_contactFixtures.mockKmsKey]);
480
+ webex.internal.encryption.kms.createResource.mockResolvedValue(_contactFixtures.mockKmsKey);
481
+ warnSpy = jest.spyOn(_Logger.default, 'warn');
482
+ errorSpy = jest.spyOn(_Logger.default, 'error');
483
+ _context6.next = 1;
484
+ return contactClient.deleteContactGroup(mockGroupResponse.groupId);
485
+ case 1:
486
+ contactsResponse = _context6.sent;
487
+ expect(contactsResponse.statusCode).toBe(503);
488
+ expect(webex.request).toBeCalledOnceWith({
489
+ method: _types.HTTP_METHODS.DELETE,
490
+ uri: "".concat(contactServiceGroupUrl, "/").concat(mockGroupResponse.groupId)
491
+ });
492
+ expect(_Logger.default.info).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with groupId: ").concat(mockGroupResponse.groupId), loggerContext);
493
+ expect(_Logger.default.info).toBeCalledWith("Deleting contact group: ".concat(mockGroupResponse.groupId), loggerContext);
494
+ expect(warnSpy).toBeCalledTimes(1);
495
+ expect(errorSpy).toBeCalledTimes(1);
496
+ expect(uploadLogsSpy).toBeCalledTimes(1);
497
+ expect(errorSpy).toHaveBeenNthCalledWith(1, "Unable to delete contact group ".concat(mockGroupResponse.groupId, ": ").concat((0, _stringify.default)(failureResponsePayload)), loggerContext);
498
+ expect(warnSpy).toHaveBeenNthCalledWith(1, '503 Unable to establish a connection with the server', loggerContext);
499
+ expect(contactClient['groups']).toEqual(_contactFixtures.mockContactGroupListOne);
500
+ expect(serviceErrorCodeHandlerSpy).toBeCalledOnceWith(failureResponsePayload, loggerContext);
501
+ case 2:
502
+ case "end":
503
+ return _context6.stop();
504
+ }
505
+ }, _callee6);
506
+ })));
507
+ it('successful deletion of contact group', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee7() {
508
+ var successResponsePayload, response;
509
+ return _regenerator.default.wrap(function (_context7) {
510
+ while (1) switch (_context7.prev = _context7.next) {
511
+ case 0:
512
+ successResponsePayload = {
513
+ statusCode: 204
514
+ };
515
+ contactClient['groups'] = [_contactFixtures.mockContactGroupListOne[0]];
516
+ webex.request.mockResolvedValue(successResponsePayload);
517
+ _context7.next = 1;
518
+ return contactClient.deleteContactGroup(_contactFixtures.mockContactGroupListOne[0].groupId);
519
+ case 1:
520
+ response = _context7.sent;
521
+ expect(response.statusCode).toEqual(204);
522
+ expect(webex.request).toBeCalledOnceWith({
523
+ uri: "".concat(contactServiceGroupUrl, "/").concat(_contactFixtures.mockContactGroupListOne[0].groupId),
524
+ method: _types.HTTP_METHODS.DELETE
525
+ });
526
+ expect(contactClient['groups']).toEqual([]);
527
+ expect(_Logger.default.info).toBeCalledWith("Deleting contact group: ".concat(_contactFixtures.mockContactGroupListOne[0].groupId), {
528
+ file: _constants2.CONTACTS_CLIENT,
529
+ method: 'deleteContactGroup'
530
+ });
531
+ expect(_Logger.default.log).toBeCalledWith("Contact group ".concat(_contactFixtures.mockContactGroupListOne[0].groupId, " successfully deleted"), {
532
+ file: _constants2.CONTACTS_CLIENT,
533
+ method: 'deleteContactGroup'
534
+ });
535
+ case 2:
536
+ case "end":
537
+ return _context7.stop();
538
+ }
539
+ }, _callee7);
540
+ })));
541
+ it('create a contact with an existing group', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee8() {
542
+ var _res$data$contact, _result$data$contact;
543
+ var mockContactResponse, successResponsePayload, infoSpy, logSpy, contact, res, result;
544
+ return _regenerator.default.wrap(function (_context8) {
545
+ while (1) switch (_context8.prev = _context8.next) {
546
+ case 0:
547
+ mockContactResponse = _contactFixtures.mockContactResponseBodyTwo.contacts[0];
548
+ successResponsePayload = {
549
+ statusCode: 201,
550
+ body: mockContactResponse
551
+ };
552
+ webex.request.mockResolvedValue(successResponsePayload);
553
+ webex.internal.encryption.encryptText.mockResolvedValue('Encrypted contact name');
554
+ infoSpy = jest.spyOn(_Logger.default, 'info');
555
+ logSpy = jest.spyOn(_Logger.default, 'log');
556
+ contactClient['groups'] = _contactFixtures.mockContactGroupListOne;
557
+ contactClient['encryptionKeyUrl'] = _contactFixtures.mockContactGroupListOne[0].encryptionKeyUrl;
558
+ contact = _contactFixtures.mockContactListTwo.slice()[0];
559
+ contact.groups = [];
560
+ _context8.next = 1;
561
+ return contactClient.createContact(contact);
562
+ case 1:
563
+ res = _context8.sent;
564
+ expect(res.statusCode).toEqual(201);
565
+ expect((_res$data$contact = res.data.contact) === null || _res$data$contact === void 0 ? void 0 : _res$data$contact.contactId).toBe(mockContactResponse.contactId);
566
+ expect(infoSpy).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with contactType: ").concat(contact.contactType), {
567
+ file: _constants2.CONTACTS_CLIENT,
568
+ method: _constants2.METHODS.CREATE_CONTACT
569
+ });
570
+ expect(logSpy).toBeCalledWith("Contact successfully created", {
571
+ file: _constants2.CONTACTS_CLIENT,
572
+ method: _constants2.METHODS.CREATE_CONTACT
573
+ });
574
+ expect(logSpy).not.toBeCalledWith('Created a KRO and encryptionKeyUrl', {
575
+ file: _constants2.CONTACTS_CLIENT,
576
+ method: 'createNewEncryptionKeyUrl'
577
+ });
578
+ expect(logSpy).not.toBeCalledWith('Created a KRO and encryptionKeyUrl', {
579
+ file: _constants2.CONTACTS_CLIENT,
580
+ method: 'createNewEncryptionKeyUrl'
581
+ });
582
+ expect(infoSpy).not.toBeCalledWith("Creating a default group: ".concat(_constants2.DEFAULT_GROUP_NAME), {
583
+ file: _constants2.CONTACTS_CLIENT,
584
+ method: 'fetchEncryptionKeyUrl'
585
+ });
586
+ expect(webex.internal.encryption.encryptText).toBeCalledOnceWith(_contactFixtures.mockContactGroupListOne[0].encryptionKeyUrl, contact.displayName);
587
+ expect(webex.request).toBeCalledOnceWith({
588
+ body: _objectSpread(_objectSpread({}, contact), {}, {
589
+ displayName: 'Encrypted contact name',
590
+ groups: [_contactFixtures.mockContactGroupListOne[0].groupId],
591
+ schemas: _constants2.CONTACTS_SCHEMA
592
+ }),
593
+ uri: contactServiceUrl,
594
+ method: _types.HTTP_METHODS.POST
595
+ });
596
+ logSpy.mockClear();
597
+
598
+ /* for coverage */
599
+ _context8.next = 2;
600
+ return contactClient.createContact(contact);
601
+ case 2:
602
+ result = _context8.sent;
603
+ expect((_result$data$contact = result.data.contact) === null || _result$data$contact === void 0 ? void 0 : _result$data$contact.contactId).toBe(mockContactResponse.contactId);
604
+ expect(logSpy).not.toBeCalledWith("Creating a default group: ".concat(_constants2.DEFAULT_GROUP_NAME), {
605
+ file: _constants2.CONTACTS_CLIENT,
606
+ method: 'fetchEncryptionKeyUrl'
607
+ });
608
+ case 3:
609
+ case "end":
610
+ return _context8.stop();
611
+ }
612
+ }, _callee8);
613
+ })));
614
+ it('create a contact without a group and encryptionKey', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee9() {
615
+ var _res$data$contact2;
616
+ var mockContactResponse, successContactGroupResponsePayload, successContactResponsePayload, contact, res;
617
+ return _regenerator.default.wrap(function (_context9) {
618
+ while (1) switch (_context9.prev = _context9.next) {
619
+ case 0:
620
+ mockContactResponse = _contactFixtures.mockContactResponseBodyOne.contacts[1];
621
+ contactClient['groups'] = [];
622
+ contactClient['encryptionKey'] = '';
623
+ contactClient['defaultGroupId'] = '';
624
+ successContactGroupResponsePayload = {
625
+ statusCode: 201,
626
+ body: mockGroupResponse
627
+ };
628
+ successContactResponsePayload = {
629
+ statusCode: 201,
630
+ body: mockContactResponse
631
+ };
632
+ webex.request.mockResolvedValueOnce(successContactGroupResponsePayload).mockResolvedValueOnce(successContactResponsePayload);
633
+ webex.internal.encryption.kms.createUnboundKeys.mockResolvedValue([_contactFixtures.mockKmsKey]);
634
+ webex.internal.encryption.kms.createResource.mockResolvedValue(_contactFixtures.mockKmsKey);
635
+ webex.internal.encryption.encryptText.mockResolvedValueOnce('Encrypted group name');
636
+ contact = {
637
+ contactType: 'CUSTOM'
638
+ };
639
+ _context9.next = 1;
640
+ return contactClient.createContact(contact);
641
+ case 1:
642
+ res = _context9.sent;
643
+ expect(res.statusCode).toEqual(201);
644
+ expect(webex.request).toBeCalledTimes(2);
645
+ expect(webex.request).toHaveBeenNthCalledWith(1, {
646
+ body: {
647
+ displayName: 'Encrypted group name',
648
+ encryptionKeyUrl: _contactFixtures.mockKmsKey.uri,
649
+ groupType: 'NORMAL',
650
+ schemas: _constants2.CONTACTS_SCHEMA
651
+ },
652
+ uri: contactServiceGroupUrl,
653
+ method: _types.HTTP_METHODS.POST
654
+ });
655
+ expect(webex.request).toHaveBeenNthCalledWith(2, {
656
+ body: {
657
+ contactType: 'CUSTOM',
658
+ encryptionKeyUrl: _contactFixtures.mockKmsKey.uri,
659
+ groups: ['1561977e-3443-4ccf-a591-69686275d7d2'],
660
+ schemas: _constants2.CONTACTS_SCHEMA
661
+ },
662
+ method: _types.HTTP_METHODS.POST,
663
+ uri: contactServiceUrl
664
+ });
665
+ expect(webex.internal.encryption.kms.createUnboundKeys).toBeCalledOnceWith({
666
+ count: 1
667
+ });
668
+ expect(webex.internal.encryption.kms.createResource).toBeCalledOnceWith({
669
+ keyUris: [_contactFixtures.mockKmsKey.uri]
670
+ });
671
+ expect((_res$data$contact2 = res.data.contact) === null || _res$data$contact2 === void 0 ? void 0 : _res$data$contact2.contactId).toBe(mockContactResponse.contactId);
672
+ expect(_Logger.default.info).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with contactType: CUSTOM"), {
673
+ file: _constants2.CONTACTS_CLIENT,
674
+ method: _constants2.METHODS.CREATE_CONTACT
675
+ });
676
+ expect(_Logger.default.info).toBeCalledWith(_constants.METHOD_START_MESSAGE, {
677
+ file: _constants2.CONTACTS_CLIENT,
678
+ method: _constants2.METHODS.CREATE_NEW_ENCRYPTION_KEY_URL
679
+ });
680
+ expect(_Logger.default.info).toBeCalledWith('Requesting kms for a new KRO and key', {
681
+ file: _constants2.CONTACTS_CLIENT,
682
+ method: _constants2.METHODS.CREATE_NEW_ENCRYPTION_KEY_URL
683
+ });
684
+ expect(_Logger.default.log).toBeCalledWith("Creating a default group: ".concat(_constants2.DEFAULT_GROUP_NAME), {
685
+ file: _constants2.CONTACTS_CLIENT,
686
+ method: _constants2.METHODS.FETCH_ENCRYPTION_KEY_URL
687
+ });
688
+ expect(_Logger.default.log).toBeCalledWith("Contact successfully created", {
689
+ file: _constants2.CONTACTS_CLIENT,
690
+ method: 'createContact'
691
+ });
692
+ case 2:
693
+ case "end":
694
+ return _context9.stop();
695
+ }
696
+ }, _callee9);
697
+ })));
698
+ it('create a cloud contact with no existing groups', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee0() {
699
+ var _res$data$contact3;
700
+ var mockContactResponse, successResponsePayload, successResponsePayloadGroup, contact, res;
701
+ return _regenerator.default.wrap(function (_context0) {
702
+ while (1) switch (_context0.prev = _context0.next) {
703
+ case 0:
704
+ mockContactResponse = _contactFixtures.mockContactResponseBodyOne.contacts[0];
705
+ successResponsePayload = {
706
+ statusCode: 201,
707
+ body: mockContactResponse
708
+ };
709
+ successResponsePayloadGroup = {
710
+ statusCode: 201,
711
+ body: _contactFixtures.mockContactResponseBodyOne.groups[0]
712
+ };
713
+ webex.request.mockResolvedValueOnce(successResponsePayloadGroup).mockResolvedValueOnce(successResponsePayload).mockResolvedValueOnce(_contactFixtures.mockSCIMListResponse);
714
+ webex.internal.encryption.encryptText.mockResolvedValueOnce('Encrypted group name');
715
+ contactClient['groups'] = [];
716
+ contactClient['encryptionKeyUrl'] = _contactFixtures.mockContactResponseBodyOne.groups[0].encryptionKeyUrl;
717
+ contact = {
718
+ contactType: 'CLOUD'
719
+ };
720
+ contact.groups = [];
721
+ _context0.next = 1;
722
+ return contactClient.createContact(contact);
723
+ case 1:
724
+ res = _context0.sent;
725
+ expect(res.statusCode).toEqual(400);
726
+ expect(res.data.error).toEqual('contactId is required for contactType:CLOUD.');
727
+ expect(_Logger.default.info).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with contactType: CLOUD"), {
728
+ file: _constants2.CONTACTS_CLIENT,
729
+ method: _constants2.METHODS.CREATE_CONTACT
730
+ });
731
+ contact.contactId = mockContactResponse.contactId;
732
+ _context0.next = 2;
733
+ return contactClient.createContact(contact);
734
+ case 2:
735
+ res = _context0.sent;
736
+ expect(res.statusCode).toEqual(201);
737
+ expect((_res$data$contact3 = res.data.contact) === null || _res$data$contact3 === void 0 ? void 0 : _res$data$contact3.contactId).toBe(mockContactResponse.contactId);
738
+ expect(webex.request).toBeCalledTimes(3);
739
+ expect(webex.request).toHaveBeenNthCalledWith(1, {
740
+ method: _types.HTTP_METHODS.POST,
741
+ uri: contactServiceGroupUrl,
742
+ body: {
743
+ displayName: 'Encrypted group name',
744
+ groupType: 'NORMAL',
745
+ encryptionKeyUrl: _contactFixtures.mockContactResponseBodyOne.groups[0].encryptionKeyUrl,
746
+ schemas: _constants2.CONTACTS_SCHEMA
747
+ }
748
+ });
749
+ expect(webex.request).toHaveBeenNthCalledWith(2, {
750
+ method: _types.HTTP_METHODS.POST,
751
+ uri: contactServiceUrl,
752
+ body: {
753
+ contactId: mockContactResponse.contactId,
754
+ contactType: 'CLOUD',
755
+ encryptionKeyUrl: _contactFixtures.mockContactResponseBodyOne.groups[0].encryptionKeyUrl,
756
+ schemas: _constants2.CONTACTS_SCHEMA,
757
+ groups: ['1561977e-3443-4ccf-a591-69686275d7d2']
758
+ }
759
+ });
760
+ expect(webex.request).toHaveBeenNthCalledWith(3, {
761
+ uri: scimUrl,
762
+ method: _types.HTTP_METHODS.GET,
763
+ headers: {
764
+ 'cisco-device-url': 'https://wdm-intb.ciscospark.com/wdm/api/v1/devices/c5ae3b86-1bb7-40f1-a6a9-c296ee7e61d5',
765
+ 'spark-user-agent': 'webex-calling/beta'
766
+ }
767
+ });
768
+ expect(_Logger.default.log).toBeCalledWith("Contact successfully created", {
769
+ file: _constants2.CONTACTS_CLIENT,
770
+ method: 'createContact'
771
+ });
772
+ case 3:
773
+ case "end":
774
+ return _context0.stop();
775
+ }
776
+ }, _callee0);
777
+ })));
778
+ it('create a contact - service unavailable', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee1() {
779
+ var contact, res;
780
+ return _regenerator.default.wrap(function (_context1) {
781
+ while (1) switch (_context1.prev = _context1.next) {
782
+ case 0:
783
+ webex.request.mockRejectedValue(failureResponsePayload);
784
+ contactClient['groups'] = _contactFixtures.mockContactGroupListOne.slice();
785
+ contactClient['encryptionKeyUrl'] = _contactFixtures.mockContactResponseBodyOne.groups[0].encryptionKeyUrl;
786
+ contact = {
787
+ contactType: 'CLOUD',
788
+ contactId: '801bb994-343b-4f6b-97ae-d13c91d4b877'
789
+ };
790
+ _context1.next = 1;
791
+ return contactClient.createContact(contact);
792
+ case 1:
793
+ res = _context1.sent;
794
+ expect(webex.request).toBeCalledOnceWith({
795
+ uri: contactServiceUrl,
796
+ method: _types.HTTP_METHODS.POST,
797
+ body: _objectSpread(_objectSpread({}, contact), {}, {
798
+ encryptionKeyUrl: _contactFixtures.mockContactResponseBodyOne.groups[0].encryptionKeyUrl,
799
+ groups: [_contactFixtures.mockContactGroupListOne[0].groupId],
800
+ schemas: _constants2.CONTACTS_SCHEMA
801
+ })
802
+ });
803
+ expect(serviceErrorCodeHandlerSpy).toBeCalledOnceWith(failureResponsePayload, {
804
+ file: _constants2.CONTACTS_CLIENT,
805
+ method: _constants2.METHODS.CREATE_CONTACT
806
+ });
807
+ expect(res.statusCode).toEqual(503);
808
+ expect(_Logger.default.info).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with contactType: CLOUD"), {
809
+ file: _constants2.CONTACTS_CLIENT,
810
+ method: _constants2.METHODS.CREATE_CONTACT
811
+ });
812
+ expect(_Logger.default.error).toBeCalledWith("Failed to create contact: ".concat((0, _stringify.default)(failureResponsePayload)), {
813
+ file: _constants2.CONTACTS_CLIENT,
814
+ method: _constants2.METHODS.CREATE_CONTACT
815
+ });
816
+ case 2:
817
+ case "end":
818
+ return _context1.stop();
819
+ }
820
+ }, _callee1);
821
+ })));
822
+ it('successful deletion of contacts', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee10() {
823
+ var successResponsePayload, response;
824
+ return _regenerator.default.wrap(function (_context10) {
825
+ while (1) switch (_context10.prev = _context10.next) {
826
+ case 0:
827
+ successResponsePayload = {
828
+ statusCode: 204
829
+ };
830
+ contactClient['contacts'] = [_contactFixtures.mockContactListOne[0]];
831
+ webex.request.mockResolvedValue(successResponsePayload);
832
+ _context10.next = 1;
833
+ return contactClient.deleteContact(_contactFixtures.mockContactListOne[0].contactId);
834
+ case 1:
835
+ response = _context10.sent;
836
+ expect(response.statusCode).toEqual(204);
837
+ expect(webex.request).toBeCalledOnceWith({
838
+ uri: "".concat(contactServiceUrl, "/").concat(_contactFixtures.mockContactListOne[0].contactId),
839
+ method: _types.HTTP_METHODS.DELETE
840
+ });
841
+ expect(contactClient['contacts']).toEqual([]);
842
+ expect(_Logger.default.info).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with contactId: ").concat(_contactFixtures.mockContactListOne[0].contactId), {
843
+ file: _constants2.CONTACTS_CLIENT,
844
+ method: _constants2.METHODS.DELETE_CONTACT
845
+ });
846
+ expect(_Logger.default.info).toBeCalledWith("Deleting contact : ".concat(_contactFixtures.mockContactListOne[0].contactId), {
847
+ file: _constants2.CONTACTS_CLIENT,
848
+ method: _constants2.METHODS.DELETE_CONTACT
849
+ });
850
+ case 2:
851
+ case "end":
852
+ return _context10.stop();
853
+ }
854
+ }, _callee10);
855
+ })));
856
+ it('delete a contact - service unavailable', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee11() {
857
+ var response;
858
+ return _regenerator.default.wrap(function (_context11) {
859
+ while (1) switch (_context11.prev = _context11.next) {
860
+ case 0:
861
+ contactClient['contacts'] = _contactFixtures.mockContactListOne;
862
+ webex.request.mockRejectedValue(failureResponsePayload);
863
+ _context11.next = 1;
864
+ return contactClient.deleteContact(_contactFixtures.mockContactListOne[0].contactId);
865
+ case 1:
866
+ response = _context11.sent;
867
+ expect(response.statusCode).toEqual(503);
868
+ expect(webex.request).toBeCalledOnceWith({
869
+ uri: "".concat(contactServiceUrl, "/").concat(_contactFixtures.mockContactListOne[0].contactId),
870
+ method: _types.HTTP_METHODS.DELETE
871
+ });
872
+ expect(serviceErrorCodeHandlerSpy).toBeCalledOnceWith(failureResponsePayload, {
873
+ file: _constants2.CONTACTS_CLIENT,
874
+ method: _constants2.METHODS.DELETE_CONTACT
875
+ });
876
+ expect(contactClient['contacts']).toEqual(_contactFixtures.mockContactListOne);
877
+ expect(_Logger.default.info).toBeCalledWith("".concat(_constants.METHOD_START_MESSAGE, " with contactId: ").concat(_contactFixtures.mockContactListOne[0].contactId), {
878
+ file: _constants2.CONTACTS_CLIENT,
879
+ method: _constants2.METHODS.DELETE_CONTACT
880
+ });
881
+ expect(_Logger.default.info).toBeCalledWith("Deleting contact : ".concat(_contactFixtures.mockContactListOne[0].contactId), {
882
+ file: _constants2.CONTACTS_CLIENT,
883
+ method: _constants2.METHODS.DELETE_CONTACT
884
+ });
885
+ case 2:
886
+ case "end":
887
+ return _context11.stop();
888
+ }
889
+ }, _callee11);
890
+ })));
891
+ it('test resolveContacts function for a minimal contact with few details', function () {
892
+ var contact = contactClient['resolveCloudContacts']({
893
+ userId: _contactFixtures.mockContactMinimum
894
+ }, _contactFixtures.mockSCIMMinListResponse.body);
895
+ expect(contact).toEqual([{
896
+ avatarURL: '',
897
+ avatarUrlDomain: undefined,
898
+ contactId: 'userId',
899
+ contactType: 'CLOUD',
900
+ department: undefined,
901
+ displayName: undefined,
902
+ emails: undefined,
903
+ encryptionKeyUrl: 'kms://cisco.com/keys/dcf18f9d-155e-44ff-ad61-c8a69b7103ab',
904
+ firstName: undefined,
905
+ groups: ['1561977e-3443-4ccf-a591-69686275d7d2'],
906
+ lastName: undefined,
907
+ manager: undefined,
908
+ ownerId: 'ownerId',
909
+ phoneNumbers: undefined,
910
+ sipAddresses: undefined,
911
+ resolved: true
912
+ }]);
913
+ });
914
+ it("test resolveContacts function when contactsDataMap list doesn't match resolved list", function () {
915
+ var mockContact = {
916
+ firstName: 'Jane',
917
+ lastName: 'Doe',
918
+ contactId: 'janeDoe'
919
+ };
920
+ var contact = contactClient['resolveCloudContacts']({
921
+ userId: _contactFixtures.mockContactMinimum,
922
+ janeDoe: mockContact
923
+ }, _contactFixtures.mockSCIMMinListResponse.body);
924
+ expect(contact).toEqual([{
925
+ firstName: 'Jane',
926
+ lastName: 'Doe',
927
+ contactId: 'janeDoe',
928
+ resolved: false
929
+ }, {
930
+ avatarURL: '',
931
+ avatarUrlDomain: undefined,
932
+ contactId: 'userId',
933
+ contactType: 'CLOUD',
934
+ department: undefined,
935
+ displayName: undefined,
936
+ emails: undefined,
937
+ encryptionKeyUrl: 'kms://cisco.com/keys/dcf18f9d-155e-44ff-ad61-c8a69b7103ab',
938
+ firstName: undefined,
939
+ groups: ['1561977e-3443-4ccf-a591-69686275d7d2'],
940
+ lastName: undefined,
941
+ manager: undefined,
942
+ ownerId: 'ownerId',
943
+ phoneNumbers: undefined,
944
+ sipAddresses: undefined,
945
+ resolved: true
946
+ }]);
947
+ });
948
+ it('test resolveContacts function encountering an error', function () {
949
+ var warnSpy = jest.spyOn(_Logger.default, 'warn');
950
+ var contact = contactClient['resolveCloudContacts']({
951
+ userId: _contactFixtures.mockContactMinimum
952
+ }, _contactFixtures.mockSCIMMinListResponse);
953
+ expect(contact).toEqual(null);
954
+ expect(warnSpy).toHaveBeenCalledWith('Error occurred while parsing resolved contacts', {
955
+ file: _constants2.CONTACTS_CLIENT,
956
+ method: 'resolveCloudContacts'
957
+ });
958
+ });
959
+ it('logs error for chunk when scimQuery API call fails in the loop for getContacts', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee12() {
960
+ var mockData, respPayload, warnSpy, infoSpy, logSpy;
961
+ return _regenerator.default.wrap(function (_context12) {
962
+ while (1) switch (_context12.prev = _context12.next) {
963
+ case 0:
964
+ mockData = errorCodes[0];
965
+ respPayload = {
966
+ statusCode: mockData.inputStatusCode,
967
+ body: mockData.payloadData
968
+ };
969
+ webex.request.mockResolvedValueOnce(respPayload).mockRejectedValueOnce(_objectSpread(_objectSpread({}, respPayload), {}, {
970
+ statusCode: 503,
971
+ message: _constants.FAILURE_MESSAGE,
972
+ data: mockData.payloadData
973
+ }));
974
+ mockData.decryptTextList.forEach(function (text) {
975
+ webex.internal.encryption.decryptText.mockResolvedValueOnce(text);
976
+ });
977
+ warnSpy = jest.spyOn(_Logger.default, 'warn');
978
+ infoSpy = jest.spyOn(_Logger.default, 'info');
979
+ logSpy = jest.spyOn(_Logger.default, 'log');
980
+ _context12.next = 1;
981
+ return contactClient.getContacts();
982
+ case 1:
983
+ expect(webex.request).toBeCalledTimes(2);
984
+ expect(warnSpy).toBeCalledTimes(1);
985
+ expect(warnSpy).toBeCalledWith('Error processing contact chunk 0-50', {
986
+ file: _constants2.CONTACTS_CLIENT,
987
+ method: _constants2.METHODS.GET_CONTACTS
988
+ });
989
+ expect(infoSpy).toBeCalledWith(_constants.METHOD_START_MESSAGE, {
990
+ file: _constants2.CONTACTS_CLIENT,
991
+ method: _constants2.METHODS.GET_CONTACTS
992
+ });
993
+ expect(logSpy).toBeCalledWith('Successfully fetched contacts and groups', {
994
+ file: _constants2.CONTACTS_CLIENT,
995
+ method: _constants2.METHODS.GET_CONTACTS
996
+ });
997
+ case 2:
998
+ case "end":
999
+ return _context12.stop();
1000
+ }
1001
+ }, _callee12);
1002
+ })));
1003
+ });
1004
+ //# sourceMappingURL=ContactsClient.test.js.map