@webex/plugin-memberships 3.0.0-beta.7 → 3.0.0-beta.71
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.
- package/README.md +3 -6
- package/dist/index.js +1 -8
- package/dist/index.js.map +1 -1
- package/dist/memberships.js +20 -67
- package/dist/memberships.js.map +1 -1
- package/package.json +12 -12
- package/src/memberships.js +100 -103
- package/test/integration/spec/memberships.js +360 -304
|
@@ -8,11 +8,7 @@ import '@webex/plugin-memberships';
|
|
|
8
8
|
import '@webex/plugin-people';
|
|
9
9
|
import '@webex/plugin-rooms';
|
|
10
10
|
import WebexCore from '@webex/webex-core';
|
|
11
|
-
import {
|
|
12
|
-
SDK_EVENT,
|
|
13
|
-
hydraTypes,
|
|
14
|
-
constructHydraId
|
|
15
|
-
} from '@webex/common';
|
|
11
|
+
import {SDK_EVENT, hydraTypes, constructHydraId} from '@webex/common';
|
|
16
12
|
import {assert} from '@webex/test-helper-chai';
|
|
17
13
|
import sinon from 'sinon';
|
|
18
14
|
import testUsers from '@webex/test-helper-test-users';
|
|
@@ -24,37 +20,39 @@ describe('plugin-memberships', function () {
|
|
|
24
20
|
|
|
25
21
|
let webex, user, actor;
|
|
26
22
|
|
|
27
|
-
before(() =>
|
|
28
|
-
.then(([u]) => {
|
|
23
|
+
before(() =>
|
|
24
|
+
testUsers.create({count: 1}).then(([u]) => {
|
|
29
25
|
user = u;
|
|
30
26
|
webex = new WebexCore({credentials: user.token});
|
|
31
|
-
webex.people.get('me')
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
27
|
+
webex.people.get('me').then((person) => {
|
|
28
|
+
actor = person;
|
|
29
|
+
debug('SDK User (Actor) for tests:');
|
|
30
|
+
debug(`- name: ${actor.displayName}`);
|
|
31
|
+
debug(`- id: ${actor.id}`);
|
|
32
|
+
});
|
|
33
|
+
})
|
|
34
|
+
);
|
|
39
35
|
|
|
40
36
|
describe('#memberships', () => {
|
|
41
37
|
let user1;
|
|
42
38
|
|
|
43
|
-
before(() =>
|
|
44
|
-
.then((users) => {
|
|
39
|
+
before(() =>
|
|
40
|
+
testUsers.create({count: 1}).then((users) => {
|
|
45
41
|
user1 = users[0];
|
|
46
42
|
debug('User that memberships are created for:');
|
|
47
43
|
debug(`- name: ${user1.displayName}`);
|
|
48
44
|
debug(`- id: ${constructHydraId(hydraTypes.PEOPLE, user1.id)}`);
|
|
49
|
-
})
|
|
45
|
+
})
|
|
46
|
+
);
|
|
50
47
|
|
|
51
48
|
let room;
|
|
52
49
|
|
|
53
|
-
beforeEach(() =>
|
|
54
|
-
.then((r) => {
|
|
50
|
+
beforeEach(() =>
|
|
51
|
+
webex.rooms.create({title: 'Webex Test Room'}).then((r) => {
|
|
55
52
|
debug('Created Cisco Test Room');
|
|
56
53
|
room = r;
|
|
57
|
-
})
|
|
54
|
+
})
|
|
55
|
+
);
|
|
58
56
|
|
|
59
57
|
afterEach(() => {
|
|
60
58
|
webex.memberships.stopListening();
|
|
@@ -62,19 +60,21 @@ describe('plugin-memberships', function () {
|
|
|
62
60
|
webex.memberships.off('updated');
|
|
63
61
|
webex.memberships.off('deleted');
|
|
64
62
|
webex.memberships.off('seen');
|
|
65
|
-
webex.rooms
|
|
66
|
-
.
|
|
67
|
-
|
|
63
|
+
webex.rooms
|
|
64
|
+
.remove(room)
|
|
65
|
+
.catch((e) => webex.logger.error(`Failed to clean up after unit test: ${e}`));
|
|
68
66
|
});
|
|
69
67
|
|
|
70
68
|
describe('#create()', () => {
|
|
71
|
-
it('creates a membership by user id', () =>
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
69
|
+
it('creates a membership by user id', () =>
|
|
70
|
+
webex.memberships
|
|
71
|
+
.create({
|
|
72
|
+
roomId: room.id,
|
|
73
|
+
personId: user1.id,
|
|
74
|
+
})
|
|
75
|
+
.then((membership) => {
|
|
76
|
+
assert.isMembership(membership);
|
|
77
|
+
}));
|
|
78
78
|
|
|
79
79
|
it('creates a membership by user email', () => {
|
|
80
80
|
const created = new Promise((resolve) => {
|
|
@@ -84,17 +84,19 @@ describe('plugin-memberships', function () {
|
|
|
84
84
|
});
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
-
return webex.memberships.listen()
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
return webex.memberships.listen().then(() =>
|
|
88
|
+
webex.memberships
|
|
89
|
+
.create({
|
|
90
|
+
roomId: room.id,
|
|
91
|
+
personEmail: user1.email,
|
|
92
|
+
})
|
|
92
93
|
.then(async (membership) => {
|
|
93
94
|
validateMembership(membership);
|
|
94
95
|
const event = await created;
|
|
95
96
|
|
|
96
97
|
validateMembershipEvent(event, membership, actor);
|
|
97
|
-
})
|
|
98
|
+
})
|
|
99
|
+
);
|
|
98
100
|
});
|
|
99
101
|
|
|
100
102
|
it('creates a membership and sets moderator status', () => {
|
|
@@ -112,9 +114,11 @@ describe('plugin-memberships', function () {
|
|
|
112
114
|
debug('membership:updated event handler for moderator test called');
|
|
113
115
|
|
|
114
116
|
if (event.data.personId === actor.id) {
|
|
115
|
-
debug(
|
|
116
|
-
'
|
|
117
|
-
|
|
117
|
+
debug(
|
|
118
|
+
'Setting a member to moderator implicitly sets the ' +
|
|
119
|
+
'caller of the API to moderator as well. In this test we ' +
|
|
120
|
+
'will ignore this event'
|
|
121
|
+
);
|
|
118
122
|
|
|
119
123
|
return;
|
|
120
124
|
}
|
|
@@ -122,12 +126,13 @@ describe('plugin-memberships', function () {
|
|
|
122
126
|
});
|
|
123
127
|
});
|
|
124
128
|
|
|
125
|
-
return webex.memberships.listen()
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
return webex.memberships.listen().then(() =>
|
|
130
|
+
webex.memberships
|
|
131
|
+
.create({
|
|
132
|
+
roomId: room.id,
|
|
133
|
+
personId: user1.id,
|
|
134
|
+
isModerator: true,
|
|
135
|
+
})
|
|
131
136
|
.then(async (m) => {
|
|
132
137
|
const membership = m;
|
|
133
138
|
|
|
@@ -143,7 +148,8 @@ describe('plugin-memberships', function () {
|
|
|
143
148
|
// We expect the isModerator status to be false on create
|
|
144
149
|
membership.isModerator = true;
|
|
145
150
|
validateMembershipEvent(event2, membership, actor);
|
|
146
|
-
})
|
|
151
|
+
})
|
|
152
|
+
);
|
|
147
153
|
});
|
|
148
154
|
|
|
149
155
|
it('creates a space and memberships simultaniously', () => {
|
|
@@ -159,24 +165,27 @@ describe('plugin-memberships', function () {
|
|
|
159
165
|
});
|
|
160
166
|
});
|
|
161
167
|
|
|
162
|
-
return
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
room
|
|
168
|
+
return (
|
|
169
|
+
webex.memberships
|
|
170
|
+
.listen()
|
|
171
|
+
// Cleanup current room, we need to catch the event when it's created.
|
|
172
|
+
.then(() => webex.rooms.remove(room))
|
|
173
|
+
// Create a room to trigger created event.
|
|
174
|
+
.then(() => webex.rooms.create({title: 'Webex Test Room'}))
|
|
175
|
+
// Store new room object and get the memberships of the room.
|
|
176
|
+
.then((r) => {
|
|
177
|
+
room = r;
|
|
170
178
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
179
|
+
return webex.memberships.list({roomId: room.id});
|
|
180
|
+
})
|
|
181
|
+
// validate data
|
|
182
|
+
.then(async ({items: [membership]}) => {
|
|
183
|
+
const event = await created;
|
|
176
184
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
185
|
+
validateMembership(membership, false);
|
|
186
|
+
validateMembershipEvent(event, membership, actor);
|
|
187
|
+
})
|
|
188
|
+
);
|
|
180
189
|
});
|
|
181
190
|
});
|
|
182
191
|
|
|
@@ -185,25 +194,24 @@ describe('plugin-memberships', function () {
|
|
|
185
194
|
|
|
186
195
|
before(() =>
|
|
187
196
|
// this could be in parallel once KMS always sends new keys
|
|
188
|
-
webex.rooms
|
|
189
|
-
.
|
|
190
|
-
|
|
191
|
-
webex.rooms.create({title: 'Membership B'})
|
|
192
|
-
]))
|
|
197
|
+
webex.rooms
|
|
198
|
+
.create({title: 'Membership A'})
|
|
199
|
+
.then((room) => Promise.all([room, webex.rooms.create({title: 'Membership B'})]))
|
|
193
200
|
.then((rooms) => {
|
|
194
201
|
const room = rooms[0];
|
|
195
202
|
|
|
196
203
|
return webex.memberships.create({
|
|
197
204
|
roomId: room.id,
|
|
198
|
-
personId: user1.id
|
|
205
|
+
personId: user1.id,
|
|
199
206
|
});
|
|
200
207
|
})
|
|
201
208
|
.then((m) => {
|
|
202
209
|
membership = m;
|
|
203
|
-
})
|
|
210
|
+
})
|
|
211
|
+
);
|
|
204
212
|
|
|
205
|
-
it('retrieves a single membership', () =>
|
|
206
|
-
.then((m) => {
|
|
213
|
+
it('retrieves a single membership', () =>
|
|
214
|
+
webex.memberships.get(membership).then((m) => {
|
|
207
215
|
assert.deepEqual(m, membership);
|
|
208
216
|
}));
|
|
209
217
|
});
|
|
@@ -213,22 +221,21 @@ describe('plugin-memberships', function () {
|
|
|
213
221
|
|
|
214
222
|
before(() =>
|
|
215
223
|
// this could be in parallel once KMS always sends new keys
|
|
216
|
-
webex.rooms
|
|
217
|
-
.
|
|
218
|
-
|
|
219
|
-
webex.rooms.create({title: 'Membership B'})
|
|
220
|
-
]))
|
|
224
|
+
webex.rooms
|
|
225
|
+
.create({title: 'Membership A'})
|
|
226
|
+
.then((room) => Promise.all([room, webex.rooms.create({title: 'Membership B'})]))
|
|
221
227
|
.then((rooms) => {
|
|
222
228
|
room = rooms[0];
|
|
223
229
|
|
|
224
230
|
return webex.memberships.create({
|
|
225
231
|
roomId: room.id,
|
|
226
|
-
personId: user1.id
|
|
232
|
+
personId: user1.id,
|
|
227
233
|
});
|
|
228
|
-
})
|
|
234
|
+
})
|
|
235
|
+
);
|
|
229
236
|
|
|
230
|
-
it('retrieves all memberships for a room', () =>
|
|
231
|
-
.then((memberships) => {
|
|
237
|
+
it('retrieves all memberships for a room', () =>
|
|
238
|
+
webex.memberships.list({roomId: room.id}).then((memberships) => {
|
|
232
239
|
assert.isDefined(memberships);
|
|
233
240
|
assert.isAbove(memberships.length, 0);
|
|
234
241
|
for (const membership of memberships) {
|
|
@@ -240,7 +247,8 @@ describe('plugin-memberships', function () {
|
|
|
240
247
|
it('retrieves a bounded set of memberships for a room', () => {
|
|
241
248
|
const spy = sinon.spy();
|
|
242
249
|
|
|
243
|
-
return webex.memberships
|
|
250
|
+
return webex.memberships
|
|
251
|
+
.list({roomId: room.id, max: 1})
|
|
244
252
|
.then((memberships) => {
|
|
245
253
|
assert.lengthOf(memberships, 1);
|
|
246
254
|
|
|
@@ -254,38 +262,42 @@ describe('plugin-memberships', function () {
|
|
|
254
262
|
}
|
|
255
263
|
|
|
256
264
|
return Promise.resolve();
|
|
257
|
-
}(memberships)
|
|
265
|
+
})(memberships);
|
|
258
266
|
})
|
|
259
267
|
.then(() => {
|
|
260
268
|
assert.calledTwice(spy);
|
|
261
269
|
});
|
|
262
270
|
});
|
|
263
271
|
|
|
264
|
-
it('retrieves all room memberships for a user', () =>
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const membership = memberships.items[0];
|
|
270
|
-
|
|
271
|
-
return webex.memberships.list({
|
|
272
|
-
personEmail: user.email
|
|
272
|
+
it('retrieves all room memberships for a user', () =>
|
|
273
|
+
webex.memberships
|
|
274
|
+
.list({
|
|
275
|
+
personId: user.id,
|
|
276
|
+
roomId: room.id,
|
|
273
277
|
})
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
278
|
+
.then((memberships) => {
|
|
279
|
+
const membership = memberships.items[0];
|
|
280
|
+
|
|
281
|
+
return webex.memberships
|
|
282
|
+
.list({
|
|
283
|
+
personEmail: user.email,
|
|
284
|
+
})
|
|
285
|
+
.then((memberships) => {
|
|
286
|
+
assert.isDefined(memberships);
|
|
287
|
+
assert.isAbove(memberships.length, 0);
|
|
288
|
+
for (const membership of memberships) {
|
|
289
|
+
assert.isMembership(membership);
|
|
290
|
+
assert.equal(membership.personEmail, user.email);
|
|
291
|
+
}
|
|
292
|
+
assert.deepInclude(memberships.items, membership);
|
|
293
|
+
});
|
|
294
|
+
}));
|
|
284
295
|
|
|
285
296
|
it('retrieves a bounded set of memberships for a user', () => {
|
|
286
297
|
const spy = sinon.spy();
|
|
287
298
|
|
|
288
|
-
return webex.memberships
|
|
299
|
+
return webex.memberships
|
|
300
|
+
.list({personId: user.id, max: 1})
|
|
289
301
|
.then((memberships) => {
|
|
290
302
|
assert.lengthOf(memberships, 1);
|
|
291
303
|
|
|
@@ -300,7 +312,7 @@ describe('plugin-memberships', function () {
|
|
|
300
312
|
}
|
|
301
313
|
|
|
302
314
|
return Promise.resolve();
|
|
303
|
-
}(memberships)
|
|
315
|
+
})(memberships);
|
|
304
316
|
})
|
|
305
317
|
.then(() => {
|
|
306
318
|
assert.isAbove(spy.callCount, 0);
|
|
@@ -316,56 +328,65 @@ describe('plugin-memberships', function () {
|
|
|
316
328
|
user1.webex = new WebexCore({credentials: user1.token});
|
|
317
329
|
|
|
318
330
|
// Setup a space with both users
|
|
319
|
-
return webex.rooms
|
|
320
|
-
.
|
|
321
|
-
|
|
322
|
-
webex.rooms.create({title: 'Membership B'})
|
|
323
|
-
]))
|
|
331
|
+
return webex.rooms
|
|
332
|
+
.create({title: 'Membership A'})
|
|
333
|
+
.then((room) => Promise.all([room, webex.rooms.create({title: 'Membership B'})]))
|
|
324
334
|
.then((rooms) => {
|
|
325
335
|
room = rooms[0];
|
|
326
336
|
|
|
327
337
|
return webex.memberships.create({
|
|
328
338
|
roomId: room.id,
|
|
329
|
-
personId: user1.id
|
|
339
|
+
personId: user1.id,
|
|
330
340
|
});
|
|
331
341
|
});
|
|
332
342
|
});
|
|
333
343
|
|
|
334
|
-
it('retrieves memberships with read status for a room that has not been visited', () =>
|
|
335
|
-
.then((memberships) => {
|
|
344
|
+
it('retrieves memberships with read status for a room that has not been visited', () =>
|
|
345
|
+
webex.memberships.listWithReadStatus({roomId: room.id}).then((memberships) => {
|
|
336
346
|
assert.isDefined(memberships);
|
|
337
347
|
assert.equal(memberships.items.length, 2);
|
|
338
348
|
for (const membership of memberships.items) {
|
|
339
349
|
if (membership.personId !== actor.id) {
|
|
340
|
-
assert.notExists(
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
350
|
+
assert.notExists(
|
|
351
|
+
membership.lastSeenId,
|
|
352
|
+
'no lastSeenId for a room that has never been visited'
|
|
353
|
+
);
|
|
354
|
+
assert.notExists(
|
|
355
|
+
membership.lastSeenDate,
|
|
356
|
+
'no lastSeenDate for a room that has never been visited'
|
|
357
|
+
);
|
|
344
358
|
}
|
|
345
359
|
assert.equal(membership.roomId, room.id);
|
|
346
360
|
}
|
|
347
361
|
}));
|
|
348
362
|
|
|
349
|
-
it('validates read status activity after other user posts a message', () =>
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
assert.
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
363
|
+
it('validates read status activity after other user posts a message', () =>
|
|
364
|
+
user1.webex.messages
|
|
365
|
+
.create({
|
|
366
|
+
roomId: room.id,
|
|
367
|
+
text: 'Message to create activity for other member',
|
|
368
|
+
})
|
|
369
|
+
.then(() =>
|
|
370
|
+
webex.memberships.listWithReadStatus({roomId: room.id}).then((memberships) => {
|
|
371
|
+
assert.isDefined(memberships);
|
|
372
|
+
assert.equal(memberships.items.length, 2);
|
|
373
|
+
for (const membership of memberships.items) {
|
|
374
|
+
assert.exists(
|
|
375
|
+
membership.lastSeenId,
|
|
376
|
+
'lastSeenId exists in a room that has been visited'
|
|
377
|
+
);
|
|
378
|
+
assert.exists(
|
|
379
|
+
membership.lastSeenDate,
|
|
380
|
+
'lastSeenDate exists in a room that has been visited'
|
|
381
|
+
);
|
|
382
|
+
assert.equal(membership.roomId, room.id);
|
|
383
|
+
// listWithReadStatus does not include created
|
|
384
|
+
// fudge it here so we can validate all the other fields
|
|
385
|
+
membership.created = 'foo';
|
|
386
|
+
assert.isMembership(membership);
|
|
387
|
+
}
|
|
388
|
+
})
|
|
389
|
+
));
|
|
369
390
|
});
|
|
370
391
|
|
|
371
392
|
describe('#update()', () => {
|
|
@@ -393,61 +414,72 @@ describe('plugin-memberships', function () {
|
|
|
393
414
|
});
|
|
394
415
|
});
|
|
395
416
|
|
|
396
|
-
|
|
397
|
-
|
|
417
|
+
return webex.memberships
|
|
418
|
+
.listen()
|
|
398
419
|
.then(() => webex.rooms.listen())
|
|
399
|
-
.then(() =>
|
|
400
|
-
.
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
420
|
+
.then(() =>
|
|
421
|
+
webex.rooms
|
|
422
|
+
.create({title: 'Membership E'})
|
|
423
|
+
.then((r) => {
|
|
424
|
+
room = r;
|
|
425
|
+
debug(`Room under test ID: ${room.id}`);
|
|
426
|
+
|
|
427
|
+
// First get the SDK users membership
|
|
428
|
+
return webex.memberships.list({
|
|
429
|
+
roomId: room.id,
|
|
430
|
+
personId: actor.id,
|
|
431
|
+
});
|
|
432
|
+
})
|
|
433
|
+
.then((membershipList) => {
|
|
434
|
+
assert.isArray(
|
|
435
|
+
membershipList.items,
|
|
436
|
+
'membership list not returned after room creation'
|
|
437
|
+
);
|
|
438
|
+
assert.equal(
|
|
439
|
+
membershipList.items.length,
|
|
440
|
+
1,
|
|
441
|
+
'SDK Test user not a member of room just created'
|
|
442
|
+
);
|
|
443
|
+
sdkMember = membershipList.items[0];
|
|
444
|
+
|
|
445
|
+
validateMembership(sdkMember);
|
|
446
|
+
sdkMember.isModerator = true;
|
|
447
|
+
|
|
448
|
+
// Then update the SDK user to a moderator
|
|
449
|
+
return webex.memberships.update(sdkMember);
|
|
450
|
+
})
|
|
451
|
+
.then(async (m) => {
|
|
452
|
+
debug('SDK User is now moderator. Wait for events');
|
|
453
|
+
validateMembership(m, true);
|
|
454
|
+
const event = await updated;
|
|
430
455
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
.then((roomUpdatedEvent) => {
|
|
434
|
-
// Check that the expected rooms:updated event matches
|
|
435
|
-
// what we expect when a room is first moderated
|
|
436
|
-
validateRoomsUpdatedEvent(roomUpdatedEvent, room,
|
|
437
|
-
/* expected value of isLocked */ true);
|
|
456
|
+
validateMembershipEvent(event, m, actor);
|
|
457
|
+
const roomUpdatedEvent = await roomUpdated;
|
|
438
458
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
459
|
+
return Promise.resolve(roomUpdatedEvent);
|
|
460
|
+
})
|
|
461
|
+
.then((roomUpdatedEvent) => {
|
|
462
|
+
// Check that the expected rooms:updated event matches
|
|
463
|
+
// what we expect when a room is first moderated
|
|
464
|
+
validateRoomsUpdatedEvent(
|
|
465
|
+
roomUpdatedEvent,
|
|
466
|
+
room,
|
|
467
|
+
/* expected value of isLocked */ true
|
|
468
|
+
);
|
|
469
|
+
|
|
470
|
+
// Finally, create the user for our test
|
|
471
|
+
return webex.memberships.create({
|
|
472
|
+
roomId: room.id,
|
|
473
|
+
personId: user1.id,
|
|
474
|
+
});
|
|
475
|
+
})
|
|
476
|
+
.then((m) => {
|
|
477
|
+
debug('User 1 Membership created in Membership E');
|
|
478
|
+
membership = m;
|
|
479
|
+
validateMembership(membership);
|
|
480
|
+
})
|
|
481
|
+
.catch((e) => debug(`membership failed: ${e}`))
|
|
482
|
+
);
|
|
451
483
|
});
|
|
452
484
|
|
|
453
485
|
after(() => {
|
|
@@ -474,7 +506,8 @@ describe('plugin-memberships', function () {
|
|
|
474
506
|
|
|
475
507
|
sdkMember.isModerator = false;
|
|
476
508
|
|
|
477
|
-
return webex.rooms
|
|
509
|
+
return webex.rooms
|
|
510
|
+
.listen()
|
|
478
511
|
.then(() => webex.memberships.listen())
|
|
479
512
|
.then(() => webex.memberships.update(sdkMember))
|
|
480
513
|
.then(async (m) => {
|
|
@@ -495,8 +528,9 @@ describe('plugin-memberships', function () {
|
|
|
495
528
|
debug('Validating rooms:updated event...');
|
|
496
529
|
debug(`roomId: ${room.id}, event.data.id: ${roomUpdatedEvent.data.id}`);
|
|
497
530
|
|
|
498
|
-
return Promise.resolve(
|
|
499
|
-
room, /* expected isLocked value */ false)
|
|
531
|
+
return Promise.resolve(
|
|
532
|
+
validateRoomsUpdatedEvent(roomUpdatedEvent, room, /* expected isLocked value */ false)
|
|
533
|
+
);
|
|
500
534
|
})
|
|
501
535
|
.catch((e) => debug(`after logic for #update()' failed: ${e}`));
|
|
502
536
|
});
|
|
@@ -512,19 +546,19 @@ describe('plugin-memberships', function () {
|
|
|
512
546
|
});
|
|
513
547
|
});
|
|
514
548
|
|
|
515
|
-
return webex.memberships.listen()
|
|
516
|
-
.then(() =>
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
const event = await updated;
|
|
549
|
+
return webex.memberships.listen().then(() =>
|
|
550
|
+
webex.memberships.update(membership).then(async (m) => {
|
|
551
|
+
debug('membership updated');
|
|
552
|
+
assert.deepEqual(m, membership);
|
|
553
|
+
validateMembership(membership, true);
|
|
554
|
+
const event = await updated;
|
|
522
555
|
|
|
523
|
-
|
|
524
|
-
|
|
556
|
+
validateMembershipEvent(event, membership, actor);
|
|
557
|
+
})
|
|
558
|
+
);
|
|
525
559
|
});
|
|
526
560
|
|
|
527
|
-
it(
|
|
561
|
+
it("revokes a member's moderator status", () => {
|
|
528
562
|
assert.isTrue(membership.isModerator);
|
|
529
563
|
membership.isModerator = false;
|
|
530
564
|
|
|
@@ -535,19 +569,18 @@ describe('plugin-memberships', function () {
|
|
|
535
569
|
});
|
|
536
570
|
});
|
|
537
571
|
|
|
538
|
-
return webex.memberships.listen()
|
|
539
|
-
.then(() =>
|
|
540
|
-
.
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
const event = await updated;
|
|
572
|
+
return webex.memberships.listen().then(() =>
|
|
573
|
+
webex.memberships.update(membership).then(async (m) => {
|
|
574
|
+
assert.deepEqual(m, membership);
|
|
575
|
+
validateMembership(membership, false);
|
|
576
|
+
const event = await updated;
|
|
544
577
|
|
|
545
|
-
|
|
546
|
-
|
|
578
|
+
validateMembershipEvent(event, membership, actor);
|
|
579
|
+
})
|
|
580
|
+
);
|
|
547
581
|
});
|
|
548
582
|
});
|
|
549
583
|
|
|
550
|
-
|
|
551
584
|
describe('#updateLastSeen()', () => {
|
|
552
585
|
let actor1, message;
|
|
553
586
|
|
|
@@ -557,7 +590,8 @@ describe('plugin-memberships', function () {
|
|
|
557
590
|
// and another can mark it as read
|
|
558
591
|
user1.webex = new WebexCore({credentials: user1.token});
|
|
559
592
|
|
|
560
|
-
return user1.webex.people
|
|
593
|
+
return user1.webex.people
|
|
594
|
+
.get('me')
|
|
561
595
|
.then((person) => {
|
|
562
596
|
actor1 = person;
|
|
563
597
|
|
|
@@ -568,17 +602,20 @@ describe('plugin-memberships', function () {
|
|
|
568
602
|
|
|
569
603
|
return webex.memberships.create({
|
|
570
604
|
roomId: room.id,
|
|
571
|
-
personId: actor1.id
|
|
605
|
+
personId: actor1.id,
|
|
572
606
|
});
|
|
573
607
|
})
|
|
574
|
-
.then(() =>
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
608
|
+
.then(() =>
|
|
609
|
+
webex.messages
|
|
610
|
+
.create({
|
|
611
|
+
roomId: room.id,
|
|
612
|
+
text: 'This is a test message',
|
|
613
|
+
})
|
|
614
|
+
.then((m) => {
|
|
615
|
+
message = m;
|
|
616
|
+
assert.isMessage(message);
|
|
617
|
+
})
|
|
618
|
+
);
|
|
582
619
|
});
|
|
583
620
|
|
|
584
621
|
it('marks a message as read and verifies membership:updated event', () => {
|
|
@@ -591,18 +628,21 @@ describe('plugin-memberships', function () {
|
|
|
591
628
|
|
|
592
629
|
debug(`${user1.displayName} marked message as read...`);
|
|
593
630
|
|
|
594
|
-
return webex.memberships.listen()
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
631
|
+
return webex.memberships.listen().then(() =>
|
|
632
|
+
user1.webex.memberships.updateLastSeen(message).then(async (m) => {
|
|
633
|
+
debug('membership seen');
|
|
634
|
+
validateMembership(m);
|
|
635
|
+
const event = await seenPromise;
|
|
636
|
+
|
|
637
|
+
debug(`...${user.displayName} got the membership:seen event.`);
|
|
638
|
+
assert.equal(
|
|
639
|
+
event.data.lastSeenId,
|
|
640
|
+
message.id,
|
|
641
|
+
'message:seen lastSeenID matches id of message that was acknlowledged'
|
|
642
|
+
);
|
|
643
|
+
validateMembershipEvent(event, m, actor1, actor);
|
|
644
|
+
})
|
|
645
|
+
);
|
|
606
646
|
});
|
|
607
647
|
});
|
|
608
648
|
|
|
@@ -613,22 +653,24 @@ describe('plugin-memberships', function () {
|
|
|
613
653
|
// We create it by sending a message to the test user
|
|
614
654
|
before(() =>
|
|
615
655
|
// Ensure that room is a one-on-one object
|
|
616
|
-
webex.messages
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
656
|
+
webex.messages
|
|
657
|
+
.create({
|
|
658
|
+
toPersonId: user1.id,
|
|
659
|
+
text: 'This message will create a 1-1 space',
|
|
660
|
+
})
|
|
620
661
|
.then((message) => {
|
|
621
662
|
roomId = message.roomId;
|
|
622
663
|
|
|
623
664
|
// Get the test users membership
|
|
624
665
|
return webex.memberships.list({
|
|
625
666
|
roomId,
|
|
626
|
-
personId: user.id
|
|
667
|
+
personId: user.id,
|
|
627
668
|
});
|
|
628
669
|
})
|
|
629
670
|
.then((memberships) => {
|
|
630
671
|
membership = memberships.items[0];
|
|
631
|
-
})
|
|
672
|
+
})
|
|
673
|
+
);
|
|
632
674
|
|
|
633
675
|
it('hides a space and validates the membership is updated', () => {
|
|
634
676
|
const updatedEventPromise = new Promise((resolve) => {
|
|
@@ -638,40 +680,51 @@ describe('plugin-memberships', function () {
|
|
|
638
680
|
});
|
|
639
681
|
});
|
|
640
682
|
|
|
641
|
-
return webex.memberships.listen()
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
membership.isRoomHidden = true;
|
|
645
|
-
|
|
646
|
-
return webex.memberships.update(membership)
|
|
647
|
-
.then(async (m) => {
|
|
648
|
-
debug('memberships.update() request returned OK. Waiting for memberships:updated event');
|
|
649
|
-
assert(m.isRoomHidden, 'membership returned from meberships.update() did not have isRoomHidden set to true');
|
|
650
|
-
const event = await updatedEventPromise;
|
|
683
|
+
return webex.memberships.listen().then(() => {
|
|
684
|
+
debug(`Hiding my membership in 1-1 space with ID: ${roomId}...`);
|
|
685
|
+
membership.isRoomHidden = true;
|
|
651
686
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
687
|
+
return webex.memberships
|
|
688
|
+
.update(membership)
|
|
689
|
+
.then(async (m) => {
|
|
690
|
+
debug(
|
|
691
|
+
'memberships.update() request returned OK. Waiting for memberships:updated event'
|
|
692
|
+
);
|
|
693
|
+
assert(
|
|
694
|
+
m.isRoomHidden,
|
|
695
|
+
'membership returned from meberships.update() did not have isRoomHidden set to true'
|
|
696
|
+
);
|
|
697
|
+
const event = await updatedEventPromise;
|
|
698
|
+
|
|
699
|
+
assert(
|
|
700
|
+
event.data.isRoomHidden,
|
|
701
|
+
'memberships:updated event did not have isRoomHidden set to true'
|
|
702
|
+
);
|
|
703
|
+
validateMembershipEvent(event, m, actor);
|
|
704
|
+
})
|
|
705
|
+
.catch((e) => assert.fail(`Updating room to hidden failed: ${e.message}`));
|
|
706
|
+
});
|
|
657
707
|
});
|
|
658
708
|
});
|
|
659
709
|
|
|
660
710
|
describe('#remove()', () => {
|
|
661
711
|
let membership;
|
|
662
712
|
|
|
663
|
-
before(() =>
|
|
664
|
-
.
|
|
665
|
-
|
|
713
|
+
before(() =>
|
|
714
|
+
webex.rooms
|
|
715
|
+
.create({title: 'Membership F'})
|
|
716
|
+
.then((r) => {
|
|
717
|
+
room = r;
|
|
666
718
|
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
719
|
+
return webex.memberships.create({
|
|
720
|
+
roomId: room.id,
|
|
721
|
+
personId: user1.id,
|
|
722
|
+
});
|
|
723
|
+
})
|
|
724
|
+
.then((m) => {
|
|
725
|
+
membership = m;
|
|
726
|
+
})
|
|
727
|
+
);
|
|
675
728
|
|
|
676
729
|
it('deletes a single membership', () => {
|
|
677
730
|
const deletedEventPromise = new Promise((resolve) => {
|
|
@@ -681,11 +734,13 @@ describe('plugin-memberships', function () {
|
|
|
681
734
|
});
|
|
682
735
|
});
|
|
683
736
|
|
|
684
|
-
return webex.memberships
|
|
685
|
-
.
|
|
686
|
-
|
|
737
|
+
return webex.memberships
|
|
738
|
+
.listen()
|
|
739
|
+
.then(() =>
|
|
740
|
+
webex.memberships.remove(membership).catch((reason) => {
|
|
687
741
|
webex.logger.error('Failed to delete membership', reason);
|
|
688
|
-
})
|
|
742
|
+
})
|
|
743
|
+
)
|
|
689
744
|
.then(async (body) => {
|
|
690
745
|
debug('member deleted');
|
|
691
746
|
assert.notOk(body);
|
|
@@ -712,10 +767,8 @@ describe('plugin-memberships', function () {
|
|
|
712
767
|
function validateMembership(membership, isModerator = false) {
|
|
713
768
|
assert.isDefined(membership);
|
|
714
769
|
if ('isModerator' in membership) {
|
|
715
|
-
assert.equal(membership.isModerator, isModerator,
|
|
716
|
-
|
|
717
|
-
}
|
|
718
|
-
else {
|
|
770
|
+
assert.equal(membership.isModerator, isModerator, 'unexpected isModerator status');
|
|
771
|
+
} else {
|
|
719
772
|
// moderator status not returned for membership:seen events
|
|
720
773
|
assert.exists(membership.lastSeenId);
|
|
721
774
|
// fudge the moderator field so we can do the general check
|
|
@@ -735,41 +788,47 @@ function validateMembership(membership, isModerator = false) {
|
|
|
735
788
|
* @returns {void}
|
|
736
789
|
*/
|
|
737
790
|
function validateMembershipEvent(event, membership, actor, creator = actor) {
|
|
738
|
-
assert.isTrue(
|
|
739
|
-
|
|
791
|
+
assert.isTrue(
|
|
792
|
+
event.resource === SDK_EVENT.EXTERNAL.RESOURCE.MEMBERSHIPS,
|
|
793
|
+
'not a membership event'
|
|
794
|
+
);
|
|
740
795
|
assert.isDefined(event.event, 'membership event type not set');
|
|
741
796
|
assert.isDefined(event.created, 'event listener created date not set');
|
|
742
|
-
assert.equal(event.createdBy, creator.id,
|
|
743
|
-
|
|
744
|
-
assert.equal(event.orgId, actor.orgId,
|
|
745
|
-
'event listener orgId not === to our actor\'s');
|
|
797
|
+
assert.equal(event.createdBy, creator.id, 'event listener createdBy not set to our actor');
|
|
798
|
+
assert.equal(event.orgId, actor.orgId, "event listener orgId not === to our actor's");
|
|
746
799
|
assert.equal(event.ownedBy, 'creator', 'event listener not owned by creator');
|
|
747
800
|
assert.equal(event.status, 'active', 'event listener status not active');
|
|
748
|
-
assert.equal(event.actorId, actor.id,
|
|
749
|
-
'event actorId not equal to our actor\'s id');
|
|
801
|
+
assert.equal(event.actorId, actor.id, "event actorId not equal to our actor's id");
|
|
750
802
|
|
|
751
803
|
// Ensure event data matches data returned from function call
|
|
752
804
|
// Skip this until we figure out how conversations converts the internal test user UUID
|
|
753
|
-
assert.equal(event.data.id, membership.id,
|
|
754
|
-
|
|
755
|
-
assert.equal(event.data.
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
assert.equal(
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
'event/membership.
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
805
|
+
assert.equal(event.data.id, membership.id, 'event/membership.id not equal');
|
|
806
|
+
assert.equal(event.data.roomId, membership.roomId, 'event/membership.roomId not equal');
|
|
807
|
+
assert.equal(event.data.personId, membership.personId, 'event/membership.personId not equal');
|
|
808
|
+
assert.equal(
|
|
809
|
+
event.data.personOrgId,
|
|
810
|
+
membership.personOrgId,
|
|
811
|
+
'event/membership.personId not equal'
|
|
812
|
+
);
|
|
813
|
+
assert.equal(
|
|
814
|
+
event.data.personEmail,
|
|
815
|
+
membership.personEmail,
|
|
816
|
+
'event/membership.personEmail not equal'
|
|
817
|
+
);
|
|
818
|
+
assert.equal(
|
|
819
|
+
event.data.personDisplayName,
|
|
820
|
+
membership.personDisplayName,
|
|
821
|
+
'event/membership.personDisplayName not equal'
|
|
822
|
+
);
|
|
823
|
+
assert.equal(event.data.roomType, membership.roomType, 'event/membership.roomType not equal');
|
|
824
|
+
assert.equal(event.data.isHidden, membership.isHidden, 'event/membership.isHidden not equal');
|
|
769
825
|
if (event.event !== 'seen') {
|
|
770
826
|
// moderator status not returned on membership:seen events
|
|
771
|
-
assert.equal(
|
|
772
|
-
|
|
827
|
+
assert.equal(
|
|
828
|
+
event.data.isModerator,
|
|
829
|
+
membership.isModerator,
|
|
830
|
+
'event/membership.isModerator not equal'
|
|
831
|
+
);
|
|
773
832
|
}
|
|
774
833
|
debug(`membership:${event.event} event validated`);
|
|
775
834
|
}
|
|
@@ -787,12 +846,9 @@ function validateMembershipEvent(event, membership, actor, creator = actor) {
|
|
|
787
846
|
function validateRoomsUpdatedEvent(event, room, isLocked) {
|
|
788
847
|
const {data} = event;
|
|
789
848
|
|
|
790
|
-
assert(
|
|
791
|
-
|
|
792
|
-
assert(
|
|
793
|
-
'rooms:updated event did not have the expected room type');
|
|
794
|
-
assert((data.isLocked === isLocked),
|
|
795
|
-
'rooms:updated did not have expected isLocked value');
|
|
849
|
+
assert(room.id === data.id, 'rooms:updated event did not have the expected roomId');
|
|
850
|
+
assert(room.type === data.type, 'rooms:updated event did not have the expected room type');
|
|
851
|
+
assert(data.isLocked === isLocked, 'rooms:updated did not have expected isLocked value');
|
|
796
852
|
|
|
797
853
|
debug(`rooms:${event.event} event validated`);
|
|
798
854
|
}
|