@webex/webex-core 3.8.1 → 3.9.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.
- package/README.md +87 -27
- package/dist/index.js +9 -33
- package/dist/index.js.map +1 -1
- package/dist/lib/batcher.js +1 -1
- package/dist/lib/constants.js +10 -1
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/credentials/credentials.js +1 -1
- package/dist/lib/credentials/token.js +1 -1
- package/dist/lib/{services-v2/interceptors → interceptors}/server-error.js +1 -1
- package/dist/lib/interceptors/server-error.js.map +1 -0
- package/dist/lib/services/index.js +2 -29
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/service-host.js +1 -1
- package/dist/lib/services/service-host.js.map +1 -1
- package/dist/lib/services/service-registry.js +1 -1
- package/dist/lib/services/service-registry.js.map +1 -1
- package/dist/lib/services/service-state.js +1 -1
- package/dist/lib/services/service-state.js.map +1 -1
- package/dist/lib/services/services.js +3 -3
- package/dist/lib/services/services.js.map +1 -1
- package/dist/lib/services-v2/index.js +0 -29
- package/dist/lib/services-v2/index.js.map +1 -1
- package/dist/lib/services-v2/metrics.js.map +1 -1
- package/dist/lib/services-v2/service-catalog.js +11 -10
- package/dist/lib/services-v2/service-catalog.js.map +1 -1
- package/dist/lib/services-v2/services-v2.js +56 -67
- package/dist/lib/services-v2/services-v2.js.map +1 -1
- package/dist/lib/services-v2/types.js.map +1 -1
- package/dist/plugins/logger.js +1 -1
- package/dist/webex-core.js +3 -3
- package/dist/webex-core.js.map +1 -1
- package/package.json +13 -13
- package/src/index.js +5 -14
- package/src/lib/constants.js +29 -1
- package/src/lib/{services/interceptors → interceptors}/server-error.js +1 -1
- package/src/lib/services/index.js +2 -7
- package/src/lib/services/service-host.js +1 -1
- package/src/lib/services/service-registry.js +1 -1
- package/src/lib/services/service-state.js +1 -1
- package/src/lib/services/services.js +2 -2
- package/src/lib/services-v2/index.ts +0 -16
- package/src/lib/services-v2/service-catalog.ts +20 -19
- package/src/lib/services-v2/{services-v2.js → services-v2.ts} +116 -94
- package/src/lib/services-v2/types.ts +62 -2
- package/src/webex-core.js +1 -1
- package/test/fixtures/host-catalog-v2.ts +30 -122
- package/test/integration/spec/services/services.js +11 -0
- package/test/integration/spec/services-v2/service-catalog.js +664 -0
- package/test/integration/spec/services-v2/services-v2.js +1061 -0
- package/test/unit/spec/services-v2/service-detail.ts +1 -1
- package/test/unit/spec/services-v2/services-v2.ts +390 -436
- package/dist/lib/services/constants.js +0 -17
- package/dist/lib/services/constants.js.map +0 -1
- package/dist/lib/services/interceptors/hostmap.js +0 -64
- package/dist/lib/services/interceptors/hostmap.js.map +0 -1
- package/dist/lib/services/interceptors/server-error.js +0 -77
- package/dist/lib/services/interceptors/server-error.js.map +0 -1
- package/dist/lib/services/interceptors/service.js +0 -137
- package/dist/lib/services/interceptors/service.js.map +0 -1
- package/dist/lib/services-v2/constants.js +0 -17
- package/dist/lib/services-v2/constants.js.map +0 -1
- package/dist/lib/services-v2/interceptors/server-error.js.map +0 -1
- package/dist/lib/services-v2/service-host.js +0 -300
- package/dist/lib/services-v2/service-host.js.map +0 -1
- package/dist/lib/services-v2/service-registry.js +0 -534
- package/dist/lib/services-v2/service-registry.js.map +0 -1
- package/dist/lib/services-v2/service-state.js +0 -97
- package/dist/lib/services-v2/service-state.js.map +0 -1
- package/dist/lib/services-v2/service-url.js +0 -119
- package/dist/lib/services-v2/service-url.js.map +0 -1
- package/src/lib/services/constants.js +0 -21
- package/src/lib/services/interceptors/hostmap.js +0 -36
- package/src/lib/services/interceptors/service.js +0 -101
- package/src/lib/services-v2/constants.ts +0 -21
- package/src/lib/services-v2/interceptors/server-error.js +0 -48
- /package/dist/lib/{services-v2/interceptors → interceptors}/hostmap.js +0 -0
- /package/dist/lib/{services-v2/interceptors → interceptors}/hostmap.js.map +0 -0
- /package/dist/lib/{services-v2/interceptors → interceptors}/service.js +0 -0
- /package/dist/lib/{services-v2/interceptors → interceptors}/service.js.map +0 -0
- /package/dist/lib/{services/metrics.js → metrics.js} +0 -0
- /package/dist/lib/{services/metrics.js.map → metrics.js.map} +0 -0
- /package/src/lib/{services-v2/interceptors → interceptors}/hostmap.js +0 -0
- /package/src/lib/{services-v2/interceptors → interceptors}/service.js +0 -0
- /package/src/lib/{services-v2/metrics.js → metrics.js} +0 -0
- /package/src/lib/{services/metrics.js → services-v2/metrics.ts} +0 -0
|
@@ -23,7 +23,7 @@ describe('webex-core', () => {
|
|
|
23
23
|
let catalog;
|
|
24
24
|
|
|
25
25
|
beforeEach(() => {
|
|
26
|
-
webex =
|
|
26
|
+
webex = MockWebex({
|
|
27
27
|
children: {
|
|
28
28
|
services: ServicesV2,
|
|
29
29
|
newMetrics: NewMetrics,
|
|
@@ -33,287 +33,240 @@ describe('webex-core', () => {
|
|
|
33
33
|
catalog = services._getCatalog();
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// services.initialize();
|
|
47
|
-
|
|
48
|
-
// // call the onReady callback
|
|
49
|
-
// services.listenToOnce.getCall(1).args[2]();
|
|
50
|
-
// await waitForAsync();
|
|
51
|
-
|
|
52
|
-
// assert.isFalse(services.initFailed);
|
|
53
|
-
// });
|
|
54
|
-
|
|
55
|
-
// it('initFailed is false when initialization succeeds no credentials are available', async () => {
|
|
56
|
-
// services.listenToOnce = sinon.stub();
|
|
57
|
-
// services.collectPreauthCatalog = sinon.stub().returns(Promise.resolve());
|
|
58
|
-
|
|
59
|
-
// services.initialize();
|
|
60
|
-
|
|
61
|
-
// // call the onReady callback
|
|
62
|
-
// services.listenToOnce.getCall(1).args[2]();
|
|
63
|
-
// await waitForAsync();
|
|
64
|
-
|
|
65
|
-
// assert.isFalse(services.initFailed);
|
|
66
|
-
// });
|
|
67
|
-
|
|
68
|
-
// it.each([
|
|
69
|
-
// {error: new Error('failed'), expectedMessage: 'failed'},
|
|
70
|
-
// {error: undefined, expectedMessage: undefined},
|
|
71
|
-
// ])(
|
|
72
|
-
// 'sets initFailed to true when collectPreauthCatalog errors',
|
|
73
|
-
// async ({error, expectedMessage}) => {
|
|
74
|
-
// services.collectPreauthCatalog = sinon.stub().callsFake(() => {
|
|
75
|
-
// return Promise.reject(error);
|
|
76
|
-
// });
|
|
36
|
+
describe('#initialize', () => {
|
|
37
|
+
it('initFailed is false when initialization succeeds and credentials are available', async () => {
|
|
38
|
+
services.listenToOnce = sinon.stub();
|
|
39
|
+
services.initServiceCatalogs = sinon.stub().returns(Promise.resolve());
|
|
40
|
+
services.webex.credentials = {
|
|
41
|
+
supertoken: {
|
|
42
|
+
access_token: 'token',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
77
45
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
// });
|
|
303
|
-
|
|
304
|
-
// it('Resolve getMeetingPreferences if the api request fails ', async () => {
|
|
305
|
-
// webex.request = sinon.stub().returns(Promise.reject());
|
|
306
|
-
|
|
307
|
-
// const res = await services.getMeetingPreferences();
|
|
308
|
-
|
|
309
|
-
// assert.calledWith(webex.request, {
|
|
310
|
-
// method: 'GET',
|
|
311
|
-
// service: 'hydra',
|
|
312
|
-
// resource: 'meetingPreferences',
|
|
313
|
-
// });
|
|
314
|
-
// assert.isUndefined(res);
|
|
315
|
-
// });
|
|
316
|
-
// });
|
|
46
|
+
services.initialize();
|
|
47
|
+
|
|
48
|
+
// call the onReady callback
|
|
49
|
+
services.listenToOnce.getCall(1).args[2]();
|
|
50
|
+
await waitForAsync();
|
|
51
|
+
|
|
52
|
+
assert.isFalse(services.initFailed);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('initFailed is false when initialization succeeds no credentials are available', async () => {
|
|
56
|
+
services.listenToOnce = sinon.stub();
|
|
57
|
+
services.collectPreauthCatalog = sinon.stub().returns(Promise.resolve());
|
|
58
|
+
|
|
59
|
+
services.initialize();
|
|
60
|
+
|
|
61
|
+
// call the onReady callback
|
|
62
|
+
services.listenToOnce.getCall(1).args[2]();
|
|
63
|
+
await waitForAsync();
|
|
64
|
+
|
|
65
|
+
assert.isFalse(services.initFailed);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it.each([
|
|
69
|
+
{error: new Error('failed'), expectedMessage: 'failed'},
|
|
70
|
+
{error: undefined, expectedMessage: undefined},
|
|
71
|
+
])(
|
|
72
|
+
'sets initFailed to true when collectPreauthCatalog errors',
|
|
73
|
+
async ({error, expectedMessage}) => {
|
|
74
|
+
services.collectPreauthCatalog = sinon.stub().callsFake(() => {
|
|
75
|
+
return Promise.reject(error);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
services.listenToOnce = sinon.stub();
|
|
79
|
+
services.logger.error = sinon.stub();
|
|
80
|
+
|
|
81
|
+
services.initialize();
|
|
82
|
+
|
|
83
|
+
// call the onReady callback
|
|
84
|
+
services.listenToOnce.getCall(1).args[2]();
|
|
85
|
+
|
|
86
|
+
await waitForAsync();
|
|
87
|
+
|
|
88
|
+
assert.isTrue(services.initFailed);
|
|
89
|
+
sinon.assert.calledWith(
|
|
90
|
+
services.logger.error,
|
|
91
|
+
`services: failed to init initial services when no credentials available, ${expectedMessage}`
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
it.each([
|
|
97
|
+
{error: new Error('failed'), expectedMessage: 'failed'},
|
|
98
|
+
{error: undefined, expectedMessage: undefined},
|
|
99
|
+
])(
|
|
100
|
+
'sets initFailed to true when initServiceCatalogs errors',
|
|
101
|
+
async ({error, expectedMessage}) => {
|
|
102
|
+
services.initServiceCatalogs = sinon.stub().callsFake(() => {
|
|
103
|
+
return Promise.reject(error);
|
|
104
|
+
});
|
|
105
|
+
services.webex.credentials = {
|
|
106
|
+
supertoken: {
|
|
107
|
+
access_token: 'token',
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
services.listenToOnce = sinon.stub();
|
|
112
|
+
services.logger.error = sinon.stub();
|
|
113
|
+
|
|
114
|
+
services.initialize();
|
|
115
|
+
|
|
116
|
+
// call the onReady callback
|
|
117
|
+
services.listenToOnce.getCall(1).args[2]();
|
|
118
|
+
|
|
119
|
+
await waitForAsync();
|
|
120
|
+
|
|
121
|
+
assert.isTrue(services.initFailed);
|
|
122
|
+
sinon.assert.calledWith(
|
|
123
|
+
services.logger.error,
|
|
124
|
+
`services: failed to init initial services when credentials available, ${expectedMessage}`
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
describe('#initServiceCatalogs', () => {
|
|
131
|
+
it('does not set initFailed to true when updateServices succeeds', async () => {
|
|
132
|
+
services.webex.credentials = {
|
|
133
|
+
getOrgId: sinon.stub().returns('orgId'),
|
|
134
|
+
canAuthorize: true,
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
services.collectPreauthCatalog = sinon.stub().callsFake(() => {
|
|
138
|
+
return Promise.resolve();
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
services.updateServices = sinon.stub().callsFake(() => {
|
|
142
|
+
return Promise.resolve();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
services.logger.error = sinon.stub();
|
|
146
|
+
|
|
147
|
+
await services.initServiceCatalogs();
|
|
148
|
+
|
|
149
|
+
assert.isFalse(services.initFailed);
|
|
150
|
+
|
|
151
|
+
sinon.assert.calledWith(services.collectPreauthCatalog, {orgId: 'orgId'});
|
|
152
|
+
sinon.assert.notCalled(services.logger.warn);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('sets initFailed to true when updateServices errors', async () => {
|
|
156
|
+
const error = new Error('failed');
|
|
157
|
+
|
|
158
|
+
services.webex.credentials = {
|
|
159
|
+
getOrgId: sinon.stub().returns('orgId'),
|
|
160
|
+
canAuthorize: true,
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
services.collectPreauthCatalog = sinon.stub().callsFake(() => {
|
|
164
|
+
return Promise.resolve();
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
services.updateServices = sinon.stub().callsFake(() => {
|
|
168
|
+
return Promise.reject(error);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
services.logger.error = sinon.stub();
|
|
172
|
+
|
|
173
|
+
await services.initServiceCatalogs();
|
|
174
|
+
|
|
175
|
+
assert.isTrue(services.initFailed);
|
|
176
|
+
|
|
177
|
+
sinon.assert.calledWith(services.collectPreauthCatalog, {orgId: 'orgId'});
|
|
178
|
+
sinon.assert.calledWith(services.logger.warn, 'services: cannot retrieve postauth catalog');
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
describe('#namespace', () => {
|
|
183
|
+
it('is accurate to plugin name', () => {
|
|
184
|
+
assert.equal(services.namespace, 'Services');
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe('#_catalogs', () => {
|
|
189
|
+
it('is a weakmap', () => {
|
|
190
|
+
assert.typeOf(services._catalogs, 'weakmap');
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
describe('#validateDomains', () => {
|
|
195
|
+
it('is a boolean', () => {
|
|
196
|
+
assert.isBoolean(services.validateDomains);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
describe('#initFailed', () => {
|
|
201
|
+
it('is a boolean', () => {
|
|
202
|
+
assert.isFalse(services.initFailed);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
describe('#fetchClientRegionInfo', () => {
|
|
207
|
+
beforeEach(() => {
|
|
208
|
+
services.webex.config = {
|
|
209
|
+
services: {
|
|
210
|
+
discovery: {
|
|
211
|
+
sqdiscovery: 'https://test.ciscospark.com/v1/region',
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('successfully resolves with undefined if fetch request failed', () => {
|
|
218
|
+
webex.request = sinon.stub().returns(Promise.reject());
|
|
219
|
+
|
|
220
|
+
return services.fetchClientRegionInfo().then((r) => {
|
|
221
|
+
assert.isUndefined(r);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('successfully resolves with true if fetch request succeeds', () => {
|
|
226
|
+
webex.request = sinon.stub().returns(Promise.resolve({body: true}));
|
|
227
|
+
|
|
228
|
+
return services.fetchClientRegionInfo().then((r) => {
|
|
229
|
+
assert.equal(r, true);
|
|
230
|
+
assert.calledWith(webex.request, {
|
|
231
|
+
uri: 'https://test.ciscospark.com/v1/region',
|
|
232
|
+
addAuthHeader: false,
|
|
233
|
+
headers: {'spark-user-agent': null},
|
|
234
|
+
timeout: 5000,
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
describe('#getMeetingPreferences', () => {
|
|
241
|
+
it('Fetch login users information ', async () => {
|
|
242
|
+
const userPreferences = {userPreferences: 'userPreferences'};
|
|
243
|
+
|
|
244
|
+
webex.request = sinon.stub().returns(Promise.resolve({body: userPreferences}));
|
|
245
|
+
|
|
246
|
+
const res = await services.getMeetingPreferences();
|
|
247
|
+
|
|
248
|
+
assert.calledWith(webex.request, {
|
|
249
|
+
method: 'GET',
|
|
250
|
+
service: 'hydra',
|
|
251
|
+
resource: 'meetingPreferences',
|
|
252
|
+
});
|
|
253
|
+
assert.isDefined(res);
|
|
254
|
+
assert.equal(res, userPreferences);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('Resolve getMeetingPreferences if the api request fails ', async () => {
|
|
258
|
+
webex.request = sinon.stub().returns(Promise.reject());
|
|
259
|
+
|
|
260
|
+
const res = await services.getMeetingPreferences();
|
|
261
|
+
|
|
262
|
+
assert.calledWith(webex.request, {
|
|
263
|
+
method: 'GET',
|
|
264
|
+
service: 'hydra',
|
|
265
|
+
resource: 'meetingPreferences',
|
|
266
|
+
});
|
|
267
|
+
assert.isUndefined(res);
|
|
268
|
+
});
|
|
269
|
+
});
|
|
317
270
|
|
|
318
271
|
describe('#updateCatalog', () => {
|
|
319
272
|
it('updates the catalog', async () => {
|
|
@@ -334,118 +287,107 @@ describe('webex-core', () => {
|
|
|
334
287
|
});
|
|
335
288
|
});
|
|
336
289
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
// priority: 5,
|
|
439
|
-
// id: '0:0:0:example',
|
|
440
|
-
// },
|
|
441
|
-
// ],
|
|
442
|
-
// };
|
|
443
|
-
|
|
444
|
-
// const uri = 'http://example.com/somepath';
|
|
445
|
-
|
|
446
|
-
// assert.equal(services.replaceHostFromHostmap(uri), 'http://example-1.com/somepath');
|
|
447
|
-
// });
|
|
448
|
-
// });
|
|
290
|
+
describe('#_fetchNewServiceHostmap()', () => {
|
|
291
|
+
beforeEach(() => {
|
|
292
|
+
sinon.spy(webex.internal.newMetrics.callDiagnosticLatencies, 'measureLatency');
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
afterEach(() => {
|
|
296
|
+
sinon.restore();
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it('checks service request resolves', async () => {
|
|
300
|
+
const mapResponse = 'map response';
|
|
301
|
+
|
|
302
|
+
sinon.stub(services, '_formatReceivedHostmap').resolves(mapResponse);
|
|
303
|
+
sinon.stub(services, 'request').resolves({});
|
|
304
|
+
|
|
305
|
+
const mapResult = await services._fetchNewServiceHostmap({from: 'limited'});
|
|
306
|
+
|
|
307
|
+
assert.deepEqual(mapResult, mapResponse);
|
|
308
|
+
|
|
309
|
+
assert.calledOnceWithExactly(services.request, {
|
|
310
|
+
method: 'GET',
|
|
311
|
+
service: 'u2c',
|
|
312
|
+
resource: '/limited/catalog',
|
|
313
|
+
qs: {format: 'U2CV2'},
|
|
314
|
+
headers: {},
|
|
315
|
+
});
|
|
316
|
+
assert.calledOnceWithExactly(
|
|
317
|
+
webex.internal.newMetrics.callDiagnosticLatencies.measureLatency,
|
|
318
|
+
sinon.match.func,
|
|
319
|
+
'internal.get.u2c.time'
|
|
320
|
+
);
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it('checks service request rejects', async () => {
|
|
324
|
+
const error = new Error('some error');
|
|
325
|
+
|
|
326
|
+
sinon.spy(services, '_formatReceivedHostmap');
|
|
327
|
+
sinon.stub(services, 'request').rejects(error);
|
|
328
|
+
|
|
329
|
+
const promise = services._fetchNewServiceHostmap({from: 'limited'});
|
|
330
|
+
const rejectedValue = await assert.isRejected(promise);
|
|
331
|
+
|
|
332
|
+
assert.deepEqual(rejectedValue, error);
|
|
333
|
+
|
|
334
|
+
assert.notCalled(services._formatReceivedHostmap);
|
|
335
|
+
|
|
336
|
+
assert.calledOnceWithExactly(services.request, {
|
|
337
|
+
method: 'GET',
|
|
338
|
+
service: 'u2c',
|
|
339
|
+
resource: '/limited/catalog',
|
|
340
|
+
qs: {format: 'U2CV2'},
|
|
341
|
+
headers: {},
|
|
342
|
+
});
|
|
343
|
+
assert.calledOnceWithExactly(
|
|
344
|
+
webex.internal.newMetrics.callDiagnosticLatencies.measureLatency,
|
|
345
|
+
sinon.match.func,
|
|
346
|
+
'internal.get.u2c.time'
|
|
347
|
+
);
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
describe('replaceHostFromHostmap', () => {
|
|
352
|
+
it('returns the same uri if the hostmap is not set', () => {
|
|
353
|
+
services._hostCatalog = null;
|
|
354
|
+
|
|
355
|
+
const uri = 'http://example.com';
|
|
356
|
+
|
|
357
|
+
assert.equal(services.replaceHostFromHostmap(uri), uri);
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
it('returns the same uri if the hostmap does not contain the host', () => {
|
|
361
|
+
catalog.updateServiceGroups('preauth', [
|
|
362
|
+
{
|
|
363
|
+
id: 'example-1',
|
|
364
|
+
serviceName: 'example-1',
|
|
365
|
+
serviceUrls: [{host: 'example-1.com', baseUrl: 'http://example-1.com', priority: 1}],
|
|
366
|
+
},
|
|
367
|
+
]);
|
|
368
|
+
|
|
369
|
+
const uri = 'http://example.com';
|
|
370
|
+
|
|
371
|
+
assert.equal(services.replaceHostFromHostmap(uri), uri);
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
it('returns the replaces the host in the uri with the host from the hostmap', () => {
|
|
375
|
+
catalog.updateServiceGroups('preauth', [
|
|
376
|
+
{
|
|
377
|
+
id: 'example-1',
|
|
378
|
+
serviceName: 'example-1',
|
|
379
|
+
serviceUrls: [
|
|
380
|
+
{host: 'example-1.com', baseUrl: 'http://example-1.com', priority: 1},
|
|
381
|
+
{host: 'example.com', baseUrl: 'http://example.com', priority: 2},
|
|
382
|
+
],
|
|
383
|
+
},
|
|
384
|
+
]);
|
|
385
|
+
|
|
386
|
+
const uri = 'http://example.com/somepath';
|
|
387
|
+
|
|
388
|
+
assert.equal(services.replaceHostFromHostmap(uri), 'http://example-1.com/somepath');
|
|
389
|
+
});
|
|
390
|
+
});
|
|
449
391
|
|
|
450
392
|
describe('#_formatReceivedHostmap()', () => {
|
|
451
393
|
let serviceHostmap;
|
|
@@ -515,48 +457,60 @@ describe('webex-core', () => {
|
|
|
515
457
|
});
|
|
516
458
|
});
|
|
517
459
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
460
|
+
describe('#updateCredentialsConfig()', () => {
|
|
461
|
+
// updateCredentialsConfig must remove `/` if exist. so expected serviceList must be.
|
|
462
|
+
const expectedServiceList = {
|
|
463
|
+
idbroker: 'https://idbroker.webex.com',
|
|
464
|
+
identity: 'https://identity.webex.com',
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
beforeEach(async () => {
|
|
468
|
+
const servicesList = [
|
|
469
|
+
{
|
|
470
|
+
id: 'idbroker',
|
|
471
|
+
name: 'idbroker',
|
|
472
|
+
serviceUrls: [
|
|
473
|
+
{baseUrl: 'https://idbroker.webex.com/', host: 'idbroker.webex.com', priority: 1},
|
|
474
|
+
],
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
id: 'identity',
|
|
478
|
+
name: 'identity',
|
|
479
|
+
serviceUrls: [
|
|
480
|
+
{baseUrl: 'https://identity.webex.com/', host: 'identity.webex.com', priority: 1},
|
|
481
|
+
],
|
|
482
|
+
},
|
|
483
|
+
];
|
|
484
|
+
|
|
485
|
+
catalog.updateServiceGroups('preauth', servicesList);
|
|
486
|
+
await services.updateCredentialsConfig();
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
it('sets the idbroker url properly when trailing slash is not present', () => {
|
|
490
|
+
assert.equal(webex.config.credentials.idbroker.url, expectedServiceList.idbroker);
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
it('sets the identity url properly when a trailing slash is present', () => {
|
|
494
|
+
assert.equal(webex.config.credentials.identity.url, expectedServiceList.identity);
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
it('sets the authorize url properly when authorization string is not provided', () => {
|
|
498
|
+
assert.equal(
|
|
499
|
+
webex.config.credentials.authorizeUrl,
|
|
500
|
+
`${expectedServiceList.idbroker}/idb/oauth2/v1/authorize`
|
|
501
|
+
);
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
it('should retain the authorize url property when authorization string is provided', () => {
|
|
505
|
+
const authUrl = 'http://example-auth-url.com/resource';
|
|
506
|
+
|
|
507
|
+
webex.config.credentials.authorizationString = authUrl;
|
|
508
|
+
webex.config.credentials.authorizeUrl = authUrl;
|
|
509
|
+
|
|
510
|
+
services.updateCredentialsConfig();
|
|
511
|
+
|
|
512
|
+
assert.equal(webex.config.credentials.authorizeUrl, authUrl);
|
|
513
|
+
});
|
|
514
|
+
});
|
|
561
515
|
});
|
|
562
516
|
});
|