@webex/plugin-meetings 1.145.0 → 1.147.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.
Files changed (46) hide show
  1. package/dist/config.js +1 -0
  2. package/dist/config.js.map +1 -1
  3. package/dist/constants.js +4 -2
  4. package/dist/constants.js.map +1 -1
  5. package/dist/media/index.js +16 -8
  6. package/dist/media/index.js.map +1 -1
  7. package/dist/meeting/index.js +19 -2
  8. package/dist/meeting/index.js.map +1 -1
  9. package/dist/meeting/util.js +2 -1
  10. package/dist/meeting/util.js.map +1 -1
  11. package/dist/members/index.js +63 -0
  12. package/dist/members/index.js.map +1 -1
  13. package/dist/members/request.js +41 -0
  14. package/dist/members/request.js.map +1 -1
  15. package/dist/members/util.js +59 -0
  16. package/dist/members/util.js.map +1 -1
  17. package/dist/metrics/index.js +0 -2
  18. package/dist/metrics/index.js.map +1 -1
  19. package/dist/peer-connection-manager/index.js +8 -7
  20. package/dist/peer-connection-manager/index.js.map +1 -1
  21. package/dist/reconnection-manager/index.js +2 -1
  22. package/dist/reconnection-manager/index.js.map +1 -1
  23. package/dist/roap/handler.js +7 -8
  24. package/dist/roap/handler.js.map +1 -1
  25. package/dist/roap/index.js +8 -3
  26. package/dist/roap/index.js.map +1 -1
  27. package/dist/roap/state.js +2 -0
  28. package/dist/roap/state.js.map +1 -1
  29. package/package.json +5 -5
  30. package/src/config.js +1 -0
  31. package/src/constants.js +1 -0
  32. package/src/media/index.js +58 -10
  33. package/src/meeting/index.js +17 -2
  34. package/src/meeting/util.js +2 -1
  35. package/src/members/index.js +56 -0
  36. package/src/members/request.js +35 -0
  37. package/src/members/util.js +58 -1
  38. package/src/metrics/index.js +0 -2
  39. package/src/peer-connection-manager/index.js +13 -9
  40. package/src/reconnection-manager/index.js +2 -1
  41. package/src/roap/handler.js +7 -8
  42. package/src/roap/index.js +10 -3
  43. package/src/roap/state.js +2 -0
  44. package/test/unit/spec/meeting/index.js +16 -0
  45. package/test/unit/spec/members/index.js +192 -0
  46. package/test/unit/spec/members/request.js +101 -0
@@ -0,0 +1,192 @@
1
+ /*!
2
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
+ */
4
+
5
+ import sinon from 'sinon';
6
+ import uuid from 'uuid';
7
+ import chai from 'chai';
8
+ import chaiAsPromised from 'chai-as-promised';
9
+ import {Credentials} from '@webex/webex-core';
10
+ import Support from '@webex/internal-plugin-support';
11
+ import MockWebex from '@webex/test-helper-mock-webex';
12
+ import Meetings from '@webex/plugin-meetings';
13
+ import Members from '@webex/plugin-meetings/src/members';
14
+ import MembersUtil from '@webex/plugin-meetings/src/members/util';
15
+
16
+ const {assert} = chai;
17
+
18
+ chai.use(chaiAsPromised);
19
+ sinon.assert.expose(chai.assert, {prefix: ''});
20
+
21
+
22
+ describe('plugin-meetings', () => {
23
+ let webex;
24
+ let url1;
25
+ const fakeMembersCollection = {
26
+ test1: {
27
+ namespace: 'Meetings',
28
+ participant: {
29
+ state: 'JOINED',
30
+ type: 'USER',
31
+ person: {
32
+ id: '6eb08f8b-bf69-3251-a126-b161bead2d21',
33
+ phoneNumber: '+18578675309',
34
+ isExternal: true,
35
+ primaryDisplayString: '+18578675309'
36
+ },
37
+ devices: [
38
+ {
39
+ url: 'https://fakeURL.com',
40
+ deviceType: 'SIP',
41
+ state: 'JOINED',
42
+ intents: [
43
+ null
44
+ ],
45
+ correlationId: '1234',
46
+ provisionalUrl: 'dialout:///fake',
47
+ isSparkPstn: true
48
+ },
49
+ {
50
+ url: 'dialout:///fakeagain',
51
+ deviceType: 'PROVISIONAL',
52
+ state: 'JOINED',
53
+ intents: [
54
+ null
55
+ ],
56
+ correlationId: '4321',
57
+ isVideoCallback: false,
58
+ clientUrl: 'https://fakeURL',
59
+ provisionalType: 'DIAL_OUT_ONLY',
60
+ dialingStatus: 'SUCCESS'
61
+ }
62
+ ],
63
+ status: {
64
+ audioStatus: 'SENDRECV',
65
+ videoStatus: 'INACTIVE'
66
+ },
67
+ id: 'abc-123-abc-123',
68
+ guest: true,
69
+ resourceGuest: false,
70
+ moderator: false,
71
+ panelist: false,
72
+ moveToLobbyNotAllowed: true,
73
+ deviceUrl: 'https://fakeDeviceurl'
74
+ },
75
+ id: 'abc-123-abc-123',
76
+ status: 'IN_MEETING',
77
+ type: 'MEETING',
78
+ isModerator: false
79
+ }
80
+ };
81
+
82
+
83
+ describe('members', () => {
84
+ const sandbox = sinon.createSandbox();
85
+ let createMembers;
86
+
87
+ beforeEach(() => {
88
+ webex = new MockWebex({
89
+ children: {
90
+ meetings: Meetings,
91
+ credentials: Credentials,
92
+ support: Support
93
+ },
94
+ config: {
95
+ credentials: {
96
+ client_id: 'mock-client-id'
97
+ },
98
+ meetings: {
99
+ reconnection: {
100
+ enabled: false
101
+ },
102
+ mediaSettings: {},
103
+ metrics: {},
104
+ stats: {}
105
+ }
106
+ }
107
+ });
108
+
109
+ url1 = `https://example.com/${uuid.v4()}`;
110
+
111
+ createMembers = (options) => new Members({locusUrl: options.url}, {parent: webex});
112
+ });
113
+
114
+ afterEach(() => {
115
+ sandbox.restore();
116
+ });
117
+
118
+ describe('#addMembers', () => {
119
+ it('should invoke isInvalidInvitee and generateAddMemberOptions from MembersUtil when addMember is called with valid params', async () => {
120
+ sandbox.spy(MembersUtil, 'isInvalidInvitee');
121
+ sandbox.spy(MembersUtil, 'generateAddMemberOptions');
122
+
123
+ const members = createMembers({url: url1});
124
+
125
+ await members.addMember({phoneNumber: '+18578675309'});
126
+ assert.calledOnce(MembersUtil.isInvalidInvitee);
127
+ assert.calledOnce(MembersUtil.generateAddMemberOptions);
128
+ });
129
+
130
+ it('should throw a rejection if there is no locus url', async () => {
131
+ const members = createMembers({url: false});
132
+
133
+ assert.isRejected(members.addMember({email: 'test@cisco.com'}));
134
+ });
135
+ });
136
+
137
+ describe('#sendDialPadKey', () => {
138
+ it('should throw a rejection when calling sendDialPadKey with no tones', async () => {
139
+ const members = createMembers({url: url1});
140
+
141
+ assert.isRejected(members.sendDialPadKey());
142
+ });
143
+
144
+ it('should throw a rejection when calling sendDialPadKey with no member is found', async () => {
145
+ const members = createMembers({url: url1});
146
+
147
+ assert.isRejected(members.sendDialPadKey('1', '1234'));
148
+ });
149
+
150
+ it('should call genderateSendDTMFOptions with proper options on Members util if we the member is valid', async () => {
151
+ sandbox.spy(MembersUtil, 'genderateSendDTMFOptions');
152
+ const members = createMembers({url: url1});
153
+
154
+ members.membersCollection.setAll(fakeMembersCollection);
155
+ await members.sendDialPadKey('1', 'test1');
156
+ assert.calledWith(MembersUtil.genderateSendDTMFOptions, 'https://fakeURL.com', '1', 'test1', url1);
157
+ });
158
+
159
+ it('should call the sendDialPadKey method on membersRequest if the member is valid', async () => {
160
+ const members = createMembers({url: url1});
161
+
162
+ const {membersRequest} = members;
163
+
164
+ assert.exists(membersRequest);
165
+ const sendDialPadKeyspy = sandbox.spy(membersRequest, 'sendDialPadKey');
166
+
167
+ members.membersCollection.setAll(fakeMembersCollection);
168
+ await members.sendDialPadKey('1', 'test1');
169
+ assert.calledOnce(sendDialPadKeyspy);
170
+ });
171
+ });
172
+
173
+ describe('#cancelPhoneInvite', () => {
174
+ it('should invoke isInvalidInvitee and generateAddMemberOptions from MembersUtil when addMember is called with valid params', async () => {
175
+ sandbox.spy(MembersUtil, 'isInvalidInvitee');
176
+ sandbox.spy(MembersUtil, 'cancelPhoneInviteOptions');
177
+
178
+ const members = createMembers({url: url1});
179
+
180
+ await members.cancelPhoneInvite({phoneNumber: '+18578675309'});
181
+ assert.calledOnce(MembersUtil.isInvalidInvitee);
182
+ assert.calledOnce(MembersUtil.cancelPhoneInviteOptions);
183
+ });
184
+
185
+ it('should throw a rejection if there is no locus url', async () => {
186
+ const members = createMembers({url: false});
187
+
188
+ assert.isRejected(members.cancelPhoneInvite({phoneNumber: '+18578675309'}));
189
+ });
190
+ });
191
+ });
192
+ });
@@ -0,0 +1,101 @@
1
+ import sinon from 'sinon';
2
+ import chai from 'chai';
3
+ import uuid from 'uuid';
4
+ import chaiAsPromised from 'chai-as-promised';
5
+ import MockWebex from '@webex/test-helper-mock-webex';
6
+ import Meetings from '@webex/plugin-meetings';
7
+ import MembersRequest from '@webex/plugin-meetings/src/members/request';
8
+
9
+ const {assert} = chai;
10
+
11
+ chai.use(chaiAsPromised);
12
+ sinon.assert.expose(chai.assert, {prefix: ''});
13
+
14
+ describe('plugin-meetings', () => {
15
+ let membersRequest;
16
+ let url1;
17
+ let sandbox;
18
+
19
+ beforeEach(() => {
20
+ const webex = new MockWebex({
21
+ children: {
22
+ meetings: Meetings
23
+ }
24
+ });
25
+
26
+ sandbox = sinon.createSandbox();
27
+
28
+ url1 = `https://example.com/${uuid.v4()}`;
29
+
30
+ membersRequest = new MembersRequest({}, {
31
+ parent: webex
32
+ });
33
+ membersRequest.request = sinon.mock().returns(Promise.resolve({}));
34
+ });
35
+
36
+ afterEach(() => {
37
+ sandbox.restore();
38
+ });
39
+
40
+
41
+ describe('members request library', () => {
42
+ describe('#sendDialPadKey', () => {
43
+ it('sends a POST to the sendDtmf locus endpoint', async () => {
44
+ const locusUrl = url1;
45
+ const url = 'https://fakedeviceurl.com';
46
+ const tones = '1';
47
+ const memberId = 'test1';
48
+
49
+ await membersRequest.sendDialPadKey({
50
+ url,
51
+ tones,
52
+ memberId,
53
+ locusUrl
54
+ });
55
+ const requestParams = membersRequest.request.getCall(0).args[0];
56
+
57
+ assert.equal(requestParams.method, 'POST');
58
+ assert.equal(requestParams.uri, `${locusUrl}/participant/${memberId}/sendDtmf`);
59
+ assert.equal(requestParams.body.dtmf.tones, tones);
60
+ assert.equal(requestParams.body.device.url, url);
61
+ });
62
+ });
63
+
64
+ describe('#addMembers', () => {
65
+ it('sends a PUT to the locus endpoint', async () => {
66
+ const options = {
67
+ invitee: {
68
+ phoneNumber: '+18578675309'
69
+ },
70
+ locusUrl: url1
71
+ };
72
+
73
+ await membersRequest.addMembers(options);
74
+ const requestParams = membersRequest.request.getCall(0).args[0];
75
+
76
+ assert.equal(requestParams.method, 'PUT');
77
+ assert.equal(requestParams.uri, url1);
78
+ assert.equal(requestParams.body.invitees[0].address, '+18578675309');
79
+ });
80
+ });
81
+
82
+ describe('#cancelPhoneInvite', () => {
83
+ it('sends a PUT to the locus endpoint', async () => {
84
+ const options = {
85
+ invitee: {
86
+ phoneNumber: '+18578675309'
87
+ },
88
+ locusUrl: url1
89
+ };
90
+
91
+ await membersRequest.cancelPhoneInvite(options);
92
+ const requestParams = membersRequest.request.getCall(0).args[0];
93
+
94
+ assert.equal(requestParams.method, 'PUT');
95
+ assert.equal(requestParams.uri, url1);
96
+ assert.equal(requestParams.body.invitees[0].address, '+18578675309');
97
+ assert.equal(requestParams.body.actionType, 'REMOVE');
98
+ });
99
+ });
100
+ });
101
+ });