UNPKG

15.2 kBJavaScriptView Raw
1'use strict'
2/* eslint-env mocha */
3/* eslint-disable no-unused-expressions */
4
5const Buffer = require('safe-buffer').Buffer
6const Promise = require('bluebird')
7const { expect } = require('chai')
8
9const { cleanup, clientConnect, parallel, closeInstance,
10 ChatService, startService } = require('./testutils')
11
12const { cleanupTimeout, user1, user2,
13 roomName1, roomName2 } = require('./config')
14
15module.exports = function () {
16 let chatService, socket1, socket2, socket3
17
18 afterEach(function (cb) {
19 this.timeout(cleanupTimeout)
20 cleanup(chatService, [socket1, socket2, socket3], cb)
21 chatService = socket1 = socket2 = socket3 = null
22 })
23
24 it('should execute onStart hook', function (done) {
25 let onStart = (server, cb) => {
26 expect(server).instanceof(ChatService)
27 server.addRoom(
28 roomName1, { whitelist: [ user1 ], owner: user2 }, cb)
29 }
30 chatService = startService(null, {onStart})
31 chatService.on('ready', () => {
32 socket1 = clientConnect(user1)
33 socket1.on('loginConfirmed', () => {
34 socket1.emit('roomJoin', roomName1, () => {
35 socket1.emit(
36 'roomGetAccessList', roomName1, 'whitelist', (error, list) => {
37 expect(error).not.ok
38 expect(list).include(user1)
39 socket1.emit('roomGetOwner', roomName1, (error, data) => {
40 expect(error).not.ok
41 expect(data).equal(user2)
42 done()
43 })
44 })
45 })
46 })
47 })
48 })
49
50 it('should exectute onClose hook', function (done) {
51 let onClose = (server, error, cb) => {
52 expect(server).instanceof(ChatService)
53 expect(error).not.ok
54 cb()
55 }
56 let chatService1 = startService(null, {onClose})
57 chatService1.on('ready', () => {
58 closeInstance(chatService1).asCallback(done)
59 })
60 })
61
62 it('should execute before and after hooks', function (done) {
63 let someData = 'data'
64 let before, after, sid
65 let roomCreateBefore = (execInfo, cb) => {
66 let { server, userName, id, args } = execInfo
67 let [name, mode] = args
68 expect(server).instanceof(ChatService)
69 expect(userName).equal(user1)
70 expect(id).equal(sid)
71 expect(args).instanceof(Array)
72 expect(name).a('string')
73 expect(mode).a('boolean')
74 expect(cb).instanceof(Function)
75 before = true
76 process.nextTick(cb)
77 }
78 let roomCreateAfter = (execInfo, cb) => {
79 let { server, userName, id, args, results, error } = execInfo
80 let [name, mode] = args
81 expect(server).instanceof(ChatService)
82 expect(userName).equal(user1)
83 expect(id).equal(sid)
84 expect(args).instanceof(Array)
85 expect(name).a('string')
86 expect(mode).a('boolean')
87 expect(results).instanceof(Array)
88 expect(error).null
89 expect(cb).instanceof(Function)
90 after = true
91 process.nextTick(cb, null, someData)
92 }
93 chatService = startService({ enableRoomsManagement: true },
94 { roomCreateBefore, roomCreateAfter })
95 socket1 = clientConnect(user1)
96 socket1.on('loginConfirmed', (u, data) => {
97 sid = data.id
98 socket1.emit('roomCreate', roomName1, true, (error, data) => {
99 expect(error).not.ok
100 expect(before).true
101 expect(after).true
102 expect(data).equal(someData)
103 done()
104 })
105 })
106 })
107
108 it('should execute hooks using promises api', function (done) {
109 let someData = 'data'
110 let before, after
111 let roomCreateBefore = execInfo => {
112 before = true
113 return Promise.resolve()
114 }
115 let roomCreateAfter = execInfo => {
116 after = true
117 return Promise.resolve(someData)
118 }
119 chatService = startService({ enableRoomsManagement: true },
120 { roomCreateBefore, roomCreateAfter })
121 socket1 = clientConnect(user1)
122 socket1.on('loginConfirmed', () => {
123 socket1.emit('roomCreate', roomName1, true, (error, data) => {
124 expect(error).not.ok
125 expect(before).true
126 expect(after).true
127 expect(data).equal(someData)
128 done()
129 })
130 })
131 })
132
133 it('should execute hooks with sync callbacks', function (done) {
134 let someData = 'data'
135 let before, after
136 let roomCreateBefore = (execInfo, cb) => {
137 before = true
138 cb()
139 }
140 let roomCreateAfter = (execInfo, cb) => {
141 after = true
142 cb(null, someData)
143 }
144 chatService = startService({ enableRoomsManagement: true },
145 { roomCreateBefore, roomCreateAfter })
146 socket1 = clientConnect(user1)
147 socket1.on('loginConfirmed', () => {
148 socket1.emit('roomCreate', roomName1, true, (error, data) => {
149 expect(error).not.ok
150 expect(before).true
151 expect(after).true
152 expect(data).equal(someData)
153 done()
154 })
155 })
156 })
157
158 it('should store commands additional arguments', function (done) {
159 let listOwnSocketsAfter = (execInfo, cb) => {
160 let { restArgs } = execInfo
161 expect(restArgs).instanceof(Array)
162 expect(restArgs).lengthOf(1)
163 expect(restArgs[0]).true
164 process.nextTick(cb)
165 }
166 chatService = startService(null, {listOwnSocketsAfter})
167 socket1 = clientConnect(user1)
168 socket1.on('loginConfirmed', () => {
169 socket1.emit('listOwnSockets', true, (error, data) => {
170 expect(error).not.ok
171 done()
172 })
173 })
174 })
175
176 it('should support changing arguments in before hooks', function (done) {
177 let roomGetWhitelistModeBefore = (execInfo, cb) => {
178 execInfo.args = [roomName2]
179 process.nextTick(cb)
180 }
181 chatService = startService({ enableRoomsManagement: true },
182 { roomGetWhitelistModeBefore })
183 socket1 = clientConnect(user1)
184 socket1.on('loginConfirmed', () => {
185 socket1.emit('roomCreate', roomName2, false, () => {
186 socket1.emit('roomCreate', roomName1, true, () => {
187 socket1.emit('roomGetWhitelistMode', roomName1, (error, data) => {
188 expect(error).not.ok
189 expect(data).false
190 done()
191 })
192 })
193 })
194 })
195 })
196
197 it('should support additional values from after hooks', function (done) {
198 let listOwnSocketsAfter = (execInfo, cb) =>
199 process.nextTick(cb, null, execInfo.results[0], true)
200 chatService = startService(null, { listOwnSocketsAfter })
201 socket1 = clientConnect(user1)
202 socket1.on('loginConfirmed', (u, data) => {
203 let sid = data.id
204 socket1.emit('listOwnSockets', (error, data, moredata) => {
205 expect(error).not.ok
206 expect(data[sid]).empty
207 expect(moredata).true
208 done()
209 })
210 })
211 })
212
213 it('should execute onDisconnect hook', function (done) {
214 let onDisconnect = (server, data, cb) => {
215 process.nextTick(() => {
216 expect(server).instanceof(ChatService)
217 expect(data).to.be.an('object')
218 expect(data.id).to.be.a('string')
219 expect(data.nconnected).to.be.a('number')
220 expect(data.roomsRemoved).to.be.an('array')
221 expect(data.joinedSockets).to.be.an('array')
222 done()
223 })
224 process.nextTick(cb)
225 }
226 let chatService1 = startService(null, { onDisconnect })
227 socket1 = clientConnect(user1)
228 socket1.on('loginConfirmed', () => chatService1.close())
229 })
230
231 it('should execute onJoin hook', function (done) {
232 let isRun = false
233 let onJoin = (server, data, cb) => {
234 process.nextTick(() => {
235 if (!isRun) {
236 expect(server).instanceof(ChatService)
237 expect(data).to.be.an('object')
238 expect(data.id).to.be.a('string')
239 expect(data.njoined).eql(1)
240 expect(data.roomName).equal(roomName1)
241 isRun = true
242 }
243 })
244 cb()
245 }
246 chatService = startService(null, { onJoin })
247 chatService.addRoom(roomName1, null, () => {
248 socket1 = clientConnect(user1)
249 socket1.on('loginConfirmed', () => {
250 socket1.emit('roomJoin', roomName1, () => {
251 expect(isRun).true
252 done()
253 })
254 })
255 })
256 })
257
258 it('should emit lock exceed with onJoin hook', function (done) {
259 this.timeout(4000)
260 this.slow(2000)
261 let isRun = false
262 let onJoin = (server, data, cb) => {
263 if (!isRun) {
264 isRun = true
265 setTimeout(cb, 1000)
266 } else {
267 cb()
268 }
269 }
270 chatService = startService({stateOptions: {lockTTL: 500}}, { onJoin })
271 chatService.addRoom(roomName1, null, () => {
272 socket1 = clientConnect(user1)
273 socket1.on('loginConfirmed', () => {
274 parallel([
275 cb => {
276 socket1.emit('roomJoin', roomName1, cb)
277 },
278 cb => {
279 chatService.on('lockTimeExceeded', () => cb())
280 }], done)
281 })
282 })
283 })
284
285 it('should execute onLeave hook when leaving', function (done) {
286 let isRun = false
287 let onLeave = (server, data, cb) => {
288 process.nextTick(() => {
289 if (!isRun) {
290 expect(server).instanceof(ChatService)
291 expect(data).to.be.an('object')
292 expect(data.id).to.be.a('string')
293 expect(data.njoined).eql(0)
294 expect(data.roomName).equal(roomName1)
295 isRun = true
296 }
297 cb()
298 })
299 }
300 chatService = startService(null, { onLeave })
301 chatService.addRoom(roomName1, null, () => {
302 socket1 = clientConnect(user1)
303 socket1.on('loginConfirmed', () => {
304 socket1.emit('roomJoin', roomName1, () => {
305 socket1.emit('roomLeave', roomName1, () => {
306 expect(isRun).true
307 done()
308 })
309 })
310 })
311 })
312 })
313
314 it('should execute onLeave hook when disconnecting', function (done) {
315 let isRun = false
316 let id
317 let onLeave = (server, data, cb) => {
318 process.nextTick(() => {
319 if (!isRun) {
320 expect(server).instanceof(ChatService)
321 expect(data).to.be.an('object')
322 expect(data.id).to.be.a('string')
323 expect(data.id).eql(id)
324 expect(data.njoined).eql(1)
325 expect(data.roomName).equal(roomName1)
326 isRun = true
327 }
328 })
329 cb()
330 }
331 chatService = startService(null, { onLeave })
332 chatService.addRoom(roomName1, null, () => {
333 socket1 = clientConnect(user1)
334 socket1.on('loginConfirmed', (userName, data) => {
335 id = data.id
336 socket1.emit('roomJoin', roomName1, () => {
337 socket2 = clientConnect(user1)
338 socket2.on('loginConfirmed', () => {
339 socket2.emit('roomJoin', roomName1, () => {
340 socket1.disconnect()
341 socket2.on('socketDisconnectEcho', () => {
342 expect(isRun).true
343 done()
344 })
345 })
346 })
347 })
348 })
349 })
350 })
351
352 it('should execute onLeave hook when removing', function (done) {
353 let isRun = false
354 let id
355 let onLeave = (server, data, cb) => {
356 process.nextTick(() => {
357 if (!isRun) {
358 expect(server).instanceof(ChatService)
359 expect(data).to.be.an('object')
360 expect(data.id).to.be.a('string')
361 expect(data.id).eql(id)
362 expect(data.njoined).eql(0)
363 expect(data.roomName).equal(roomName1)
364 isRun = true
365 }
366 })
367 cb()
368 }
369 chatService = startService(null, { onLeave })
370 chatService.addRoom(roomName1, {owner: user2}, () => {
371 socket1 = clientConnect(user1)
372 socket1.on('loginConfirmed', (userName, data) => {
373 id = data.id
374 socket1.emit('roomJoin', roomName1, () => {
375 socket2 = clientConnect(user2)
376 socket2.on('loginConfirmed', () => {
377 socket2.emit('roomAddToList', roomName1, 'blacklist', [user1])
378 socket1.on('roomAccessRemoved', (roomName) => {
379 expect(roomName).eql(roomName1)
380 expect(isRun).true
381 done()
382 })
383 })
384 })
385 })
386 })
387 })
388
389 it('should stop commands if before hook returns a data', function (done) {
390 let val = 'asdf'
391 let listOwnSocketsBefore = (execInfo, cb) => process.nextTick(cb, null, val)
392 chatService = startService(null, { listOwnSocketsBefore })
393 socket1 = clientConnect(user1)
394 socket1.on('loginConfirmed', () => {
395 socket1.emit('listOwnSockets', (error, data) => {
396 expect(error).null
397 expect(data).equal(val)
398 done()
399 })
400 })
401 })
402
403 it('should accept custom direct messages using a hook', function (done) {
404 let html = '<b>HTML message.</b>'
405 let message = { htmlMessage: html }
406 let directMessagesChecker = (msg, cb) => process.nextTick(cb)
407 chatService =
408 startService({ enableDirectMessages: true }, { directMessagesChecker })
409 socket1 = clientConnect(user1)
410 socket1.on('loginConfirmed', () => {
411 socket2 = clientConnect(user2)
412 socket2.on('loginConfirmed', () => {
413 socket1.emit('directMessage', user2, message)
414 socket2.on('directMessage', msg => {
415 expect(msg).include.keys('htmlMessage', 'author', 'timestamp')
416 expect(msg.htmlMessage).equal(html)
417 expect(msg.author).equal(user1)
418 expect(msg.timestamp).a('Number')
419 done()
420 })
421 })
422 })
423 })
424
425 it('should accept custom room messages using a hook', function (done) {
426 let html = '<b>HTML message.</b>'
427 let message = { htmlMessage: html }
428 let roomMessagesChecker = (msg, cb) => process.nextTick(cb)
429 chatService = startService(null, { roomMessagesChecker })
430 chatService.addRoom(roomName1, null, () => {
431 socket1 = clientConnect(user1)
432 socket1.on('loginConfirmed', () => {
433 socket1.emit('roomJoin', roomName1, () => {
434 socket1.emit('roomMessage', roomName1, message)
435 socket1.on('roomMessage', (room, msg) => {
436 expect(room).equal(roomName1)
437 expect(msg).include.keys('htmlMessage', 'author', 'timestamp', 'id')
438 expect(msg.htmlMessage).equal(html)
439 expect(msg.author).equal(user1)
440 expect(msg.timestamp).a('Number')
441 expect(msg.id).equal(1)
442 done()
443 })
444 })
445 })
446 })
447 })
448
449 it('should correctly send room messages with a binary data', function (done) {
450 let data = Buffer.from([5])
451 let message = { data }
452 let roomMessagesChecker = (msg, cb) => process.nextTick(cb)
453 chatService = startService(null, { roomMessagesChecker })
454 chatService.addRoom(roomName1, null, () => {
455 socket1 = clientConnect(user1)
456 socket1.on('loginConfirmed', () => {
457 socket1.emit('roomJoin', roomName1, () => {
458 socket1.emit('roomMessage', roomName1, message)
459 socket1.on('roomMessage', (room, msg) => {
460 expect(room).equal(roomName1)
461 expect(msg).include.keys('data', 'author', 'timestamp', 'id')
462 expect(msg.data).deep.equal(data)
463 expect(msg.author).equal(user1)
464 expect(msg.timestamp).a('Number')
465 expect(msg.id).equal(1)
466 socket1.emit('roomRecentHistory', roomName1, (error, data) => {
467 expect(error).not.ok
468 expect(data[0]).deep.equal(msg)
469 done()
470 })
471 })
472 })
473 })
474 })
475 })
476}