@webex/plugin-meetings 1.149.0 → 1.150.1

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.
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
3
  */
4
-
4
+ import {cloneDeep, isEqual} from 'lodash';
5
5
  import sinon from 'sinon';
6
6
  import StateMachine from 'javascript-state-machine';
7
7
  import uuid from 'uuid';
@@ -27,6 +27,13 @@ import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
27
27
  import TriggerProxy from '@webex/plugin-meetings/src/common/events/trigger-proxy';
28
28
  import BrowserDetection from '@webex/plugin-meetings/src/common/browser-detection';
29
29
  import Metrics from '@webex/plugin-meetings/src/metrics';
30
+ import {
31
+ FLOOR_ACTION,
32
+ SHARE_STATUS,
33
+ METRICS_OPERATIONAL_MEASURES,
34
+ EVENTS,
35
+ EVENT_TRIGGERS
36
+ } from '@webex/plugin-meetings/src/constants';
30
37
 
31
38
  import {
32
39
  UserNotJoinedError,
@@ -35,7 +42,6 @@ import {
35
42
  NoMediaEstablishedYetError
36
43
  } from '../../../../src/common/errors/webex-errors';
37
44
  import WebExMeetingsErrors from '../../../../src/common/errors/webex-meetings-error';
38
- import {METRICS_OPERATIONAL_MEASURES, EVENTS, EVENT_TRIGGERS} from '../../../../src/constants';
39
45
  import ParameterError from '../../../../src/common/errors/parameter';
40
46
  import DefaultSDKConfig from '../../../../src/config';
41
47
  import testUtils from '../../../utils/testUtils';
@@ -2571,6 +2577,545 @@ describe('plugin-meetings', () => {
2571
2577
  });
2572
2578
  });
2573
2579
  });
2580
+
2581
+ describe('whiteboard share', () => {
2582
+ describe('#startWhiteboardShare', () => {
2583
+ beforeEach(() => {
2584
+ meeting.locusInfo.mediaShares = [{name: 'whiteboard', url: url1}];
2585
+ meeting.locusInfo.self = {url: url1};
2586
+ meeting.meetingRequest.changeMeetingFloor = sinon.stub().returns(Promise.resolve());
2587
+ });
2588
+ it('should have #startWhiteboardShare', () => {
2589
+ assert.exists(meeting.startWhiteboardShare);
2590
+ });
2591
+ it('should send the whiteboard share', async () => {
2592
+ const whiteboardShare = meeting.startWhiteboardShare({
2593
+ channelUrl: url2
2594
+ });
2595
+
2596
+ assert.exists(whiteboardShare.then);
2597
+ await whiteboardShare;
2598
+ assert.calledOnce(meeting.meetingRequest.changeMeetingFloor);
2599
+ });
2600
+ });
2601
+ describe('#stopWhiteboardShare', () => {
2602
+ it('should have #stopWhiteboardShare', () => {
2603
+ assert.exists(meeting.stopWhiteboardShare);
2604
+ });
2605
+ beforeEach(() => {
2606
+ meeting.locusInfo.mediaShares = [{name: 'whiteboard', url: url1}];
2607
+ meeting.locusInfo.self = {url: url1};
2608
+ meeting.meetingRequest.changeMeetingFloor = sinon.stub().returns(Promise.resolve());
2609
+ });
2610
+ it('should stop the whiteboard share', async () => {
2611
+ const whiteboardShare = meeting.stopWhiteboardShare();
2612
+
2613
+ assert.exists(whiteboardShare.then);
2614
+ await whiteboardShare;
2615
+ assert.calledOnce(meeting.meetingRequest.changeMeetingFloor);
2616
+ });
2617
+ });
2618
+ });
2619
+ describe('share scenarios', () => {
2620
+ describe('setUpLocusMediaSharesListener', () => {
2621
+ beforeEach(() => {
2622
+ meeting.selfId = '9528d952-e4de-46cf-8157-fd4823b98377';
2623
+ sinon.stub(meeting, 'updateShare').returns(Promise.resolve());
2624
+ });
2625
+
2626
+ afterEach(() => {
2627
+ meeting.updateShare.restore();
2628
+ });
2629
+
2630
+ const USER_IDS = {
2631
+ ME: '9528d952-e4de-46cf-8157-fd4823b98377',
2632
+ REMOTE_A: '5be7e7b0-b304-48da-8083-83bd72b5300d',
2633
+ REMOTE_B: 'd4d102a1-17ce-4e17-9b08-bded3de467e4'
2634
+ };
2635
+
2636
+ const RESOURCE_URLS = {
2637
+ WHITEBOARD_A: 'https://board-a.wbx2.com/board/api/v1/channels/49cfb550-5517-11eb-a2af-1b9e4bc3da13',
2638
+ WHITEBOARD_B: 'https://board-a.wbx2.com/board/api/v1/channels/977a7330-54f4-11eb-b1ef-91f5eefc7bf3'
2639
+ };
2640
+
2641
+ const generateContent = (beneficiaryId = null, disposition = null) => ({beneficiaryId, disposition});
2642
+ const generateWhiteboard = (beneficiaryId = null, disposition = null, resourceUrl = null) => ({beneficiaryId, disposition, resourceUrl});
2643
+
2644
+ const generateData = (payload, isGranting, isContent, beneficiaryId, resourceUrl, isAccepting, otherBeneficiaryId) => {
2645
+ const newPayload = cloneDeep(payload);
2646
+
2647
+ newPayload.previous = cloneDeep(payload.current);
2648
+
2649
+ const eventTrigger = {
2650
+ share: [],
2651
+ member: {
2652
+ eventName: EVENT_TRIGGERS.MEMBERS_CONTENT_UPDATE,
2653
+ eventPayload: {
2654
+ activeSharingId: null,
2655
+ endedSharingId: null
2656
+ }
2657
+ }
2658
+ };
2659
+
2660
+ let shareStatus = null;
2661
+ const activeSharingId = {
2662
+ whiteboard: null,
2663
+ content: null
2664
+ };
2665
+
2666
+ if (isGranting) {
2667
+ if (isContent) {
2668
+ activeSharingId.content = beneficiaryId;
2669
+ newPayload.current.content = generateContent(beneficiaryId, FLOOR_ACTION.GRANTED);
2670
+
2671
+ if (isEqual(newPayload.current, newPayload.previous)) {
2672
+ eventTrigger.member = null;
2673
+ }
2674
+ else {
2675
+ if (newPayload.current.whiteboard.beneficiaryId) {
2676
+ if (newPayload.current.whiteboard.disposition === FLOOR_ACTION.GRANTED) {
2677
+ newPayload.current.whiteboard.disposition = FLOOR_ACTION.RELEASED;
2678
+ eventTrigger.share.push({
2679
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_WHITEBOARD,
2680
+ functionName: 'stopWhiteboardShare'
2681
+ });
2682
+ eventTrigger.member.eventPayload.endedSharingId = newPayload.current.whiteboard.beneficiaryId;
2683
+ }
2684
+ }
2685
+
2686
+ if (newPayload.previous.content.beneficiaryId) {
2687
+ if (newPayload.previous.content.beneficiaryId !== newPayload.current.content.beneficiaryId) {
2688
+ if (newPayload.previous.content.beneficiaryId === USER_IDS.ME) {
2689
+ eventTrigger.share.push({
2690
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
2691
+ functionName: 'stopFloorRequest'
2692
+ });
2693
+ }
2694
+ else if (newPayload.current.content.beneficiaryId === USER_IDS.ME) {
2695
+ eventTrigger.share.push({
2696
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_REMOTE,
2697
+ functionName: 'remoteShare'
2698
+ });
2699
+ }
2700
+ eventTrigger.member.eventPayload.endedSharingId = newPayload.previous.content.beneficiaryId;
2701
+ }
2702
+ }
2703
+
2704
+ if (isAccepting) {
2705
+ eventTrigger.share.push({
2706
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_WHITEBOARD,
2707
+ functionName: 'stopWhiteboardShare'
2708
+ });
2709
+ }
2710
+
2711
+ if (beneficiaryId === USER_IDS.ME) {
2712
+ eventTrigger.share.push({
2713
+ eventName: EVENT_TRIGGERS.MEETING_STARTED_SHARING_LOCAL,
2714
+ functionName: 'share'
2715
+ });
2716
+ }
2717
+ else {
2718
+ eventTrigger.share.push({
2719
+ eventName: EVENT_TRIGGERS.MEETING_STARTED_SHARING_REMOTE,
2720
+ functionName: 'remoteShare',
2721
+ eventPayload: {memberId: beneficiaryId}
2722
+ });
2723
+ }
2724
+ }
2725
+
2726
+ if (beneficiaryId === USER_IDS.ME) {
2727
+ shareStatus = SHARE_STATUS.LOCAL_SHARE_ACTIVE;
2728
+ }
2729
+ else {
2730
+ shareStatus = SHARE_STATUS.REMOTE_SHARE_ACTIVE;
2731
+ }
2732
+ }
2733
+ else {
2734
+ newPayload.current.whiteboard = generateWhiteboard(beneficiaryId, FLOOR_ACTION.GRANTED, resourceUrl);
2735
+
2736
+ if (newPayload.current.content.beneficiaryId) {
2737
+ if (newPayload.current.content.disposition === FLOOR_ACTION.GRANTED) {
2738
+ newPayload.current.content.disposition = FLOOR_ACTION.RELEASED;
2739
+ if (newPayload.current.content.beneficiaryId === USER_IDS.ME) {
2740
+ eventTrigger.share.push({
2741
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
2742
+ functionName: 'stopFloorRequest'
2743
+ });
2744
+ }
2745
+ else {
2746
+ eventTrigger.share.push({
2747
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_REMOTE,
2748
+ functionName: 'remoteShare'
2749
+ });
2750
+ }
2751
+
2752
+ eventTrigger.member.eventPayload.endedSharingId = newPayload.current.content.beneficiaryId;
2753
+ }
2754
+ }
2755
+
2756
+ if (newPayload.previous.content.beneficiaryId) {
2757
+ if (newPayload.previous.content.beneficiaryId !== newPayload.current.content.beneficiaryId) {
2758
+ if (newPayload.previous.content.beneficiaryId === USER_IDS.ME) {
2759
+ eventTrigger.share.push({
2760
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
2761
+ functionName: 'stopFloorRequest'
2762
+ });
2763
+ }
2764
+ else if (newPayload.current.content.beneficiaryId === USER_IDS.ME) {
2765
+ eventTrigger.share.push({
2766
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_REMOTE,
2767
+ functionName: 'remoteShare'
2768
+ });
2769
+ }
2770
+ eventTrigger.member.eventPayload.endedSharingId = newPayload.previous.content.beneficiaryId;
2771
+ }
2772
+ }
2773
+
2774
+ if (newPayload.previous.whiteboard.beneficiaryId) {
2775
+ if (newPayload.previous.whiteboard.beneficiaryId !== newPayload.current.whiteboard.beneficiaryId) {
2776
+ eventTrigger.member.eventPayload.endedSharingId = newPayload.previous.whiteboard.beneficiaryId;
2777
+ }
2778
+ }
2779
+
2780
+ activeSharingId.whiteboard = beneficiaryId;
2781
+
2782
+ eventTrigger.share.push({
2783
+ eventName: EVENT_TRIGGERS.MEETING_STARTED_SHARING_WHITEBOARD,
2784
+ functionName: 'startWhiteboardShare',
2785
+ eventPayload: {resourceUrl, memberId: beneficiaryId}
2786
+ });
2787
+
2788
+ shareStatus = SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE;
2789
+ }
2790
+
2791
+ if (eventTrigger.member) {
2792
+ eventTrigger.member.eventPayload.activeSharingId = beneficiaryId;
2793
+ }
2794
+ }
2795
+ else {
2796
+ eventTrigger.member.eventPayload.endedSharingId = beneficiaryId;
2797
+
2798
+ if (isContent) {
2799
+ newPayload.current.content.disposition = FLOOR_ACTION.RELEASED;
2800
+
2801
+ if (beneficiaryId === USER_IDS.ME) {
2802
+ eventTrigger.share.push({
2803
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
2804
+ functionName: 'stopFloorRequest'
2805
+ });
2806
+ }
2807
+ else {
2808
+ eventTrigger.share.push({
2809
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_REMOTE,
2810
+ functionName: 'remoteShare'
2811
+ });
2812
+ }
2813
+
2814
+ shareStatus = SHARE_STATUS.NO_SHARE;
2815
+ }
2816
+ else {
2817
+ newPayload.current.whiteboard.disposition = FLOOR_ACTION.RELEASED;
2818
+
2819
+ if (isAccepting) {
2820
+ newPayload.current.content.disposition = FLOOR_ACTION.ACCEPTED;
2821
+ newPayload.current.content.beneficiaryId = otherBeneficiaryId;
2822
+
2823
+ eventTrigger.share.push({
2824
+ eventName: EVENT_TRIGGERS.MEETING_STARTED_SHARING_WHITEBOARD,
2825
+ functionName: 'startWhiteboardShare',
2826
+ eventPayload: {resourceUrl, memberId: beneficiaryId}
2827
+ });
2828
+
2829
+ shareStatus = SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE;
2830
+ }
2831
+ else {
2832
+ eventTrigger.share.push({
2833
+ eventName: EVENT_TRIGGERS.MEETING_STOPPED_SHARING_WHITEBOARD,
2834
+ functionName: 'stopWhiteboardShare'
2835
+ });
2836
+
2837
+ shareStatus = SHARE_STATUS.NO_SHARE;
2838
+ }
2839
+ }
2840
+ }
2841
+
2842
+ return {
2843
+ payload: newPayload, eventTrigger, shareStatus, activeSharingId
2844
+ };
2845
+ };
2846
+
2847
+ const blankPayload = {
2848
+ previous: {
2849
+ content: generateContent(),
2850
+ whiteboard: generateWhiteboard()
2851
+ },
2852
+ current: {
2853
+ content: generateContent(),
2854
+ whiteboard: generateWhiteboard()
2855
+ }
2856
+ };
2857
+
2858
+
2859
+ const payloadTestHelper = (data) => {
2860
+ assert.equal(meeting.shareStatus, SHARE_STATUS.NO_SHARE);
2861
+
2862
+ // Called once --> members:update (ignore)
2863
+ let callCounter = 1;
2864
+
2865
+ data.forEach((d, index) => {
2866
+ meeting.locusInfo.emit({function: 'test', file: 'test'}, EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES, d.payload);
2867
+
2868
+ assert.equal(meeting.shareStatus, data[index].shareStatus);
2869
+
2870
+ callCounter += data[index].eventTrigger.share.length + (data[index].eventTrigger.member ? 1 : 0);
2871
+
2872
+ assert.callCount(TriggerProxy.trigger, callCounter);
2873
+
2874
+ assert.equal(meeting.members.mediaShareWhiteboardId, data[index].activeSharingId.whiteboard);
2875
+ assert.equal(meeting.members.mediaShareContentId, data[index].activeSharingId.content);
2876
+ });
2877
+
2878
+ assert.callCount(TriggerProxy.trigger, callCounter);
2879
+
2880
+ // Start with 1 to ignore members:update trigger
2881
+
2882
+
2883
+ let i = 1;
2884
+ let offset = 2;
2885
+
2886
+ while (i < callCounter) {
2887
+ const index = Math.floor(i / offset);
2888
+
2889
+ const {share, member} = data[index].eventTrigger;
2890
+
2891
+ for (let idx = 0; idx < share.length; idx += 1) {
2892
+ const shareCallArgs = TriggerProxy.trigger.getCall(i + idx).args;
2893
+ const {functionName, eventName, eventPayload} = share[idx];
2894
+ const fileName = functionName === 'remoteShare' ? 'meetings/index' : 'meeting/index';
2895
+
2896
+ assert.deepEqual(shareCallArgs[1], {
2897
+ file: fileName,
2898
+ function: functionName
2899
+ });
2900
+
2901
+
2902
+ assert.equal(shareCallArgs[2], eventName);
2903
+
2904
+ if (functionName === 'startWhiteboardShare') {
2905
+ assert.deepEqual(shareCallArgs[3], eventPayload);
2906
+ }
2907
+
2908
+ if (functionName === 'remoteShare' && eventName === EVENT_TRIGGERS.MEETING_STARTED_SHARING_REMOTE) {
2909
+ assert.deepEqual(shareCallArgs[3], eventPayload);
2910
+ }
2911
+ }
2912
+
2913
+ // Check Trigger --> members:content:update
2914
+ if (member) {
2915
+ const memberCallArgs = TriggerProxy.trigger.getCall(i + share.length).args;
2916
+
2917
+ assert.deepEqual(memberCallArgs[1], {
2918
+ file: 'members',
2919
+ function: 'locusMediaSharesUpdate'
2920
+ });
2921
+ assert.equal(memberCallArgs[2], member.eventName);
2922
+
2923
+ // Check payload --> {activeSharingId, endedSharingId}
2924
+ assert.deepEqual(memberCallArgs[3], member.eventPayload);
2925
+
2926
+ i += 1;
2927
+ }
2928
+
2929
+ i += share.length;
2930
+
2931
+ if (share.length + 1 > offset) {
2932
+ offset = (offset + share.length + 1) / 2;
2933
+ }
2934
+ else if (share.length + 1 < offset) {
2935
+ offset = (share.length + 1) + 0.5;
2936
+ }
2937
+ }
2938
+ };
2939
+
2940
+ it('should have #setUpLocusMediaSharesListener', () => {
2941
+ assert.exists(meeting.setUpLocusMediaSharesListener);
2942
+ });
2943
+
2944
+ describe('Whiteboard A --> Whiteboard B', () => {
2945
+ it('Scenario #1: you share both whiteboards', () => {
2946
+ const data1 = generateData(blankPayload, true, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_A);
2947
+ const data2 = generateData(data1.payload, true, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_B);
2948
+ const data3 = generateData(data2.payload, false, false, USER_IDS.ME);
2949
+
2950
+ payloadTestHelper([data1, data2, data3]);
2951
+ });
2952
+
2953
+ it('Scenario #2: you share whiteboard A and remote person A shares whiteboard B', () => {
2954
+ const data1 = generateData(blankPayload, true, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_A);
2955
+ const data2 = generateData(data1.payload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_B);
2956
+ const data3 = generateData(data2.payload, false, false, USER_IDS.REMOTE_A);
2957
+
2958
+ payloadTestHelper([data1, data2, data3]);
2959
+ });
2960
+
2961
+ it('Scenario #3: remote person A shares whiteboard A and you share whiteboard B', () => {
2962
+ const data1 = generateData(blankPayload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A);
2963
+ const data2 = generateData(data1.payload, true, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_B);
2964
+ const data3 = generateData(data2.payload, false, false, USER_IDS.ME);
2965
+
2966
+ payloadTestHelper([data1, data2, data3]);
2967
+ });
2968
+
2969
+ it('Scenario #4: remote person A shares both whiteboards', () => {
2970
+ const data1 = generateData(blankPayload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A);
2971
+ const data2 = generateData(data1.payload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_B);
2972
+ const data3 = generateData(data2.payload, false, false, USER_IDS.REMOTE_A);
2973
+
2974
+ payloadTestHelper([data1, data2, data3]);
2975
+ });
2976
+
2977
+ it('Scenario #5: remote person A shares whiteboard A and remote person B shares whiteboard B', () => {
2978
+ const data1 = generateData(blankPayload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A);
2979
+ const data2 = generateData(data1.payload, true, false, USER_IDS.REMOTE_B, RESOURCE_URLS.WHITEBOARD_B);
2980
+ const data3 = generateData(data2.payload, false, false, USER_IDS.REMOTE_B);
2981
+
2982
+ payloadTestHelper([data1, data2, data3]);
2983
+ });
2984
+ });
2985
+
2986
+ describe('Whiteboard A --> Desktop', () => {
2987
+ it('Scenario #1: you share whiteboard and then share desktop', () => {
2988
+ const data1 = generateData(blankPayload, true, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_A);
2989
+ const data2 = generateData(data1.payload, false, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_A, true, USER_IDS.ME);
2990
+ const data3 = generateData(data2.payload, true, true, USER_IDS.ME, undefined, true, USER_IDS.ME);
2991
+ const data4 = generateData(data3.payload, false, true, USER_IDS.ME);
2992
+
2993
+ payloadTestHelper([data1, data2, data3, data4]);
2994
+ });
2995
+
2996
+ it('Scenario #2: you share whiteboard A and remote person A shares desktop', () => {
2997
+ const data1 = generateData(blankPayload, true, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_A);
2998
+ const data2 = generateData(data1.payload, false, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_A, true, USER_IDS.REMOTE_A);
2999
+ const data3 = generateData(data2.payload, true, true, USER_IDS.REMOTE_A, undefined, true, USER_IDS.ME);
3000
+ const data4 = generateData(data3.payload, false, true, USER_IDS.REMOTE_A);
3001
+
3002
+ payloadTestHelper([data1, data2, data3, data4]);
3003
+ });
3004
+
3005
+ it('Scenario #3: remote person A shares whiteboard and you share desktop', () => {
3006
+ const data1 = generateData(blankPayload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A);
3007
+ const data2 = generateData(data1.payload, false, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A, true, USER_IDS.ME);
3008
+ const data3 = generateData(data2.payload, true, true, USER_IDS.ME, undefined, true, USER_IDS.REMOTE_A);
3009
+ const data4 = generateData(data3.payload, false, true, USER_IDS.ME);
3010
+
3011
+ payloadTestHelper([data1, data2, data3, data4]);
3012
+ });
3013
+
3014
+ it('Scenario #4: remote person A shares whiteboard and then shares desktop', () => {
3015
+ const data1 = generateData(blankPayload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A);
3016
+ const data2 = generateData(data1.payload, false, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A, true, USER_IDS.REMOTE_A);
3017
+ const data3 = generateData(data2.payload, true, true, USER_IDS.REMOTE_A, undefined, true, USER_IDS.REMOTE_A);
3018
+ const data4 = generateData(data3.payload, false, true, USER_IDS.REMOTE_A);
3019
+
3020
+ payloadTestHelper([data1, data2, data3, data4]);
3021
+ });
3022
+
3023
+ it('Scenario #5: remote person A shares whiteboard and remote person B shares desktop', () => {
3024
+ const data1 = generateData(blankPayload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A);
3025
+ const data2 = generateData(data1.payload, false, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A, true, USER_IDS.REMOTE_B);
3026
+ const data3 = generateData(data2.payload, true, true, USER_IDS.REMOTE_B, undefined, true, USER_IDS.REMOTE_A);
3027
+ const data4 = generateData(data3.payload, false, true, USER_IDS.REMOTE_B);
3028
+
3029
+ payloadTestHelper([data1, data2, data3, data4]);
3030
+ });
3031
+ });
3032
+
3033
+ describe('Desktop --> Whiteboard A', () => {
3034
+ it('Scenario #1: you share desktop and then share whiteboard', () => {
3035
+ const data1 = generateData(blankPayload, true, true, USER_IDS.ME);
3036
+ const data2 = generateData(data1.payload, true, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_A);
3037
+ const data3 = generateData(data2.payload, false, false, USER_IDS.ME);
3038
+
3039
+ payloadTestHelper([data1, data2, data3]);
3040
+ });
3041
+
3042
+ it('Scenario #2: you share desktop and remote person A shares whiteboard', () => {
3043
+ const data1 = generateData(blankPayload, true, true, USER_IDS.ME);
3044
+ const data2 = generateData(data1.payload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A);
3045
+ const data3 = generateData(data2.payload, false, false, USER_IDS.REMOTE_A);
3046
+
3047
+ payloadTestHelper([data1, data2, data3]);
3048
+ });
3049
+
3050
+ it('Scenario #3: remote person A shares desktop and you share whiteboard', () => {
3051
+ const data1 = generateData(blankPayload, true, true, USER_IDS.REMOTE_A);
3052
+ const data2 = generateData(data1.payload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A);
3053
+ const data3 = generateData(data2.payload, false, false, USER_IDS.REMOTE_A);
3054
+
3055
+ payloadTestHelper([data1, data2, data3]);
3056
+ });
3057
+
3058
+ it('Scenario #4: remote person A shares desktop and then shares whiteboard', () => {
3059
+ const data1 = generateData(blankPayload, true, true, USER_IDS.REMOTE_A);
3060
+ const data2 = generateData(data1.payload, true, false, USER_IDS.ME, RESOURCE_URLS.WHITEBOARD_A);
3061
+ const data3 = generateData(data2.payload, false, false, USER_IDS.ME);
3062
+
3063
+ payloadTestHelper([data1, data2, data3]);
3064
+ });
3065
+
3066
+ it('Scenario #5: remote person A shares desktop and remote person B shares whiteboard', () => {
3067
+ const data1 = generateData(blankPayload, true, true, USER_IDS.REMOTE_A);
3068
+ const data2 = generateData(data1.payload, true, false, USER_IDS.REMOTE_A, RESOURCE_URLS.WHITEBOARD_A);
3069
+ const data3 = generateData(data2.payload, false, false, USER_IDS.REMOTE_A);
3070
+
3071
+ payloadTestHelper([data1, data2, data3]);
3072
+ });
3073
+ });
3074
+
3075
+ describe('Desktop A --> Desktop B', () => {
3076
+ it('Scenario #1: you share desktop A and then share desktop B', () => {
3077
+ const data1 = generateData(blankPayload, true, true, USER_IDS.ME);
3078
+ const data2 = generateData(data1.payload, false, true, USER_IDS.ME);
3079
+ const data3 = generateData(data2.payload, true, true, USER_IDS.ME);
3080
+ const data4 = generateData(data3.payload, false, true, USER_IDS.ME);
3081
+
3082
+ payloadTestHelper([data1, data2, data3, data4]);
3083
+ });
3084
+
3085
+ it('Scenario #2: you share desktop A and remote person A shares desktop B', () => {
3086
+ const data1 = generateData(blankPayload, true, true, USER_IDS.ME);
3087
+ const data2 = generateData(data1.payload, true, true, USER_IDS.REMOTE_A);
3088
+ const data3 = generateData(data2.payload, false, true, USER_IDS.REMOTE_A);
3089
+
3090
+ payloadTestHelper([data1, data2, data3]);
3091
+ });
3092
+
3093
+ it('Scenario #3: remote person A shares desktop A and you share desktop B', () => {
3094
+ const data1 = generateData(blankPayload, true, true, USER_IDS.REMOTE_A);
3095
+ const data2 = generateData(data1.payload, true, true, USER_IDS.ME);
3096
+ const data3 = generateData(data2.payload, false, true, USER_IDS.ME);
3097
+
3098
+ payloadTestHelper([data1, data2, data3]);
3099
+ });
3100
+
3101
+ it('Scenario #4: remote person A shares desktop A and then shares desktop B', () => {
3102
+ const data1 = generateData(blankPayload, true, true, USER_IDS.REMOTE_A);
3103
+ const data2 = generateData(data1.payload, true, true, USER_IDS.REMOTE_A);
3104
+ const data3 = generateData(data2.payload, false, true, USER_IDS.REMOTE_A);
3105
+
3106
+ payloadTestHelper([data1, data2, data3]);
3107
+ });
3108
+
3109
+ it('Scenario #5: remote person A shares desktop A and remote person B shares desktop B', () => {
3110
+ const data1 = generateData(blankPayload, true, true, USER_IDS.REMOTE_A);
3111
+ const data2 = generateData(data1.payload, true, true, USER_IDS.REMOTE_B);
3112
+ const data3 = generateData(data2.payload, false, true, USER_IDS.REMOTE_B);
3113
+
3114
+ payloadTestHelper([data1, data2, data3]);
3115
+ });
3116
+ });
3117
+ });
3118
+ });
2574
3119
  });
2575
3120
  });
2576
3121
  });
@@ -12,6 +12,8 @@ require('@webex/internal-plugin-user');
12
12
  require('@webex/internal-plugin-device');
13
13
  require('@webex/internal-plugin-conversation');
14
14
  require('@webex/internal-plugin-support');
15
+ require('@webex/plugin-people');
16
+ require('@webex/plugin-rooms');
15
17
  require('@webex/plugin-meetings');
16
18
 
17
19
  const generateTestUsers = (options) => testUser.create({count: options.count})