1 | 'use strict'
|
2 |
|
3 |
|
4 |
|
5 | const { expect } = require('chai')
|
6 |
|
7 | const { cleanup, clientConnect,
|
8 | parallel, series, startService } = require('./testutils')
|
9 |
|
10 | const { cleanupTimeout, user1, user2,
|
11 | roomName1, roomName2 } = require('./config')
|
12 |
|
13 | module.exports = function () {
|
14 | let chatService, socket1, socket2, socket3
|
15 |
|
16 | afterEach(function (cb) {
|
17 | this.timeout(cleanupTimeout)
|
18 | cleanup(chatService, [socket1, socket2, socket3], cb)
|
19 | chatService = socket1 = socket2 = socket3 = null
|
20 | })
|
21 |
|
22 | it('should emit echos to a non-joined user\'s socket', function (done) {
|
23 | chatService = startService()
|
24 | chatService.addRoom(roomName1, null, () => {
|
25 | socket1 = clientConnect(user1)
|
26 | socket1.on('loginConfirmed', (u, data) => {
|
27 | socket2 = clientConnect(user1)
|
28 | socket2.on('loginConfirmed', (u, data) => {
|
29 | let sid2 = data.id
|
30 | socket2.emit('roomJoin', roomName1)
|
31 | socket1.on('roomJoinedEcho', (room, id, njoined) => {
|
32 | expect(room).equal(roomName1)
|
33 | expect(id).equal(sid2)
|
34 | expect(njoined).equal(1)
|
35 | socket2.emit('roomLeave', roomName1)
|
36 | socket1.on('roomLeftEcho', (room, id, njoined) => {
|
37 | expect(room).equal(roomName1)
|
38 | expect(id).equal(sid2)
|
39 | expect(njoined).equal(0)
|
40 | done()
|
41 | })
|
42 | })
|
43 | })
|
44 | })
|
45 | })
|
46 | })
|
47 |
|
48 | it('should emit echos to a joined user\'s socket', function (done) {
|
49 | chatService = startService()
|
50 | chatService.addRoom(roomName1, null, () => {
|
51 | socket1 = clientConnect(user1)
|
52 | socket1.on('loginConfirmed', (u, data) => {
|
53 | socket1.emit('roomJoin', roomName1, () => {
|
54 | socket2 = clientConnect(user1)
|
55 | socket2.on('loginConfirmed', (u, data) => {
|
56 | let sid2 = data.id
|
57 | socket2.emit('roomJoin', roomName1)
|
58 | socket1.on('roomJoinedEcho', (room, id, njoined) => {
|
59 | expect(room).equal(roomName1)
|
60 | expect(id).equal(sid2)
|
61 | expect(njoined).equal(2)
|
62 | socket2.emit('roomLeave', roomName1)
|
63 | socket1.on('roomLeftEcho', (room, id, njoined) => {
|
64 | expect(room).equal(roomName1)
|
65 | expect(id).equal(sid2)
|
66 | expect(njoined).equal(1)
|
67 | done()
|
68 | })
|
69 | })
|
70 | })
|
71 | })
|
72 | })
|
73 | })
|
74 | })
|
75 |
|
76 | it('should emit leave echo on a disconnect', function (done) {
|
77 | let sid1, sid2
|
78 | chatService = startService()
|
79 | chatService.addRoom(roomName1, null, () => parallel([
|
80 | cb => {
|
81 | socket3 = clientConnect(user1)
|
82 | socket3.on('loginConfirmed', () => cb())
|
83 | },
|
84 | cb => {
|
85 | socket1 = clientConnect(user1)
|
86 | socket1.on('loginConfirmed', (u, data) => {
|
87 | sid1 = data.id
|
88 | socket1.emit('roomJoin', roomName1, cb)
|
89 | })
|
90 | },
|
91 | cb => {
|
92 | socket2 = clientConnect(user1)
|
93 | socket2.on('loginConfirmed', (u, data) => {
|
94 | sid2 = data.id
|
95 | socket2.emit('roomJoin', roomName1, cb)
|
96 | })
|
97 | }
|
98 | ], error => {
|
99 | expect(error).not.ok
|
100 | socket2.disconnect()
|
101 | parallel([
|
102 | cb => socket1.once('roomLeftEcho', (room, id, njoined) => {
|
103 | expect(room).equal(roomName1)
|
104 | expect(id).equal(sid2)
|
105 | expect(njoined).equal(1)
|
106 | cb()
|
107 | }),
|
108 | cb => socket3.once('roomLeftEcho', (room, id, njoined) => {
|
109 | expect(room).equal(roomName1)
|
110 | expect(id).equal(sid2)
|
111 | expect(njoined).equal(1)
|
112 | cb()
|
113 | })
|
114 |
|
115 | ], () => {
|
116 | socket1.disconnect()
|
117 | socket3.on('roomLeftEcho', (room, id, njoined) => {
|
118 | expect(room).equal(roomName1)
|
119 | expect(id).equal(sid1)
|
120 | expect(njoined).equal(0)
|
121 | done()
|
122 | })
|
123 | })
|
124 | }))
|
125 | })
|
126 |
|
127 | it('should remove disconnected users', function (done) {
|
128 | chatService = startService({ enableUserlistUpdates: true })
|
129 | chatService.addRoom(roomName1, null, () => {
|
130 | socket1 = clientConnect(user1)
|
131 | socket1.on('loginConfirmed', () => {
|
132 | socket1.emit('roomJoin', roomName1, () => {
|
133 | socket2 = clientConnect(user2)
|
134 | socket2.on('loginConfirmed', () => {
|
135 | socket2.emit('roomJoin', roomName1, () => {
|
136 | socket2.disconnect()
|
137 | socket1.on('roomUserLeft', (r, u) => {
|
138 | expect(r).equal(roomName1)
|
139 | expect(u).equal(user2)
|
140 | done()
|
141 | })
|
142 | })
|
143 | })
|
144 | })
|
145 | })
|
146 | })
|
147 | })
|
148 |
|
149 | it('should echo leaving when socket disconnects', function (done) {
|
150 | this.timeout(4000)
|
151 | this.slow(2000)
|
152 | chatService = startService({ enableUserlistUpdates: true })
|
153 | chatService.addRoom(roomName1, null, () => {
|
154 | socket1 = clientConnect(user1)
|
155 | socket1.on('loginConfirmed', () => {
|
156 | socket1.emit('roomJoin', roomName1, () => {
|
157 | socket2 = clientConnect(user2)
|
158 | socket2.on('loginConfirmed', () => {
|
159 | socket2.emit('roomLeave', roomName1)
|
160 | socket1.on('roomLeftEcho', () => done(new Error('Wrong echo')))
|
161 | setTimeout(done, 1000)
|
162 | })
|
163 | })
|
164 | })
|
165 | })
|
166 | })
|
167 |
|
168 | it('should update userlist on join and leave operations', function (done) {
|
169 | chatService = startService()
|
170 | chatService.addRoom(roomName1, null, () => parallel([
|
171 | cb => {
|
172 | socket1 = clientConnect(user1)
|
173 | socket1.on('loginConfirmed',
|
174 | () => socket1.emit('roomJoin', roomName1, cb))
|
175 | },
|
176 | cb => {
|
177 | socket2 = clientConnect(user2)
|
178 | socket2.on('loginConfirmed',
|
179 | () => socket2.emit('roomJoin', roomName1, cb))
|
180 | }
|
181 | ], error => {
|
182 | expect(error).not.ok
|
183 | socket1.emit(
|
184 | 'roomGetAccessList', roomName1, 'userlist', (error, data) => {
|
185 | expect(error).not.ok
|
186 | expect(data).lengthOf(2)
|
187 | expect(data).include(user1)
|
188 | expect(data).include(user2)
|
189 | socket2.emit('roomLeave', roomName1, (error, data) => {
|
190 | expect(error).not.ok
|
191 | socket1.emit(
|
192 | 'roomGetAccessList', roomName1, 'userlist', (error, data) => {
|
193 | expect(error).not.ok
|
194 | expect(data).lengthOf(1)
|
195 | expect(data).include(user1)
|
196 | expect(data).not.include(user2)
|
197 | done()
|
198 | })
|
199 | })
|
200 | })
|
201 | }))
|
202 | })
|
203 |
|
204 | it('should broadcast join and leave room messages', function (done) {
|
205 | chatService = startService({ enableUserlistUpdates: true })
|
206 | chatService.addRoom(roomName1, null, () => {
|
207 | socket1 = clientConnect(user1)
|
208 | socket1.on('loginConfirmed', () => {
|
209 | socket1.emit('roomJoin', roomName1, (error, njoined) => {
|
210 | expect(error).not.ok
|
211 | expect(njoined).equal(1)
|
212 | socket2 = clientConnect(user2)
|
213 | socket2.on('loginConfirmed', () => {
|
214 | socket2.emit('roomJoin', roomName1)
|
215 | socket1.on('roomUserJoined', (room, user) => {
|
216 | expect(room).equal(roomName1)
|
217 | expect(user).equal(user2)
|
218 | socket2.emit('roomLeave', roomName1)
|
219 | socket1.on('roomUserLeft', (room, user) => {
|
220 | expect(room).equal(roomName1)
|
221 | expect(user).equal(user2)
|
222 | done()
|
223 | })
|
224 | })
|
225 | })
|
226 | })
|
227 | })
|
228 | })
|
229 | })
|
230 |
|
231 | it('should update userlist on a disconnect', function (done) {
|
232 | chatService = startService({ enableUserlistUpdates: true })
|
233 | chatService.addRoom(roomName1, null, () => parallel([
|
234 | cb => {
|
235 | socket1 = clientConnect(user1)
|
236 | socket1.on('loginConfirmed',
|
237 | () => socket1.emit('roomJoin', roomName1, cb))
|
238 | },
|
239 | cb => {
|
240 | socket2 = clientConnect(user2)
|
241 | socket2.on('loginConfirmed',
|
242 | () => socket2.emit('roomJoin', roomName1, cb))
|
243 | }
|
244 | ], error => {
|
245 | expect(error).not.ok
|
246 | socket1.emit(
|
247 | 'roomGetAccessList', roomName1, 'userlist', (error, data) => {
|
248 | expect(error).not.ok
|
249 | expect(data).lengthOf(2)
|
250 | expect(data).include(user1)
|
251 | expect(data).include(user2)
|
252 | socket2.disconnect()
|
253 | socket1.once('roomUserLeft', () => {
|
254 | socket1.emit(
|
255 | 'roomGetAccessList', roomName1, 'userlist', (error, data) => {
|
256 | expect(error).not.ok
|
257 | expect(data).lengthOf(1)
|
258 | expect(data).include(user1)
|
259 | expect(data).not.include(user2)
|
260 | done()
|
261 | })
|
262 | })
|
263 | })
|
264 | }))
|
265 | })
|
266 |
|
267 | it('should store and send a room history', function (done) {
|
268 | let txt = 'Test message.'
|
269 | let message = { textMessage: txt }
|
270 | chatService = startService()
|
271 | chatService.addRoom(roomName1, null, () => {
|
272 | socket1 = clientConnect(user1)
|
273 | socket1.on('loginConfirmed', () => {
|
274 | socket1.emit('roomJoin', roomName1, () => {
|
275 | socket1.emit('roomMessage', roomName1, message, (error, data) => {
|
276 | expect(error).not.ok
|
277 | expect(data).a('Number')
|
278 | socket1.emit('roomRecentHistory', roomName1, (error, data) => {
|
279 | expect(error).not.ok
|
280 | expect(data).length(1)
|
281 | let props = ['textMessage', 'author', 'timestamp', 'id']
|
282 | expect(data[0]).include.keys(props)
|
283 | expect(data[0].textMessage).equal(txt)
|
284 | expect(data[0].author).equal(user1)
|
285 | expect(data[0].timestamp).a('Number')
|
286 | expect(data[0].id).equal(1)
|
287 | done()
|
288 | })
|
289 | })
|
290 | })
|
291 | })
|
292 | })
|
293 | })
|
294 |
|
295 | it('should send room messages to all joined users', function (done) {
|
296 | let txt = 'Test message.'
|
297 | let message = { textMessage: txt }
|
298 | chatService = startService()
|
299 | chatService.addRoom(roomName1, null, () => parallel([
|
300 | cb => {
|
301 | socket1 = clientConnect(user1)
|
302 | socket1.on('loginConfirmed',
|
303 | () => socket1.emit('roomJoin', roomName1, cb))
|
304 | },
|
305 | cb => {
|
306 | socket2 = clientConnect(user2)
|
307 | socket2.on('loginConfirmed',
|
308 | () => socket2.emit('roomJoin', roomName1, cb))
|
309 | }
|
310 | ], error => {
|
311 | expect(error).not.ok
|
312 | parallel([
|
313 | cb => socket1.emit('roomMessage', roomName1, message, cb),
|
314 | cb => socket1.on('roomMessage', (room, msg) => {
|
315 | expect(room).equal(roomName1)
|
316 | expect(msg.author).equal(user1)
|
317 | expect(msg.textMessage).equal(txt)
|
318 | expect(msg).ownProperty('timestamp')
|
319 | expect(msg).ownProperty('id')
|
320 | cb()
|
321 | }),
|
322 | cb => socket2.on('roomMessage', (room, msg) => {
|
323 | expect(room).equal(roomName1)
|
324 | expect(msg.author).equal(user1)
|
325 | expect(msg.textMessage).equal(txt)
|
326 | expect(msg).ownProperty('timestamp')
|
327 | expect(msg).ownProperty('id')
|
328 | cb()
|
329 | })
|
330 | ], done)
|
331 | }))
|
332 | })
|
333 |
|
334 | it('should drop a history if the limit is zero', function (done) {
|
335 | let txt = 'Test message.'
|
336 | let message = { textMessage: txt }
|
337 | chatService = startService({ historyMaxSize: 0 })
|
338 | chatService.addRoom(roomName1, null, () => {
|
339 | socket1 = clientConnect(user1)
|
340 | socket1.on('loginConfirmed', () => {
|
341 | socket1.emit('roomJoin', roomName1, () => {
|
342 | socket1.emit('roomMessage', roomName1, message, (error, id) => {
|
343 | expect(error).not.ok
|
344 | expect(id).equal(1)
|
345 | socket1.emit('roomRecentHistory', roomName1, (error, data) => {
|
346 | expect(error).not.ok
|
347 | expect(data).empty
|
348 | done()
|
349 | })
|
350 | })
|
351 | })
|
352 | })
|
353 | })
|
354 | })
|
355 |
|
356 | it('should not send a history if the limit is zero', function (done) {
|
357 | let txt = 'Test message.'
|
358 | let message = { textMessage: txt }
|
359 | chatService = startService({ historyMaxGetMessages: 0 })
|
360 | chatService.addRoom(roomName1, null, () => {
|
361 | socket1 = clientConnect(user1)
|
362 | socket1.on('loginConfirmed', () => {
|
363 | socket1.emit('roomJoin', roomName1, () => {
|
364 | socket1.emit('roomMessage', roomName1, message, () => {
|
365 | socket1.emit('roomRecentHistory', roomName1, (error, data) => {
|
366 | expect(error).not.ok
|
367 | expect(data).empty
|
368 | socket1.emit(
|
369 | 'roomHistoryGet', roomName1, 0, 10, (error, data) => {
|
370 | expect(error).not.ok
|
371 | expect(data).empty
|
372 | done()
|
373 | })
|
374 | })
|
375 | })
|
376 | })
|
377 | })
|
378 | })
|
379 | })
|
380 |
|
381 | it('should send a room history maximum size', function (done) {
|
382 | let sz = 1000
|
383 | chatService = startService({ historyMaxSize: sz })
|
384 | chatService.addRoom(roomName1, null, () => {
|
385 | socket1 = clientConnect(user1)
|
386 | socket1.on('loginConfirmed', () => {
|
387 | socket1.emit('roomJoin', roomName1, () => {
|
388 | socket1.emit('roomHistoryInfo', roomName1, (error, data) => {
|
389 | expect(error).not.ok
|
390 | expect(data.historyMaxSize).equal(sz)
|
391 | done()
|
392 | })
|
393 | })
|
394 | })
|
395 | })
|
396 | })
|
397 |
|
398 | it('should truncate a long history', function (done) {
|
399 | let txt1 = 'Test message 1.'
|
400 | let message1 = { textMessage: txt1 }
|
401 | let txt2 = 'Test message 2.'
|
402 | let message2 = { textMessage: txt2 }
|
403 | chatService = startService({ historyMaxSize: 1 })
|
404 | chatService.addRoom(roomName1, null, () => {
|
405 | socket1 = clientConnect(user1)
|
406 | socket1.on('loginConfirmed', () => {
|
407 | socket1.emit('roomJoin', roomName1, () => {
|
408 | socket1.emit('roomMessage', roomName1, message1, () => {
|
409 | socket1.emit('roomMessage', roomName1, message2, () => {
|
410 | socket1.emit('roomRecentHistory', roomName1, (error, data) => {
|
411 | expect(error).not.ok
|
412 | expect(data).length(1)
|
413 | let props = ['textMessage', 'author', 'timestamp', 'id']
|
414 | expect(data[0]).include.keys(props)
|
415 | expect(data[0].textMessage).equal(txt2)
|
416 | expect(data[0].author).equal(user1)
|
417 | expect(data[0].timestamp).a('Number')
|
418 | expect(data[0].id).equal(2)
|
419 | done()
|
420 | })
|
421 | })
|
422 | })
|
423 | })
|
424 | })
|
425 | })
|
426 | })
|
427 |
|
428 | it('should support a history synchronisation', function (done) {
|
429 | let txt = 'Test message.'
|
430 | let message = { textMessage: txt }
|
431 | chatService = startService()
|
432 | chatService.addRoom(roomName1, null, () => {
|
433 | socket1 = clientConnect(user1)
|
434 | series([
|
435 | cb => socket1.on('loginConfirmed',
|
436 | () => socket1.emit('roomJoin', roomName1, cb)),
|
437 | cb => socket1.emit('roomMessage', roomName1, message, cb),
|
438 | cb => socket1.emit('roomMessage', roomName1, message, cb)
|
439 | ], error => {
|
440 | expect(error).not.ok
|
441 | parallel([
|
442 | cb =>
|
443 | socket1.emit('roomHistoryGet', roomName1, 0, 10, (error, data) => {
|
444 | expect(error).not.ok
|
445 | expect(data).lengthOf(2)
|
446 | let props = ['textMessage', 'author', 'timestamp', 'id']
|
447 | expect(data[0]).include.keys(props)
|
448 | expect(data[0].textMessage).equal(txt)
|
449 | expect(data[0].author).equal(user1)
|
450 | expect(data[0].timestamp).a('Number')
|
451 | expect(data[0].id).equal(2)
|
452 | expect(data[1].id).equal(1)
|
453 | cb()
|
454 | }),
|
455 | cb =>
|
456 | socket1.emit('roomHistoryGet', roomName1, 1, 10, (error, data) => {
|
457 | expect(error).not.ok
|
458 | expect(data).lengthOf(1)
|
459 | expect(data[0].id).equal(2)
|
460 | cb()
|
461 | }),
|
462 | cb =>
|
463 | socket1.emit('roomHistoryGet', roomName1, 2, 10, (error, data) => {
|
464 | expect(error).not.ok
|
465 | expect(data).empty
|
466 | cb()
|
467 | })
|
468 | ], done)
|
469 | })
|
470 | })
|
471 | })
|
472 |
|
473 | it('should sync a history with respect to the limit', function (done) {
|
474 | let txt = 'Test message.'
|
475 | let message = { textMessage: txt }
|
476 | chatService = startService({ historyMaxGetMessages: 2 })
|
477 | chatService.addRoom(roomName1, null, () => {
|
478 | socket1 = clientConnect(user1)
|
479 | series([
|
480 | cb => socket1.on('loginConfirmed',
|
481 | () => socket1.emit('roomJoin', roomName1, cb)),
|
482 | cb => socket1.emit('roomMessage', roomName1, message, cb),
|
483 | cb => socket1.emit('roomMessage', roomName1, message, cb),
|
484 | cb => socket1.emit('roomMessage', roomName1, message, cb)
|
485 | ], error => {
|
486 | expect(error).not.ok
|
487 | parallel([
|
488 | cb =>
|
489 | socket1.emit('roomHistoryGet', roomName1, 0, 10, (error, data) => {
|
490 | expect(error).not.ok
|
491 | expect(data).lengthOf(2)
|
492 | expect(data[0].id).equal(2)
|
493 | expect(data[1].id).equal(1)
|
494 | cb()
|
495 | }),
|
496 | cb =>
|
497 | socket1.emit('roomHistoryGet', roomName1, 1, 10, (error, data) => {
|
498 | expect(error).not.ok
|
499 | expect(data).lengthOf(2)
|
500 | expect(data[0].id).equal(3)
|
501 | expect(data[1].id).equal(2)
|
502 | cb()
|
503 | }),
|
504 | cb =>
|
505 | socket1.emit('roomHistoryGet', roomName1, 2, 10, (error, data) => {
|
506 | expect(error).not.ok
|
507 | expect(data).lengthOf(1)
|
508 | expect(data[0].id).equal(3)
|
509 | cb()
|
510 | }),
|
511 | cb =>
|
512 | socket1.emit('roomHistoryGet', roomName1, 3, 10, (error, data) => {
|
513 | expect(error).not.ok
|
514 | expect(data).empty
|
515 | cb()
|
516 | })
|
517 | ], done)
|
518 | })
|
519 | })
|
520 | })
|
521 |
|
522 | it('should sync a history with respect to a history size', function (done) {
|
523 | let txt = 'Test message.'
|
524 | let message = { textMessage: txt }
|
525 | chatService = startService({ historyMaxSize: 2 })
|
526 | chatService.addRoom(roomName1, null, () => {
|
527 | socket1 = clientConnect(user1)
|
528 | series([
|
529 | cb => socket1.on('loginConfirmed',
|
530 | () => socket1.emit('roomJoin', roomName1, cb)),
|
531 | cb => socket1.emit('roomMessage', roomName1, message, cb),
|
532 | cb => socket1.emit('roomMessage', roomName1, message, cb),
|
533 | cb => socket1.emit('roomMessage', roomName1, message, cb)
|
534 | ], error => {
|
535 | expect(error).not.ok
|
536 | parallel([
|
537 | cb =>
|
538 | socket1.emit('roomHistoryGet', roomName1, 0, 10, (error, data) => {
|
539 | expect(error).not.ok
|
540 | expect(data).lengthOf(2)
|
541 | expect(data[0].id).equal(3)
|
542 | cb()
|
543 | }),
|
544 | cb =>
|
545 | socket1.emit('roomHistoryGet', roomName1, 1, 10, (error, data) => {
|
546 | expect(error).not.ok
|
547 | expect(data).lengthOf(2)
|
548 | expect(data[0].id).equal(3)
|
549 | cb()
|
550 | }),
|
551 | cb =>
|
552 | socket1.emit('roomHistoryGet', roomName1, 2, 10, (error, data) => {
|
553 | expect(error).not.ok
|
554 | expect(data).lengthOf(1)
|
555 | expect(data[0].id).equal(3)
|
556 | cb()
|
557 | }),
|
558 | cb =>
|
559 | socket1.emit('roomHistoryGet', roomName1, 3, 10, (error, data) => {
|
560 | expect(error).not.ok
|
561 | expect(data).empty
|
562 | cb()
|
563 | })
|
564 | ], done)
|
565 | })
|
566 | })
|
567 | })
|
568 |
|
569 | it('should trim history on size changes', function (done) {
|
570 | let txt = 'Test message.'
|
571 | let message = { textMessage: txt }
|
572 | chatService = startService({ historyMaxSize: 2 })
|
573 | socket1 = clientConnect(user1)
|
574 | chatService.addRoom(roomName1, null, () => {
|
575 | series([
|
576 | cb => socket1.on('loginConfirmed',
|
577 | () => socket1.emit('roomJoin', roomName1, cb)),
|
578 | cb => socket1.emit('roomMessage', roomName1, message, cb),
|
579 | cb => socket1.emit('roomMessage', roomName1, message, cb)
|
580 | ], error => {
|
581 | expect(error).not.ok
|
582 | chatService.changeRoomHistoryMaxSize(roomName1, 1, (error, data) => {
|
583 | expect(error).not.ok
|
584 | parallel([
|
585 | cb =>
|
586 | socket1.emit('roomHistoryGet', roomName1, 0, 9, (error, data) => {
|
587 | expect(error).not.ok
|
588 | expect(data).to.be.an('array')
|
589 | expect(data).lengthOf(1)
|
590 | expect(data[0].id).equal(2)
|
591 | cb()
|
592 | }),
|
593 | cb =>
|
594 | socket1.emit('roomHistoryInfo', roomName1, (error, data) => {
|
595 | expect(error).not.ok
|
596 | expect(data).to.be.an('object')
|
597 | expect(data.historySize).equal(1)
|
598 | expect(data.historyMaxSize).equal(1)
|
599 | cb()
|
600 | })
|
601 | ], done)
|
602 | })
|
603 | })
|
604 | })
|
605 | })
|
606 |
|
607 | it('should send and update a room sync info', function (done) {
|
608 | let txt = 'Test message.'
|
609 | let message = { textMessage: txt }
|
610 | chatService = startService()
|
611 | chatService.addRoom(roomName1, null, () => {
|
612 | socket1 = clientConnect(user1)
|
613 | socket1.on('loginConfirmed', () => {
|
614 | socket1.emit('roomJoin', roomName1, () => {
|
615 | socket1.emit('roomHistoryInfo', roomName1, (error, data) => {
|
616 | expect(error).not.ok
|
617 | expect(data).ownProperty('historyMaxGetMessages')
|
618 | expect(data).ownProperty('historyMaxSize')
|
619 | expect(data).ownProperty('historySize')
|
620 | expect(data).ownProperty('lastMessageId')
|
621 | expect(data.lastMessageId).equal(0)
|
622 | expect(data.historySize).equal(0)
|
623 | socket1.emit('roomMessage', roomName1, message, () => {
|
624 | socket1.emit('roomHistoryInfo', roomName1, (error, data) => {
|
625 | expect(error).not.ok
|
626 | expect(data.lastMessageId).equal(1)
|
627 | expect(data.historySize).equal(1)
|
628 | done()
|
629 | })
|
630 | })
|
631 | })
|
632 | })
|
633 | })
|
634 | })
|
635 | })
|
636 |
|
637 | it('should get and update an user seen info', function (done) {
|
638 | chatService = startService()
|
639 | chatService.addRoom(roomName1, null, () => {
|
640 | let ts = new Date().getTime()
|
641 | let tsmax = ts + 2000
|
642 | parallel([
|
643 | cb => {
|
644 | socket1 = clientConnect(user1)
|
645 | socket1.on('loginConfirmed',
|
646 | () => socket1.emit('roomJoin', roomName1, cb))
|
647 | },
|
648 | cb => {
|
649 | socket2 = clientConnect(user2)
|
650 | socket2.on('loginConfirmed',
|
651 | () => socket2.emit('roomJoin', roomName1, cb))
|
652 | }
|
653 | ], error => {
|
654 | expect(error).not.ok
|
655 | socket1.emit('roomUserSeen', roomName1, user2, (error, info1) => {
|
656 | expect(error).not.ok
|
657 | expect(info1).an('object')
|
658 | expect(info1.joined).true
|
659 | expect(info1.timestamp).a('Number')
|
660 | expect(info1.timestamp).within(ts, tsmax)
|
661 | socket2.emit('roomLeave', roomName1, () => {
|
662 | socket1.emit('roomUserSeen', roomName1, user2, (error, info2) => {
|
663 | expect(error).not.ok
|
664 | expect(info2).an('object')
|
665 | expect(info2.joined).false
|
666 | expect(info2.timestamp).a('Number')
|
667 | expect(info2.timestamp).within(ts, tsmax)
|
668 | expect(info2.timestamp).least(info1.timestamp)
|
669 | done()
|
670 | })
|
671 | })
|
672 | })
|
673 | })
|
674 | })
|
675 | })
|
676 |
|
677 | it('should send an empty seen info for unseen users', function (done) {
|
678 | chatService = startService()
|
679 | chatService.addRoom(roomName1, null, () => {
|
680 | socket1 = clientConnect(user1)
|
681 | socket1.on('loginConfirmed', () => {
|
682 | socket1.emit('roomJoin', roomName1, () => {
|
683 | socket1.emit('roomUserSeen', roomName1, user2, (error, info) => {
|
684 | expect(error).not.ok
|
685 | expect(info).an('object')
|
686 | expect(info.joined).false
|
687 | expect(info.timestamp).null
|
688 | done()
|
689 | })
|
690 | })
|
691 | })
|
692 | })
|
693 | })
|
694 |
|
695 | it('should include info in users\' sockets lists', function (done) {
|
696 | chatService = startService()
|
697 | let { sid1, sid2, sid3 } = {}
|
698 | chatService.addRoom(roomName1, null, () => {
|
699 | chatService.addRoom(roomName2, null, () => {
|
700 | parallel([
|
701 | cb => {
|
702 | socket1 = clientConnect(user1)
|
703 | socket1.on('loginConfirmed', (u, data) => {
|
704 | sid1 = data.id
|
705 | socket1.emit('roomJoin', roomName1,
|
706 | () => socket1.emit('roomJoin', roomName2, cb))
|
707 | })
|
708 | },
|
709 | cb => {
|
710 | socket2 = clientConnect(user1)
|
711 | socket2.on('loginConfirmed', (u, data) => {
|
712 | sid2 = data.id
|
713 | socket2.emit('roomJoin', roomName1, cb)
|
714 | })
|
715 | },
|
716 | cb => {
|
717 | socket3 = clientConnect(user1)
|
718 | socket3.on('loginConfirmed', (u, data) => {
|
719 | sid3 = data.id
|
720 | cb()
|
721 | })
|
722 | }
|
723 | ], error => {
|
724 | expect(error).not.ok
|
725 | socket2.emit('listOwnSockets', (error, data) => {
|
726 | expect(error).not.ok
|
727 | expect(data[sid1]).lengthOf(2)
|
728 | expect(data[sid2]).lengthOf(1)
|
729 | expect(data[sid3]).lengthOf(0)
|
730 | expect(data[sid1]).include.members([roomName1, roomName2])
|
731 | expect(data[sid1]).include(roomName1)
|
732 | done()
|
733 | })
|
734 | })
|
735 | })
|
736 | })
|
737 | })
|
738 |
|
739 | it('should send notifications configuration info', function (done) {
|
740 | chatService = startService()
|
741 | let config = {enableAccessListsUpdates: false, enableUserlistUpdates: true}
|
742 | chatService.addRoom(roomName1, config, () => {
|
743 | socket1 = clientConnect(user1)
|
744 | socket1.on('loginConfirmed', () => {
|
745 | socket1.emit('roomJoin', roomName1, () => {
|
746 | socket1.emit('roomNotificationsInfo', roomName1, (error, data) => {
|
747 | expect(error).not.ok
|
748 | expect(data).to.be.an('object')
|
749 | expect(data.enableAccessListsUpdates).false
|
750 | expect(data.enableUserlistUpdates).true
|
751 | done()
|
752 | })
|
753 | })
|
754 | })
|
755 | })
|
756 | })
|
757 |
|
758 | it('should not send notifications on duplicate joins', function (done) {
|
759 | this.timeout(4000)
|
760 | this.slow(2000)
|
761 | chatService = startService()
|
762 | let config = {enableUserlistUpdates: true}
|
763 | chatService.addRoom(roomName1, config, () => parallel([
|
764 | cb => {
|
765 | socket1 = clientConnect(user1)
|
766 | socket1.on('loginConfirmed', () => {
|
767 | socket1.emit('roomJoin', roomName1, cb)
|
768 | })
|
769 | },
|
770 | cb => {
|
771 | socket3 = clientConnect(user2)
|
772 | socket3.on('loginConfirmed', () => {
|
773 | socket3.emit('roomJoin', roomName1, cb)
|
774 | })
|
775 | }
|
776 | ], error => {
|
777 | expect(error).not.ok
|
778 | socket3.on('roomUserJoined', () => done(new Error('Wrong notification')))
|
779 | socket1.emit('roomJoin', roomName1, error => {
|
780 | expect(error).not.ok
|
781 | setTimeout(done, 1000)
|
782 | })
|
783 | }))
|
784 | })
|
785 |
|
786 | it('should not send notifications on non-joined leave', function (done) {
|
787 | this.timeout(4000)
|
788 | this.slow(2000)
|
789 | chatService = startService()
|
790 | let config = {enableUserlistUpdates: true}
|
791 | chatService.addRoom(roomName1, config, () => parallel([
|
792 | cb => {
|
793 | socket2 = clientConnect(user1)
|
794 | socket2.on('loginConfirmed', () => cb())
|
795 | },
|
796 | cb => {
|
797 | socket3 = clientConnect(user2)
|
798 | socket3.on('loginConfirmed', () => {
|
799 | socket3.emit('roomJoin', roomName1, cb)
|
800 | })
|
801 | }
|
802 | ], error => {
|
803 | expect(error).not.ok
|
804 | socket3.on('roomUserLeft', () => done(new Error('Wrong notification')))
|
805 | socket2.emit('roomLeave', roomName1, error => {
|
806 | expect(error).not.ok
|
807 | setTimeout(done, 1000)
|
808 | })
|
809 | }))
|
810 | })
|
811 | }
|