@webex/plugin-meetings 3.9.0-next.14 → 3.9.0-next.16
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/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +23 -4
- package/dist/locus-info/index.js.map +1 -1
- package/dist/meeting/muteState.js +2 -5
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/util.js +7 -11
- package/dist/meeting/util.js.map +1 -1
- package/dist/member/types.js.map +1 -1
- package/dist/members/collection.js +13 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +39 -18
- package/dist/members/index.js.map +1 -1
- package/dist/types/locus-info/index.d.ts +52 -1
- package/dist/types/meeting/util.d.ts +3 -3
- package/dist/types/member/types.d.ts +1 -0
- package/dist/types/members/collection.d.ts +6 -0
- package/dist/types/members/index.d.ts +10 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +1 -1
- package/src/locus-info/index.ts +71 -4
- package/src/meeting/muteState.ts +2 -6
- package/src/meeting/util.ts +16 -20
- package/src/member/types.ts +1 -0
- package/src/members/collection.ts +11 -0
- package/src/members/index.ts +29 -3
- package/test/unit/spec/locus-info/index.js +23 -8
- package/test/unit/spec/meeting/muteState.js +32 -6
- package/test/unit/spec/meeting/utils.js +21 -16
- package/test/unit/spec/members/collection.js +120 -0
- package/test/unit/spec/members/index.js +42 -1
@@ -228,11 +228,11 @@ describe('plugin-meetings', () => {
|
|
228
228
|
});
|
229
229
|
});
|
230
230
|
|
231
|
-
describe('
|
232
|
-
it('should call
|
231
|
+
describe('updateLocusFromApiResponse', () => {
|
232
|
+
it('should call handleLocusAPIResponse with the response body', () => {
|
233
233
|
const meeting = {
|
234
234
|
locusInfo: {
|
235
|
-
|
235
|
+
handleLocusAPIResponse: sinon.stub(),
|
236
236
|
},
|
237
237
|
};
|
238
238
|
|
@@ -242,16 +242,16 @@ describe('plugin-meetings', () => {
|
|
242
242
|
},
|
243
243
|
};
|
244
244
|
|
245
|
-
const response = MeetingUtil.
|
245
|
+
const response = MeetingUtil.updateLocusFromApiResponse(meeting, originalResponse);
|
246
246
|
|
247
247
|
assert.deepEqual(response, originalResponse);
|
248
|
-
assert.calledOnceWithExactly(meeting.locusInfo.
|
248
|
+
assert.calledOnceWithExactly(meeting.locusInfo.handleLocusAPIResponse, meeting, originalResponse.body);
|
249
249
|
});
|
250
250
|
|
251
251
|
it('should handle locus being missing from the response', () => {
|
252
252
|
const meeting = {
|
253
253
|
locusInfo: {
|
254
|
-
|
254
|
+
handleLocusAPIResponse: sinon.stub(),
|
255
255
|
},
|
256
256
|
};
|
257
257
|
|
@@ -259,10 +259,10 @@ describe('plugin-meetings', () => {
|
|
259
259
|
body: {},
|
260
260
|
};
|
261
261
|
|
262
|
-
const response = MeetingUtil.
|
262
|
+
const response = MeetingUtil.updateLocusFromApiResponse(meeting, originalResponse);
|
263
263
|
|
264
264
|
assert.deepEqual(response, originalResponse);
|
265
|
-
assert.notCalled(meeting.locusInfo.
|
265
|
+
assert.notCalled(meeting.locusInfo.handleLocusAPIResponse);
|
266
266
|
});
|
267
267
|
|
268
268
|
it('should work with an undefined meeting', () => {
|
@@ -272,14 +272,14 @@ describe('plugin-meetings', () => {
|
|
272
272
|
},
|
273
273
|
};
|
274
274
|
|
275
|
-
const response = MeetingUtil.
|
275
|
+
const response = MeetingUtil.updateLocusFromApiResponse(undefined, originalResponse);
|
276
276
|
assert.deepEqual(response, originalResponse);
|
277
277
|
});
|
278
278
|
});
|
279
279
|
|
280
280
|
describe('generateLocusDeltaRequest', () => {
|
281
281
|
it('generates the correct wrapper function', async () => {
|
282
|
-
const
|
282
|
+
const updateLocusFromApiResponseSpy = sinon.spy(MeetingUtil, 'updateLocusFromApiResponse');
|
283
283
|
const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
|
284
284
|
|
285
285
|
const meeting = {
|
@@ -296,16 +296,16 @@ describe('plugin-meetings', () => {
|
|
296
296
|
let result = await locusDeltaRequest(options);
|
297
297
|
|
298
298
|
assert.equal(result, 'result');
|
299
|
-
assert.calledOnceWithExactly(
|
299
|
+
assert.calledOnceWithExactly(updateLocusFromApiResponseSpy, meeting, 'result');
|
300
300
|
assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
|
301
301
|
|
302
|
-
|
302
|
+
updateLocusFromApiResponseSpy.resetHistory();
|
303
303
|
addSequenceSpy.resetHistory();
|
304
304
|
|
305
305
|
// body missing from options
|
306
306
|
result = await locusDeltaRequest({});
|
307
307
|
assert.equal(result, 'result');
|
308
|
-
assert.calledOnceWithExactly(
|
308
|
+
assert.calledOnceWithExactly(updateLocusFromApiResponseSpy, meeting, 'result');
|
309
309
|
assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
|
310
310
|
|
311
311
|
// meeting disappears so the WeakRef returns undefined
|
@@ -359,7 +359,11 @@ describe('plugin-meetings', () => {
|
|
359
359
|
});
|
360
360
|
|
361
361
|
describe('remoteUpdateAudioVideo', () => {
|
362
|
-
it('#Should call meetingRequest.locusMediaRequest with correct parameters', async () => {
|
362
|
+
it('#Should call meetingRequest.locusMediaRequest with correct parameters and return the full response', async () => {
|
363
|
+
const fakeResponse = {
|
364
|
+
body: { locus: { url: 'locusUrl'}},
|
365
|
+
headers: { },
|
366
|
+
};
|
363
367
|
const meeting = {
|
364
368
|
id: 'meeting-id',
|
365
369
|
mediaId: '12345',
|
@@ -368,13 +372,14 @@ describe('plugin-meetings', () => {
|
|
368
372
|
sequence: {},
|
369
373
|
},
|
370
374
|
locusMediaRequest: {
|
371
|
-
send: sinon.stub().resolves(
|
375
|
+
send: sinon.stub().resolves(fakeResponse),
|
372
376
|
},
|
373
377
|
getWebexObject: sinon.stub().returns(webex),
|
374
378
|
};
|
375
379
|
|
376
|
-
await MeetingUtil.remoteUpdateAudioVideo(meeting, true, false);
|
380
|
+
const result = await MeetingUtil.remoteUpdateAudioVideo(meeting, true, false);
|
377
381
|
|
382
|
+
assert.deepEqual(result, fakeResponse);
|
378
383
|
assert.calledOnceWithExactly(meeting.locusMediaRequest.send, {
|
379
384
|
mediaId: '12345',
|
380
385
|
muteOptions: {
|
@@ -0,0 +1,120 @@
|
|
1
|
+
const { default: MembersCollection } = require("../../../../src/members/collection");
|
2
|
+
const { default: Member } = require("../../../../src/member");
|
3
|
+
const { assert } = require('@webex/test-helper-chai');
|
4
|
+
|
5
|
+
|
6
|
+
describe('plugin-meetings', () => {
|
7
|
+
describe('MembersCollection', () => {
|
8
|
+
let collection;
|
9
|
+
let member1;
|
10
|
+
let member2;
|
11
|
+
const participant1 = { controls: {}, status: {} };
|
12
|
+
const participant2 = { controls: {}, status: {} };
|
13
|
+
|
14
|
+
beforeEach(() => {
|
15
|
+
collection = new MembersCollection();
|
16
|
+
member1 = new Member(participant1);
|
17
|
+
member2 = new Member(participant2);
|
18
|
+
});
|
19
|
+
|
20
|
+
it('starts with no members', () => {
|
21
|
+
assert.equal(Object.keys(collection.getAll()).length, 0);
|
22
|
+
});
|
23
|
+
|
24
|
+
it('can add members', () => {
|
25
|
+
collection.set('member1', member1);
|
26
|
+
assert.equal(Object.keys(collection.getAll()).length, 1);
|
27
|
+
assert.equal(collection.get('member1'), member1);
|
28
|
+
|
29
|
+
collection.set('member2', member2);
|
30
|
+
assert.equal(Object.keys(collection.getAll()).length, 2);
|
31
|
+
assert.equal(collection.get('member2'), member2);
|
32
|
+
});
|
33
|
+
|
34
|
+
it('can remove members', () => {
|
35
|
+
// Add some members first
|
36
|
+
collection.set('member1', member1);
|
37
|
+
collection.set('member2', member2);
|
38
|
+
assert.equal(Object.keys(collection.getAll()).length, 2);
|
39
|
+
|
40
|
+
// Remove one member
|
41
|
+
collection.remove('member1');
|
42
|
+
assert.equal(Object.keys(collection.getAll()).length, 1);
|
43
|
+
assert.equal(collection.get('member1'), undefined);
|
44
|
+
assert.equal(collection.get('member2'), member2);
|
45
|
+
|
46
|
+
// Remove another member
|
47
|
+
collection.remove('member2');
|
48
|
+
assert.equal(Object.keys(collection.getAll()).length, 0);
|
49
|
+
assert.equal(collection.get('member2'), undefined);
|
50
|
+
|
51
|
+
// Removing non-existent member should not cause errors
|
52
|
+
collection.remove('nonExistent');
|
53
|
+
assert.equal(Object.keys(collection.getAll()).length, 0);
|
54
|
+
});
|
55
|
+
|
56
|
+
describe('reset', () => {
|
57
|
+
it('removes all members', () => {
|
58
|
+
// Add some members first
|
59
|
+
collection.set('member1', member1);
|
60
|
+
collection.set('member2', member2);
|
61
|
+
assert.equal(Object.keys(collection.getAll()).length, 2);
|
62
|
+
|
63
|
+
// Reset should clear all members
|
64
|
+
collection.reset();
|
65
|
+
assert.equal(Object.keys(collection.getAll()).length, 0);
|
66
|
+
assert.equal(collection.get('member1'), undefined);
|
67
|
+
assert.equal(collection.get('member2'), undefined);
|
68
|
+
});
|
69
|
+
});
|
70
|
+
|
71
|
+
describe('setAll', () => {
|
72
|
+
it('replaces all members with new collection', () => {
|
73
|
+
// Add initial member
|
74
|
+
collection.set('member1', member1);
|
75
|
+
assert.equal(Object.keys(collection.getAll()).length, 1);
|
76
|
+
|
77
|
+
// Set all with new collection
|
78
|
+
const newMembers = {
|
79
|
+
'member2': member2,
|
80
|
+
'member3': new Member(participant1)
|
81
|
+
};
|
82
|
+
collection.setAll(newMembers);
|
83
|
+
|
84
|
+
assert.equal(Object.keys(collection.getAll()).length, 2);
|
85
|
+
assert.equal(collection.get('member1'), undefined);
|
86
|
+
assert.equal(collection.get('member2'), member2);
|
87
|
+
assert.exists(collection.get('member3'));
|
88
|
+
});
|
89
|
+
});
|
90
|
+
|
91
|
+
describe('get', () => {
|
92
|
+
it('returns undefined for non-existent members', () => {
|
93
|
+
assert.equal(collection.get('nonExistent'), undefined);
|
94
|
+
});
|
95
|
+
|
96
|
+
it('returns correct member for existing id', () => {
|
97
|
+
collection.set('member1', member1);
|
98
|
+
assert.equal(collection.get('member1'), member1);
|
99
|
+
});
|
100
|
+
});
|
101
|
+
|
102
|
+
describe('getAll', () => {
|
103
|
+
it('returns empty object when no members', () => {
|
104
|
+
const allMembers = collection.getAll();
|
105
|
+
assert.isObject(allMembers);
|
106
|
+
assert.equal(Object.keys(allMembers).length, 0);
|
107
|
+
});
|
108
|
+
|
109
|
+
it('returns all members', () => {
|
110
|
+
collection.set('member1', member1);
|
111
|
+
collection.set('member2', member2);
|
112
|
+
|
113
|
+
const allMembers = collection.getAll();
|
114
|
+
assert.equal(Object.keys(allMembers).length, 2);
|
115
|
+
assert.equal(allMembers.member1, member1);
|
116
|
+
assert.equal(allMembers.member2, member2);
|
117
|
+
});
|
118
|
+
});
|
119
|
+
});
|
120
|
+
});
|
@@ -320,9 +320,18 @@ describe('plugin-meetings', () => {
|
|
320
320
|
EVENT_TRIGGERS.MEMBERS_CLEAR,
|
321
321
|
{}
|
322
322
|
);
|
323
|
+
sinon.restore();
|
323
324
|
});
|
324
325
|
});
|
325
326
|
describe('#locusParticipantsUpdate', () => {
|
327
|
+
beforeEach(() => {
|
328
|
+
sinon.stub(Trigger, 'trigger');
|
329
|
+
});
|
330
|
+
|
331
|
+
afterEach(() => {
|
332
|
+
sinon.restore();
|
333
|
+
});
|
334
|
+
|
326
335
|
it('should send member update event with session info', () => {
|
327
336
|
const members = createMembers({url: url1});
|
328
337
|
const fakePayload = {
|
@@ -343,13 +352,45 @@ describe('plugin-meetings', () => {
|
|
343
352
|
},
|
344
353
|
EVENT_TRIGGERS.MEMBERS_UPDATE,
|
345
354
|
{
|
346
|
-
delta: {added: [], updated: []},
|
355
|
+
delta: {added: [], updated: [], removedIds: []},
|
347
356
|
full: {},
|
348
357
|
isReplace: true,
|
349
358
|
}
|
350
359
|
);
|
351
360
|
});
|
352
361
|
|
362
|
+
it('should handle participants being removed', () => {
|
363
|
+
const members = createMembers({url: url1});
|
364
|
+
|
365
|
+
// setup the collection with a fake member
|
366
|
+
members.membersCollection.setAll(fakeMembersCollection);
|
367
|
+
assert.equal(Object.keys(members.membersCollection.getAll()).length, 1);
|
368
|
+
|
369
|
+
// remove the member
|
370
|
+
members.locusParticipantsUpdate({
|
371
|
+
participants: [],
|
372
|
+
removedParticipantIds: ['test1'],
|
373
|
+
});
|
374
|
+
|
375
|
+
assert.equal(Object.keys(members.membersCollection.getAll()).length, 0);
|
376
|
+
|
377
|
+
// check that the event was emitted
|
378
|
+
assert.calledWith(
|
379
|
+
Trigger.trigger,
|
380
|
+
members,
|
381
|
+
{
|
382
|
+
file: 'members',
|
383
|
+
function: 'locusParticipantsUpdate',
|
384
|
+
},
|
385
|
+
EVENT_TRIGGERS.MEMBERS_UPDATE,
|
386
|
+
{
|
387
|
+
delta: {added: [], updated: [], removedIds: ['test1']},
|
388
|
+
full: {},
|
389
|
+
isReplace: false,
|
390
|
+
}
|
391
|
+
);
|
392
|
+
});
|
393
|
+
|
353
394
|
describe('handles members with paired devices correctly', () => {
|
354
395
|
const runCheck = (propsForUpdate, expectedPropsOnPairedMember) => {
|
355
396
|
const members = createMembers({url: url1});
|