@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.
@@ -228,11 +228,11 @@ describe('plugin-meetings', () => {
228
228
  });
229
229
  });
230
230
 
231
- describe('updateLocusWithDelta', () => {
232
- it('should call handleLocusDelta with the new delta locus', () => {
231
+ describe('updateLocusFromApiResponse', () => {
232
+ it('should call handleLocusAPIResponse with the response body', () => {
233
233
  const meeting = {
234
234
  locusInfo: {
235
- handleLocusDelta: sinon.stub(),
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.updateLocusWithDelta(meeting, originalResponse);
245
+ const response = MeetingUtil.updateLocusFromApiResponse(meeting, originalResponse);
246
246
 
247
247
  assert.deepEqual(response, originalResponse);
248
- assert.calledOnceWithExactly(meeting.locusInfo.handleLocusDelta, 'locus', meeting);
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
- handleLocusDelta: sinon.stub(),
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.updateLocusWithDelta(meeting, originalResponse);
262
+ const response = MeetingUtil.updateLocusFromApiResponse(meeting, originalResponse);
263
263
 
264
264
  assert.deepEqual(response, originalResponse);
265
- assert.notCalled(meeting.locusInfo.handleLocusDelta);
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.updateLocusWithDelta(undefined, originalResponse);
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 updateLocusWithDeltaSpy = sinon.spy(MeetingUtil, 'updateLocusWithDelta');
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(updateLocusWithDeltaSpy, meeting, 'result');
299
+ assert.calledOnceWithExactly(updateLocusFromApiResponseSpy, meeting, 'result');
300
300
  assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
301
301
 
302
- updateLocusWithDeltaSpy.resetHistory();
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(updateLocusWithDeltaSpy, meeting, 'result');
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({body: {}, headers: {}}),
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});