@webex/plugin-meetings 3.0.0-beta.58 → 3.0.0-beta.59

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 (50) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +2 -0
  4. package/dist/constants.js.map +1 -1
  5. package/dist/meeting/in-meeting-actions.js +6 -0
  6. package/dist/meeting/in-meeting-actions.js.map +1 -1
  7. package/dist/meeting/index.js +1 -0
  8. package/dist/meeting/index.js.map +1 -1
  9. package/dist/meeting/util.js +3 -0
  10. package/dist/meeting/util.js.map +1 -1
  11. package/dist/member/index.js +23 -0
  12. package/dist/member/index.js.map +1 -1
  13. package/dist/member/types.js +15 -0
  14. package/dist/member/types.js.map +1 -0
  15. package/dist/member/util.js +61 -2
  16. package/dist/member/util.js.map +1 -1
  17. package/dist/members/index.js +21 -0
  18. package/dist/members/index.js.map +1 -1
  19. package/dist/members/request.js +19 -0
  20. package/dist/members/request.js.map +1 -1
  21. package/dist/members/types.js +15 -0
  22. package/dist/members/types.js.map +1 -0
  23. package/dist/members/util.js +38 -0
  24. package/dist/members/util.js.map +1 -1
  25. package/dist/types/constants.d.ts +2 -0
  26. package/dist/types/meeting/in-meeting-actions.d.ts +6 -0
  27. package/dist/types/member/index.d.ts +10 -0
  28. package/dist/types/member/types.d.ts +21 -0
  29. package/dist/types/members/index.d.ts +10 -0
  30. package/dist/types/members/request.d.ts +8 -0
  31. package/dist/types/members/types.d.ts +24 -0
  32. package/package.json +18 -18
  33. package/src/constants.ts +2 -0
  34. package/src/meeting/in-meeting-actions.ts +12 -0
  35. package/src/meeting/index.ts +3 -0
  36. package/src/meeting/util.ts +3 -0
  37. package/src/member/index.ts +22 -0
  38. package/src/member/types.ts +24 -0
  39. package/src/member/util.ts +53 -0
  40. package/src/members/index.ts +27 -0
  41. package/src/members/request.ts +20 -0
  42. package/src/members/types.ts +28 -0
  43. package/src/members/util.ts +39 -1
  44. package/test/unit/spec/meeting/in-meeting-actions.ts +6 -0
  45. package/test/unit/spec/meeting/utils.js +1 -0
  46. package/test/unit/spec/member/index.js +24 -0
  47. package/test/unit/spec/member/util.js +336 -33
  48. package/test/unit/spec/members/index.js +77 -0
  49. package/test/unit/spec/members/request.js +21 -0
  50. package/test/unit/spec/members/utils.js +28 -0
@@ -1,53 +1,356 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
2
  import MemberUtil from '@webex/plugin-meetings/src/member/util';
3
+ import { ServerRoles } from '../../../../src/member/types';
3
4
 
4
- describe('isHandRaised', () => {
5
- it('throws error when there is no participant', () => {
6
- assert.throws(() => {
7
- MemberUtil.isHandRaised();
8
- }, 'Raise hand could not be processed, participant is undefined.');
5
+ describe('plugin-meetings', () => {
6
+ describe('isHandRaised', () => {
7
+ it('throws error when there is no participant', () => {
8
+ assert.throws(() => {
9
+ MemberUtil.isHandRaised();
10
+ }, 'Raise hand could not be processed, participant is undefined.');
11
+ });
12
+
13
+ it('returns false when controls is not there', () => {
14
+ const participant = {};
15
+
16
+ assert.isFalse(MemberUtil.isHandRaised(participant));
17
+ });
18
+
19
+ it('returns false when hand is not there in controls', () => {
20
+ const participant = {
21
+ controls: {},
22
+ };
23
+
24
+ assert.isFalse(MemberUtil.isHandRaised(participant));
25
+ });
26
+
27
+ it('returns true when hand raised is true', () => {
28
+ const participant = {
29
+ controls: {
30
+ hand: {
31
+ raised: true,
32
+ },
33
+ },
34
+ };
35
+
36
+ assert.isTrue(MemberUtil.isHandRaised(participant));
37
+ });
38
+
39
+ it('returns false when hand raised is false', () => {
40
+ const participant = {
41
+ controls: {
42
+ hand: {
43
+ raised: false,
44
+ },
45
+ },
46
+ };
47
+
48
+ assert.isFalse(MemberUtil.isHandRaised(participant));
49
+ });
9
50
  });
10
51
 
11
- it('returns false when controls is not there', () => {
12
- const participant = {};
52
+ describe('MemberUtil.extractControlRoles', () => {
53
+ it('happy path extract control roles', () => {
54
+ const participant = {
55
+ controls: {
56
+ role: {
57
+ roles: [
58
+ {type: 'PRESENTER', hasRole: true},
59
+ {type: 'COHOST', hasRole: true},
60
+ {type: 'MODERATOR', hasRole: true},
61
+ ]
62
+ }
63
+ }
64
+ }
13
65
 
14
- assert.isFalse(MemberUtil.isHandRaised(participant));
66
+ assert.deepEqual(MemberUtil.extractControlRoles(participant), {cohost: true, moderator: true, presenter: true});
67
+ });
15
68
  });
16
69
 
17
- it('returns false when hand is not there in controls', () => {
18
- const participant = {
19
- controls: {},
20
- };
70
+ describe('MemberUtil.getControlsRoles', () => {
71
+ it('getControlsRoles', () => {
72
+ const participant = {
73
+ controls: {
74
+ role: {
75
+ roles: [
76
+ {type: 'PRESENTER', hasRole: true},
77
+ ]
78
+ }
79
+ }
80
+ }
21
81
 
22
- assert.isFalse(MemberUtil.isHandRaised(participant));
82
+ assert.deepEqual(MemberUtil.getControlsRoles(participant), [{type: 'PRESENTER', hasRole: true}]);
83
+ });
23
84
  });
24
85
 
25
- it('returns true when hand raised is true', () => {
26
- const participant = {
27
- controls: {
28
- hand: {
29
- raised: true,
30
- },
31
- },
32
- };
86
+ describe('MemberUtil.hasRole', () => {
87
+ describe('PRESENTER', () => {
88
+ it('getControlsRoles PRESENTER true', () => {
89
+ const participant = {
90
+ controls: {
91
+ role: {
92
+ roles: [
93
+ {type: 'PRESENTER', hasRole: true},
94
+ ]
95
+ }
96
+ }
97
+ }
98
+
99
+ assert.isTrue(MemberUtil.hasRole(participant, ServerRoles.Presenter));
100
+ });
101
+
102
+ it('getControlsRoles PRESENTER false', () => {
103
+ const participant = {
104
+ controls: {
105
+ role: {
106
+ roles: [
107
+ {type: 'PRESENTER', hasRole: false},
108
+ ]
109
+ }
110
+ }
111
+ }
112
+
113
+ assert.isFalse(MemberUtil.hasRole(participant, ServerRoles.Presenter));
114
+ });
115
+
116
+ it('getControlsRoles PRESENTER undefined', () => {
117
+ const participant = {
118
+ controls: {
119
+ role: {
120
+ roles: [
121
+ {},
122
+ ]
123
+ }
124
+ }
125
+ }
126
+
127
+ assert.isFalse(MemberUtil.hasRole(participant, ServerRoles.Presenter));
128
+ });
129
+ })
130
+
131
+ describe('MODERATOR', () => {
132
+ it('getControlsRoles MODERATOR true', () => {
133
+ const participant = {
134
+ controls: {
135
+ role: {
136
+ roles: [
137
+ {type: 'MODERATOR', hasRole: true},
138
+ ]
139
+ }
140
+ }
141
+ }
142
+
143
+ assert.isTrue(MemberUtil.hasRole(participant, ServerRoles.Moderator));
144
+ });
33
145
 
34
- assert.isTrue(MemberUtil.isHandRaised(participant));
146
+ it('getControlsRoles MODERATOR false', () => {
147
+ const participant = {
148
+ controls: {
149
+ role: {
150
+ roles: [
151
+ {type: 'MODERATOR', hasRole: false},
152
+ ]
153
+ }
154
+ }
155
+ }
156
+
157
+ assert.isFalse(MemberUtil.hasRole(participant, ServerRoles.Moderator));
158
+ });
159
+
160
+ it('getControlsRoles MODERATOR undefined', () => {
161
+ const participant = {
162
+ controls: {
163
+ role: {
164
+ roles: [
165
+ {},
166
+ ]
167
+ }
168
+ }
169
+ }
170
+
171
+ assert.isFalse(MemberUtil.hasRole(participant, ServerRoles.Moderator));
172
+ });
173
+ })
174
+
175
+ describe('COHOST', () => {
176
+ it('getControlsRoles COHOST true', () => {
177
+ const participant = {
178
+ controls: {
179
+ role: {
180
+ roles: [
181
+ {type: 'COHOST', hasRole: true},
182
+ ]
183
+ }
184
+ }
185
+ }
186
+
187
+ assert.isTrue(MemberUtil.hasRole(participant, ServerRoles.Cohost));
188
+ });
189
+
190
+ it('getControlsRoles COHOST false', () => {
191
+ const participant = {
192
+ controls: {
193
+ role: {
194
+ roles: [
195
+ {type: 'COHOST', hasRole: false},
196
+ ]
197
+ }
198
+ }
199
+ }
200
+
201
+ assert.isFalse(MemberUtil.hasRole(participant, ServerRoles.Cohost));
202
+ });
203
+
204
+ it('getControlsRoles COHOST undefined', () => {
205
+ const participant = {
206
+ controls: {
207
+ role: {
208
+ roles: [
209
+ {},
210
+ ]
211
+ }
212
+ }
213
+ }
214
+
215
+ assert.isFalse(MemberUtil.hasRole(participant, ServerRoles.Cohost));
216
+ });
217
+ })
35
218
  });
36
219
 
37
- it('returns false when hand raised is false', () => {
38
- const participant = {
39
- controls: {
40
- hand: {
41
- raised: false,
42
- },
43
- },
44
- };
220
+ describe('MemberUtil.is<Role>', () => {
221
+ describe('PRESENTER', () => {
222
+ it('getControlsRoles PRESENTER true', () => {
223
+ const participant = {
224
+ controls: {
225
+ role: {
226
+ roles: [
227
+ {type: 'PRESENTER', hasRole: true},
228
+ ]
229
+ }
230
+ }
231
+ }
232
+
233
+ assert.isTrue(MemberUtil.hasPresenter(participant, ServerRoles.Presenter));
234
+ });
45
235
 
46
- assert.isFalse(MemberUtil.isHandRaised(participant));
236
+ it('getControlsRoles PRESENTER false', () => {
237
+ const participant = {
238
+ controls: {
239
+ role: {
240
+ roles: [
241
+ {type: 'PRESENTER', hasRole: false},
242
+ ]
243
+ }
244
+ }
245
+ }
246
+
247
+ assert.isFalse(MemberUtil.hasPresenter(participant));
248
+ });
249
+
250
+ it('getControlsRoles PRESENTER undefined', () => {
251
+ const participant = {
252
+ controls: {
253
+ role: {
254
+ roles: [
255
+ {},
256
+ ]
257
+ }
258
+ }
259
+ }
260
+
261
+ assert.isFalse(MemberUtil.hasPresenter(participant));
262
+ });
263
+ })
264
+
265
+ describe('MODERATOR', () => {
266
+ it('getControlsRoles MODERATOR true', () => {
267
+ const participant = {
268
+ controls: {
269
+ role: {
270
+ roles: [
271
+ {type: 'MODERATOR', hasRole: true},
272
+ ]
273
+ }
274
+ }
275
+ }
276
+
277
+ assert.isTrue(MemberUtil.hasModerator(participant));
278
+ });
279
+
280
+ it('getControlsRoles MODERATOR false', () => {
281
+ const participant = {
282
+ controls: {
283
+ role: {
284
+ roles: [
285
+ {type: 'MODERATOR', hasRole: false},
286
+ ]
287
+ }
288
+ }
289
+ }
290
+
291
+ assert.isFalse(MemberUtil.hasModerator(participant));
292
+ });
293
+
294
+ it('getControlsRoles MODERATOR undefined', () => {
295
+ const participant = {
296
+ controls: {
297
+ role: {
298
+ roles: [
299
+ {},
300
+ ]
301
+ }
302
+ }
303
+ }
304
+
305
+ assert.isFalse(MemberUtil.hasModerator(participant));
306
+ });
307
+ })
308
+
309
+ describe('COHOST', () => {
310
+ it('getControlsRoles COHOST true', () => {
311
+ const participant = {
312
+ controls: {
313
+ role: {
314
+ roles: [
315
+ {type: 'COHOST', hasRole: true},
316
+ ]
317
+ }
318
+ }
319
+ }
320
+
321
+ assert.isTrue(MemberUtil.hasCohost(participant));
322
+ });
323
+
324
+ it('getControlsRoles COHOST false', () => {
325
+ const participant = {
326
+ controls: {
327
+ role: {
328
+ roles: [
329
+ {type: 'COHOST', hasRole: false},
330
+ ]
331
+ }
332
+ }
333
+ }
334
+
335
+ assert.isFalse(MemberUtil.hasCohost(participant));
336
+ });
337
+
338
+ it('getControlsRoles COHOST undefined', () => {
339
+ const participant = {
340
+ controls: {
341
+ role: {
342
+ roles: [
343
+ {},
344
+ ]
345
+ }
346
+ }
347
+ }
348
+
349
+ assert.isFalse(MemberUtil.hasCohost(participant));
350
+ });
351
+ })
47
352
  });
48
- });
49
353
 
50
- describe('plugin-meetings', () => {
51
354
  describe('MemberUtil.isBreakoutsSupported', () => {
52
355
  it('throws error when there is no participant', () => {
53
356
  assert.throws(() => {
@@ -266,6 +266,83 @@ describe('plugin-meetings', () => {
266
266
  });
267
267
  });
268
268
 
269
+ describe('#assignRoles', () => {
270
+ const setup = (locusUrl) => {
271
+ const members = createMembers({url: locusUrl});
272
+
273
+ const spies = {
274
+ generateRoleAssignmentMemberOptions: sandbox.spy(
275
+ MembersUtil,
276
+ 'generateRoleAssignmentMemberOptions'
277
+ ),
278
+ assignRolesMember: sandbox.spy(members.membersRequest, 'assignRolesMember'),
279
+ };
280
+
281
+ return {members, spies};
282
+ };
283
+
284
+ const checkInvalid = async (resultPromise, expectedMessage, spies) => {
285
+ await assert.isRejected(resultPromise, ParameterError, expectedMessage);
286
+ assert.notCalled(spies.generateRoleAssignmentMemberOptions);
287
+ assert.notCalled(spies.assignRolesMember);
288
+ };
289
+
290
+ const checkValid = async (
291
+ resultPromise,
292
+ spies,
293
+ expectedMemberId,
294
+ expectedRoles,
295
+ expectedLocusUrl
296
+ ) => {
297
+ await assert.isFulfilled(resultPromise);
298
+ assert.calledOnceWithExactly(
299
+ spies.generateRoleAssignmentMemberOptions,
300
+ expectedMemberId,
301
+ expectedRoles,
302
+ expectedLocusUrl
303
+ );
304
+ assert.calledOnceWithExactly(spies.assignRolesMember, {
305
+ memberId: expectedMemberId,
306
+ roles: expectedRoles,
307
+ locusUrl: expectedLocusUrl,
308
+ });
309
+ assert.strictEqual(resultPromise, spies.assignRolesMember.getCall(0).returnValue);
310
+ };
311
+
312
+ it('should not make a request if there is no member id', async () => {
313
+ const {members, spies} = setup(url1);
314
+
315
+ const resultPromise = members.assignRoles();
316
+
317
+ await checkInvalid(
318
+ resultPromise,
319
+ 'The member id must be defined to assign the roles to a member.',
320
+ spies
321
+ );
322
+ });
323
+
324
+ it('should not make a request if there is no locus url', async () => {
325
+ const {members, spies} = setup();
326
+
327
+ const resultPromise = members.assignRoles(uuid.v4());
328
+
329
+ await checkInvalid(
330
+ resultPromise,
331
+ 'The associated locus url for this meetings members object must be defined.',
332
+ spies
333
+ );
334
+ });
335
+
336
+ it('should make the correct request when called with roles', async () => {
337
+ const memberId = uuid.v4();
338
+ const {members, spies} = setup(url1);
339
+
340
+ const resultPromise = members.assignRoles(memberId, [{type: 'PRESENTER', hasRole: true}, {type: 'MODERATOR', hasRole: false}, {type: 'COHOST', hasRole: true}]);
341
+
342
+ await checkValid(resultPromise, spies, memberId, [{type: 'PRESENTER', hasRole: true}, {type: 'MODERATOR', hasRole: false}, {type: 'COHOST', hasRole: true}], url1);
343
+ });
344
+ });
345
+
269
346
  describe('#raiseOrLowerHand', () => {
270
347
  const setup = (locusUrl) => {
271
348
  const members = createMembers({url: locusUrl});
@@ -103,6 +103,27 @@ describe('plugin-meetings', () => {
103
103
  });
104
104
  });
105
105
 
106
+ describe('#assignRolesMember', () => {
107
+ it('sends a PATCH to the locus endpoint', async () => {
108
+ const locusUrl = url1;
109
+ const memberId = 'test1';
110
+ const roles = [{type: 'PRESENTER', hasRole: true}, {type: 'MODERATOR', hasRole: false}, {type: 'COHOST', hasRole: true}];
111
+
112
+ const options = {
113
+ memberId,
114
+ locusUrl,
115
+ roles,
116
+ };
117
+
118
+ await membersRequest.assignRolesMember(options);
119
+ const requestParams = membersRequest.request.getCall(0).args[0];
120
+
121
+ assert.equal(requestParams.method, 'PATCH');
122
+ assert.equal(requestParams.uri, `${locusUrl}/participant/${memberId}/controls`);
123
+ assert.deepEqual(requestParams.body.role.roles, roles);
124
+ });
125
+ });
126
+
106
127
  describe('#raiseHand', () => {
107
128
  it('sends a PATCH to the locus endpoint', async () => {
108
129
  const locusUrl = url1;
@@ -12,6 +12,34 @@ sinon.assert.expose(chai.assert, {prefix: ''});
12
12
 
13
13
  describe('plugin-meetings', () => {
14
14
  describe('members utils library', () => {
15
+ describe('#generateRoleAssignmentMemberOptions', () => {
16
+ it('returns the correct options', () => {
17
+ const memberId = 'test';
18
+ const roles = [{type: 'PRESENTER', hasRole: true}, {type: 'MODERATOR', hasRole: true}, {type: 'COHOST', hasRole: true}]
19
+ const locusUrl = 'urlTest1';
20
+
21
+ assert.deepEqual(MembersUtil.generateRoleAssignmentMemberOptions(memberId, roles, locusUrl), {
22
+ memberId,
23
+ roles,
24
+ locusUrl,
25
+ });
26
+ });
27
+ });
28
+
29
+ describe('#getRoleAssignmentMemberRequestParams', () => {
30
+ it('returns the correct request params', () => {
31
+ const format = {locusUrl: 'locusUrl', memberId: 'test', roles: [{type: 'PRESENTER', hasRole: true}, {type: 'MODERATOR', hasRole: false}, {type: 'COHOST', hasRole: true}]};
32
+
33
+ assert.deepEqual(MembersUtil.getRoleAssignmentMemberRequestParams(format), {
34
+ method: 'PATCH',
35
+ uri: `locusUrl/${PARTICIPANT}/test/${CONTROLS}`,
36
+ body: {role: {
37
+ roles: [{type: 'PRESENTER', hasRole: true}, {type: 'MODERATOR', hasRole: false}, {type: 'COHOST', hasRole: true}]
38
+ }},
39
+ });
40
+ });
41
+ });
42
+
15
43
  describe('#generateRaiseHandMemberOptions', () => {
16
44
  it('returns the correct options', () => {
17
45
  const memberId = 'test';