@webex/plugin-meetings 3.8.0-next.8 → 3.8.0-next.81

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 (171) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +70 -6
  3. package/dist/breakouts/index.js.map +1 -1
  4. package/dist/common/errors/webex-errors.js +12 -2
  5. package/dist/common/errors/webex-errors.js.map +1 -1
  6. package/dist/config.js +5 -1
  7. package/dist/config.js.map +1 -1
  8. package/dist/constants.js +20 -123
  9. package/dist/constants.js.map +1 -1
  10. package/dist/controls-options-manager/enums.js +2 -0
  11. package/dist/controls-options-manager/enums.js.map +1 -1
  12. package/dist/controls-options-manager/types.js.map +1 -1
  13. package/dist/controls-options-manager/util.js +52 -0
  14. package/dist/controls-options-manager/util.js.map +1 -1
  15. package/dist/interpretation/index.js +1 -1
  16. package/dist/interpretation/siLanguage.js +1 -1
  17. package/dist/locus-info/controlsUtils.js +28 -10
  18. package/dist/locus-info/controlsUtils.js.map +1 -1
  19. package/dist/locus-info/index.js +62 -12
  20. package/dist/locus-info/index.js.map +1 -1
  21. package/dist/locus-info/selfUtils.js +432 -418
  22. package/dist/locus-info/selfUtils.js.map +1 -1
  23. package/dist/media/index.js +17 -17
  24. package/dist/media/index.js.map +1 -1
  25. package/dist/media/properties.js +94 -6
  26. package/dist/media/properties.js.map +1 -1
  27. package/dist/meeting/brbState.js +6 -0
  28. package/dist/meeting/brbState.js.map +1 -1
  29. package/dist/meeting/in-meeting-actions.js +17 -1
  30. package/dist/meeting/in-meeting-actions.js.map +1 -1
  31. package/dist/meeting/index.js +570 -302
  32. package/dist/meeting/index.js.map +1 -1
  33. package/dist/meeting/locusMediaRequest.js +0 -17
  34. package/dist/meeting/locusMediaRequest.js.map +1 -1
  35. package/dist/meeting/muteState.js +0 -2
  36. package/dist/meeting/muteState.js.map +1 -1
  37. package/dist/meeting/request.js +30 -0
  38. package/dist/meeting/request.js.map +1 -1
  39. package/dist/meeting/request.type.js.map +1 -1
  40. package/dist/meeting/util.js +13 -2
  41. package/dist/meeting/util.js.map +1 -1
  42. package/dist/meeting-info/meeting-info-v2.js +373 -68
  43. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  44. package/dist/meeting-info/utilv2.js +5 -1
  45. package/dist/meeting-info/utilv2.js.map +1 -1
  46. package/dist/meetings/index.js +136 -1
  47. package/dist/meetings/index.js.map +1 -1
  48. package/dist/meetings/util.js +14 -0
  49. package/dist/meetings/util.js.map +1 -1
  50. package/dist/member/index.js +10 -0
  51. package/dist/member/index.js.map +1 -1
  52. package/dist/member/util.js +330 -353
  53. package/dist/member/util.js.map +1 -1
  54. package/dist/members/index.js +42 -0
  55. package/dist/members/index.js.map +1 -1
  56. package/dist/members/request.js +38 -0
  57. package/dist/members/request.js.map +1 -1
  58. package/dist/members/util.js +36 -1
  59. package/dist/members/util.js.map +1 -1
  60. package/dist/metrics/constants.js +9 -0
  61. package/dist/metrics/constants.js.map +1 -1
  62. package/dist/reachability/clusterReachability.js +63 -27
  63. package/dist/reachability/clusterReachability.js.map +1 -1
  64. package/dist/reachability/index.js +112 -47
  65. package/dist/reachability/index.js.map +1 -1
  66. package/dist/reachability/reachability.types.js +14 -0
  67. package/dist/reachability/reachability.types.js.map +1 -1
  68. package/dist/reachability/request.js +19 -3
  69. package/dist/reachability/request.js.map +1 -1
  70. package/dist/reconnection-manager/index.js +2 -2
  71. package/dist/reconnection-manager/index.js.map +1 -1
  72. package/dist/roap/index.js.map +1 -1
  73. package/dist/roap/turnDiscovery.js +45 -27
  74. package/dist/roap/turnDiscovery.js.map +1 -1
  75. package/dist/roap/types.js +17 -0
  76. package/dist/roap/types.js.map +1 -0
  77. package/dist/types/common/errors/webex-errors.d.ts +7 -1
  78. package/dist/types/config.d.ts +3 -0
  79. package/dist/types/constants.d.ts +13 -85
  80. package/dist/types/controls-options-manager/enums.d.ts +3 -1
  81. package/dist/types/controls-options-manager/types.d.ts +7 -1
  82. package/dist/types/locus-info/index.d.ts +3 -3
  83. package/dist/types/locus-info/selfUtils.d.ts +216 -1
  84. package/dist/types/media/properties.d.ts +15 -0
  85. package/dist/types/meeting/in-meeting-actions.d.ts +16 -0
  86. package/dist/types/meeting/index.d.ts +43 -1
  87. package/dist/types/meeting/muteState.d.ts +0 -1
  88. package/dist/types/meeting/request.d.ts +12 -1
  89. package/dist/types/meeting/request.type.d.ts +6 -0
  90. package/dist/types/meeting/util.d.ts +3 -1
  91. package/dist/types/meeting-info/meeting-info-v2.d.ts +82 -1
  92. package/dist/types/meetings/index.d.ts +57 -0
  93. package/dist/types/member/index.d.ts +1 -0
  94. package/dist/types/member/util.d.ts +159 -1
  95. package/dist/types/members/index.d.ts +15 -0
  96. package/dist/types/members/request.d.ts +26 -0
  97. package/dist/types/members/util.d.ts +27 -0
  98. package/dist/types/metrics/constants.d.ts +9 -0
  99. package/dist/types/reachability/clusterReachability.d.ts +15 -7
  100. package/dist/types/reachability/index.d.ts +10 -1
  101. package/dist/types/reachability/reachability.types.d.ts +5 -0
  102. package/dist/types/roap/index.d.ts +3 -2
  103. package/dist/types/roap/turnDiscovery.d.ts +5 -17
  104. package/dist/types/roap/types.d.ts +16 -0
  105. package/dist/webinar/index.js +1 -1
  106. package/package.json +24 -23
  107. package/src/breakouts/index.ts +69 -0
  108. package/src/common/errors/webex-errors.ts +8 -1
  109. package/src/config.ts +3 -0
  110. package/src/constants.ts +20 -90
  111. package/src/controls-options-manager/enums.ts +2 -0
  112. package/src/controls-options-manager/types.ts +11 -1
  113. package/src/controls-options-manager/util.ts +62 -0
  114. package/src/locus-info/controlsUtils.ts +44 -14
  115. package/src/locus-info/index.ts +56 -13
  116. package/src/locus-info/selfUtils.ts +496 -442
  117. package/src/media/index.ts +23 -21
  118. package/src/media/properties.ts +96 -0
  119. package/src/meeting/brbState.ts +7 -0
  120. package/src/meeting/in-meeting-actions.ts +32 -0
  121. package/src/meeting/index.ts +382 -93
  122. package/src/meeting/locusMediaRequest.ts +0 -18
  123. package/src/meeting/muteState.ts +0 -2
  124. package/src/meeting/request.ts +36 -1
  125. package/src/meeting/request.type.ts +7 -0
  126. package/src/meeting/util.ts +11 -2
  127. package/src/meeting-info/meeting-info-v2.ts +254 -8
  128. package/src/meeting-info/utilv2.ts +5 -0
  129. package/src/meetings/index.ts +148 -1
  130. package/src/meetings/util.ts +18 -0
  131. package/src/member/index.ts +13 -2
  132. package/src/member/util.ts +351 -348
  133. package/src/members/index.ts +47 -0
  134. package/src/members/request.ts +44 -0
  135. package/src/members/util.ts +43 -1
  136. package/src/metrics/constants.ts +9 -0
  137. package/src/reachability/clusterReachability.ts +73 -26
  138. package/src/reachability/index.ts +70 -1
  139. package/src/reachability/reachability.types.ts +6 -0
  140. package/src/reachability/request.ts +7 -0
  141. package/src/reconnection-manager/index.ts +2 -2
  142. package/src/roap/index.ts +3 -7
  143. package/src/roap/turnDiscovery.ts +34 -39
  144. package/src/roap/types.ts +23 -0
  145. package/test/unit/spec/breakouts/index.ts +167 -95
  146. package/test/unit/spec/controls-options-manager/util.js +120 -0
  147. package/test/unit/spec/locus-info/controlsUtils.js +103 -9
  148. package/test/unit/spec/locus-info/index.js +167 -73
  149. package/test/unit/spec/locus-info/selfUtils.js +98 -24
  150. package/test/unit/spec/media/index.ts +150 -18
  151. package/test/unit/spec/media/properties.ts +130 -0
  152. package/test/unit/spec/meeting/brbState.ts +19 -0
  153. package/test/unit/spec/meeting/in-meeting-actions.ts +19 -4
  154. package/test/unit/spec/meeting/index.js +557 -35
  155. package/test/unit/spec/meeting/locusMediaRequest.ts +0 -30
  156. package/test/unit/spec/meeting/muteState.js +0 -2
  157. package/test/unit/spec/meeting/request.js +32 -1
  158. package/test/unit/spec/meeting/utils.js +119 -18
  159. package/test/unit/spec/meeting-info/meetinginfov2.js +484 -114
  160. package/test/unit/spec/meeting-info/utilv2.js +19 -0
  161. package/test/unit/spec/meetings/index.js +146 -2
  162. package/test/unit/spec/member/index.js +7 -0
  163. package/test/unit/spec/member/util.js +24 -0
  164. package/test/unit/spec/members/index.js +140 -26
  165. package/test/unit/spec/members/request.js +68 -22
  166. package/test/unit/spec/members/utils.js +75 -0
  167. package/test/unit/spec/reachability/clusterReachability.ts +88 -56
  168. package/test/unit/spec/reachability/index.ts +101 -0
  169. package/test/unit/spec/reachability/request.js +47 -2
  170. package/test/unit/spec/reconnection-manager/index.js +4 -4
  171. package/test/unit/spec/roap/turnDiscovery.ts +110 -28
@@ -169,26 +169,6 @@ describe('LocusMediaRequest.send()', () => {
169
169
  mockWebex.internal.newMetrics.submitClientEvent.resetHistory();
170
170
  };
171
171
 
172
- const checkMetrics = (expectedMetrics: boolean = true) => {
173
- if (expectedMetrics) {
174
- assert.calledWith(mockWebex.internal.newMetrics.submitClientEvent, {
175
- name: 'client.locus.media.request',
176
- options: {
177
- meetingId: 'meetingId',
178
- },
179
- });
180
-
181
- assert.calledWith(mockWebex.internal.newMetrics.submitClientEvent, {
182
- name: 'client.locus.media.response',
183
- options: {
184
- meetingId: 'meetingId',
185
- },
186
- });
187
- } else {
188
- assert.notCalled(mockWebex.internal.newMetrics.submitClientEvent);
189
- }
190
- };
191
-
192
172
  it('sends a roap message', async () => {
193
173
  const result = await sendRoapMessage('OFFER');
194
174
 
@@ -201,8 +181,6 @@ describe('LocusMediaRequest.send()', () => {
201
181
  upload: sinon.match.instanceOf(EventEmitter),
202
182
  download: sinon.match.instanceOf(EventEmitter),
203
183
  });
204
-
205
- checkMetrics();
206
184
  });
207
185
 
208
186
  it('sends correct metric event when roap message fails', async () => {
@@ -232,8 +210,6 @@ describe('LocusMediaRequest.send()', () => {
232
210
  upload: sinon.match.instanceOf(EventEmitter),
233
211
  download: sinon.match.instanceOf(EventEmitter),
234
212
  });
235
-
236
- checkMetrics(false);
237
213
  });
238
214
 
239
215
  it('sends a local mute request with sequence', async () => {
@@ -282,8 +258,6 @@ describe('LocusMediaRequest.send()', () => {
282
258
  upload: sinon.match.instanceOf(EventEmitter),
283
259
  download: sinon.match.instanceOf(EventEmitter),
284
260
  });
285
-
286
- checkMetrics(false);
287
261
  });
288
262
 
289
263
  it('sends a local mute request with the last audio/video mute values', async () => {
@@ -303,8 +277,6 @@ describe('LocusMediaRequest.send()', () => {
303
277
  upload: sinon.match.instanceOf(EventEmitter),
304
278
  download: sinon.match.instanceOf(EventEmitter),
305
279
  });
306
-
307
- checkMetrics(false);
308
280
  });
309
281
 
310
282
  it('sends only roap when roap and local mute are requested', async () => {
@@ -324,8 +296,6 @@ describe('LocusMediaRequest.send()', () => {
324
296
  upload: sinon.match.instanceOf(EventEmitter),
325
297
  download: sinon.match.instanceOf(EventEmitter),
326
298
  });
327
-
328
- checkMetrics();
329
299
  });
330
300
 
331
301
  describe('queueing', () => {
@@ -2,7 +2,6 @@ import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
3
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
4
  import {createMuteState, MuteState} from '@webex/plugin-meetings/src/meeting/muteState';
5
- import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
6
5
  import {AUDIO, VIDEO} from '@webex/plugin-meetings/src/constants';
7
6
 
8
7
  import testUtils from '../../../utils/testUtils';
@@ -39,7 +38,6 @@ describe('plugin-meetings', () => {
39
38
  unmuteAllowed: true,
40
39
  remoteVideoMuted: false,
41
40
  unmuteVideoAllowed: true,
42
-
43
41
  locusInfo: {
44
42
  handleLocusDelta: sinon.stub(),
45
43
  },
@@ -1,4 +1,5 @@
1
1
  import 'jsdom-global/register';
2
+ import {v4 as uuidv4} from 'uuid';
2
3
  import sinon from 'sinon';
3
4
  import {assert} from '@webex/test-helper-chai';
4
5
  import MockWebex from '@webex/test-helper-mock-webex';
@@ -205,7 +206,7 @@ describe('plugin-meetings', () => {
205
206
  roapMessage,
206
207
  reachability,
207
208
  permissionToken,
208
- clientMediaPreferences
209
+ clientMediaPreferences,
209
210
  });
210
211
  const requestParams = meetingsRequest.request.getCall(0).args[0];
211
212
 
@@ -630,6 +631,36 @@ describe('plugin-meetings', () => {
630
631
  });
631
632
  });
632
633
 
634
+ describe('#setPostMeetingDataConsent', () => {
635
+ [true, false].forEach((consent) => {
636
+ it(`sends request to set post meeting data consent with ${consent}`, async () => {
637
+ const locusUrl = `https://locus-test.wbx2.com/locus/api/v1/loci/${consent}`;
638
+ const selfId = uuidv4();
639
+ const deviceUrl = `https://wdm-test.wbx2.com/wdm/api/v1/devices/${consent}`;
640
+
641
+ const consentPromise = meetingsRequest.setPostMeetingDataConsent({
642
+ postMeetingDataConsent: consent,
643
+ locusUrl,
644
+ selfId,
645
+ deviceUrl,
646
+ });
647
+ assert.exists(consentPromise.then);
648
+ await consentPromise;
649
+
650
+ checkRequest({
651
+ method: 'PATCH',
652
+ uri: `${locusUrl}/participant/${selfId}/controls`,
653
+ body: {
654
+ consent: {
655
+ postMeetingDataConsent: consent,
656
+ deviceUrl,
657
+ },
658
+ },
659
+ });
660
+ });
661
+ });
662
+ });
663
+
633
664
  describe('#prepareLeaveMeetingRequestOptions', () => {
634
665
  it('returns expected result', async () => {
635
666
  const result = meetingsRequest.prepareLeaveMeetingRequestOptions({
@@ -66,7 +66,7 @@ describe('plugin-meetings', () => {
66
66
 
67
67
  describe('#cleanup', () => {
68
68
  it('do clean up on meeting object with LLM enabled', async () => {
69
- meeting.config = {enableAutomaticLLM : true};
69
+ meeting.config = {enableAutomaticLLM: true};
70
70
  await MeetingUtil.cleanUp(meeting);
71
71
  assert.calledOnce(meeting.cleanupLocalStreams);
72
72
  assert.calledOnce(meeting.closeRemoteStreams);
@@ -84,7 +84,7 @@ describe('plugin-meetings', () => {
84
84
  });
85
85
 
86
86
  it('do clean up on meeting object with LLM disabled', async () => {
87
- meeting.config = {enableAutomaticLLM : false};
87
+ meeting.config = {enableAutomaticLLM: false};
88
88
  await MeetingUtil.cleanUp(meeting);
89
89
  assert.calledOnce(meeting.cleanupLocalStreams);
90
90
  assert.calledOnce(meeting.closeRemoteStreams);
@@ -392,8 +392,7 @@ describe('plugin-meetings', () => {
392
392
  meetingJoinUrl: 'meetingJoinUrl',
393
393
  locusUrl: 'locusUrl',
394
394
  meetingRequest: {
395
- joinMeeting: sinon.stub().returns(
396
- Promise.resolve(joinMeetingResponse)),
395
+ joinMeeting: sinon.stub().returns(Promise.resolve(joinMeetingResponse)),
397
396
  },
398
397
  getWebexObject: sinon.stub().returns(webex),
399
398
  setLocus: sinon.stub(),
@@ -410,23 +409,29 @@ describe('plugin-meetings', () => {
410
409
  id: 'fake client media preferences',
411
410
  };
412
411
 
413
- webex.meetings.reachability.getReachabilityReportToAttachToRoap.resolves(FAKE_REACHABILITY_REPORT);
414
- webex.meetings.reachability.getClientMediaPreferences.resolves(FAKE_CLIENT_MEDIA_PREFERENCES);
412
+ webex.meetings.reachability.getReachabilityReportToAttachToRoap.resolves(
413
+ FAKE_REACHABILITY_REPORT
414
+ );
415
+ webex.meetings.reachability.getClientMediaPreferences.resolves(
416
+ FAKE_CLIENT_MEDIA_PREFERENCES
417
+ );
415
418
 
416
- sinon
417
- .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4')
418
- .get(() => true);
419
- sinon
420
- .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6')
421
- .get(() => true);
419
+ sinon.stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4').get(() => true);
420
+ sinon.stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6').get(() => true);
422
421
 
423
422
  await MeetingUtil.joinMeeting(meeting, {
424
423
  reachability: 'reachability',
425
424
  roapMessage: 'roapMessage',
426
425
  });
427
426
 
428
- assert.calledOnceWithExactly(webex.meetings.reachability.getReachabilityReportToAttachToRoap);
429
- assert.calledOnceWithExactly(webex.meetings.reachability.getClientMediaPreferences, meeting.isMultistream, IP_VERSION.ipv4_and_ipv6);
427
+ assert.calledOnceWithExactly(
428
+ webex.meetings.reachability.getReachabilityReportToAttachToRoap
429
+ );
430
+ assert.calledOnceWithExactly(
431
+ webex.meetings.reachability.getClientMediaPreferences,
432
+ meeting.isMultistream,
433
+ IP_VERSION.ipv4_and_ipv6
434
+ );
430
435
 
431
436
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
432
437
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
@@ -436,9 +441,9 @@ describe('plugin-meetings', () => {
436
441
  assert.equal(parameter.clientMediaPreferences, FAKE_CLIENT_MEDIA_PREFERENCES);
437
442
  assert.equal(parameter.roapMessage, 'roapMessage');
438
443
 
439
- assert.calledOnce(meeting.setLocus)
444
+ assert.calledOnce(meeting.setLocus);
440
445
  const setLocusParameter = meeting.setLocus.getCall(0).args[0];
441
- assert.deepEqual(setLocusParameter, MeetingUtil.parseLocusJoin(joinMeetingResponse))
446
+ assert.deepEqual(setLocusParameter, MeetingUtil.parseLocusJoin(joinMeetingResponse));
442
447
 
443
448
  assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
444
449
  name: 'client.locus.join.request',
@@ -460,6 +465,49 @@ describe('plugin-meetings', () => {
460
465
  });
461
466
  });
462
467
 
468
+ it('#Should call `meetingRequest.joinMeeting and handle a date header in the response : isoLocalClientMeetingJoinedTime', async () => {
469
+ meeting.isMultistream = true;
470
+
471
+ const FAKE_REACHABILITY_REPORT = {
472
+ id: 'fake reachability report',
473
+ };
474
+ const FAKE_CLIENT_MEDIA_PREFERENCES = {
475
+ id: 'fake client media preferences',
476
+ };
477
+
478
+ webex.meetings.reachability.getReachabilityReportToAttachToRoap.resolves(
479
+ FAKE_REACHABILITY_REPORT
480
+ );
481
+ webex.meetings.reachability.getClientMediaPreferences.resolves(
482
+ FAKE_CLIENT_MEDIA_PREFERENCES
483
+ );
484
+
485
+ sinon.stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4').get(() => true);
486
+ sinon.stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6').get(() => true);
487
+
488
+ meeting.meetingRequest.joinMeeting.resolves({
489
+ headers: {
490
+ date: 'test',
491
+ },
492
+ body: {
493
+ mediaConnections: [{mediaId: 'test'}],
494
+ locus: {
495
+ url: 'test',
496
+ self: {
497
+ id: 'test',
498
+ },
499
+ },
500
+ },
501
+ });
502
+
503
+ await MeetingUtil.joinMeeting(meeting, {
504
+ reachability: 'reachability',
505
+ roapMessage: 'roapMessage',
506
+ });
507
+
508
+ assert.equal(meeting.isoLocalClientMeetingJoinTime, 'test');
509
+ });
510
+
463
511
  it('should handle failed reachability report retrieval', async () => {
464
512
  webex.meetings.reachability.getReachabilityReportToAttachToRoap.rejects(
465
513
  new Error('fake error')
@@ -516,6 +564,17 @@ describe('plugin-meetings', () => {
516
564
  assert.equal(parameter.liveAnnotationSupported, true);
517
565
  });
518
566
 
567
+ it('#Should call meetingRequest.joinMeeting with alias passed through', async () => {
568
+ await MeetingUtil.joinMeeting(meeting, {
569
+ alias: 'alias name',
570
+ });
571
+
572
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
573
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
574
+
575
+ assert.equal(parameter.alias, 'alias name');
576
+ });
577
+
519
578
  it('#Should call meetingRequest.joinMeeting with locale=en_UK, deviceCapabilities=["TEST"] when they are passed in as those values', async () => {
520
579
  await MeetingUtil.joinMeeting(meeting, {
521
580
  locale: 'en_UK',
@@ -685,6 +744,18 @@ describe('plugin-meetings', () => {
685
744
  });
686
745
  });
687
746
 
747
+ describe('requiresPostMeetingDataConsentPrompt', () => {
748
+ it('works as expected', () => {
749
+ assert.deepEqual(
750
+ MeetingUtil.requiresPostMeetingDataConsentPrompt([
751
+ 'SHOW_POST_MEETING_DATA_CONSENT_PROMPT',
752
+ ]),
753
+ true
754
+ );
755
+ assert.deepEqual(MeetingUtil.requiresPostMeetingDataConsentPrompt([]), false);
756
+ });
757
+ });
758
+
688
759
  describe('canUserRenameOthers', () => {
689
760
  it('works as expected', () => {
690
761
  assert.deepEqual(MeetingUtil.canUserRenameOthers(['CAN_RENAME_OTHERS']), true);
@@ -694,8 +765,38 @@ describe('plugin-meetings', () => {
694
765
 
695
766
  describe('canShareWhiteBoard', () => {
696
767
  it('works as expected', () => {
697
- assert.deepEqual(MeetingUtil.canShareWhiteBoard(['SHARE_WHITEBOARD']), true);
698
- assert.deepEqual(MeetingUtil.canShareWhiteBoard([]), false);
768
+ assert.deepEqual(
769
+ MeetingUtil.canShareWhiteBoard(['SHARE_WHITEBOARD'], {
770
+ [SELF_POLICY.SUPPORT_WHITEBOARD]: true,
771
+ }),
772
+ true
773
+ );
774
+ assert.deepEqual(
775
+ MeetingUtil.canShareWhiteBoard([], {
776
+ [SELF_POLICY.SUPPORT_WHITEBOARD]: true,
777
+ }),
778
+ false
779
+ );
780
+ assert.deepEqual(
781
+ MeetingUtil.canShareWhiteBoard(['SHARE_WHITEBOARD'], {
782
+ [SELF_POLICY.SUPPORT_WHITEBOARD]: false,
783
+ }),
784
+ false
785
+ );
786
+ assert.deepEqual(
787
+ MeetingUtil.canShareWhiteBoard([], {
788
+ [SELF_POLICY.SUPPORT_WHITEBOARD]: false,
789
+ }),
790
+ false
791
+ );
792
+ assert.deepEqual(MeetingUtil.canShareWhiteBoard(['SHARE_WHITEBOARD'], undefined), false);
793
+ });
794
+ });
795
+
796
+ describe('canMoveToLobby', () => {
797
+ it('works as expected', () => {
798
+ assert.deepEqual(MeetingUtil.canMoveToLobby(['MOVE_TO_LOBBY']), true);
799
+ assert.deepEqual(MeetingUtil.canMoveToLobby([]), false);
699
800
  });
700
801
  });
701
802