UNPKG

10.3 kBJavaScriptView Raw
1'use strict'
2/* eslint-env mocha */
3
4const Promise = require('bluebird')
5const { expect } = require('chai')
6
7const { cleanup, clientConnect, closeInstance,
8 nextTick, ChatService, startService } = require('./testutils')
9
10const { cleanupTimeout, user1, user2,
11 roomName1, roomName2 } = require('./config')
12
13module.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 execute onStart hook', function (done) {
23 let onStart = (server, cb) => {
24 expect(server).instanceof(ChatService)
25 server.addRoom(roomName1,
26 { whitelist: [ user1 ], owner: user2 },
27 cb)
28 }
29 chatService = startService(null, {onStart})
30 chatService.on('ready', () => {
31 socket1 = clientConnect(user1)
32 socket1.on('loginConfirmed', () => {
33 socket1.emit('roomJoin', roomName1, () => {
34 socket1.emit(
35 'roomGetAccessList', roomName1, 'whitelist', (error, list) => {
36 expect(error).not.ok
37 expect(list).include(user1)
38 socket1.emit('roomGetOwner', roomName1, (error, data) => {
39 expect(error).not.ok
40 expect(data).equal(user2)
41 done()
42 })
43 })
44 })
45 })
46 })
47 })
48
49 it('should exectute onClose hook', function (done) {
50 let onClose = (server, error, cb) => {
51 expect(server).instanceof(ChatService)
52 expect(error).not.ok
53 nextTick(cb)
54 }
55 let chatService1 = startService(null, {onClose})
56 closeInstance(chatService1).asCallback(done)
57 })
58
59 it('should execute before and after hooks', function (done) {
60 let someData = 'data'
61 let before, after, sid
62 let roomCreateBefore = (execInfo, cb) => {
63 let { server, userName, id, args } = execInfo
64 let [name, mode] = args
65 expect(server).instanceof(ChatService)
66 expect(userName).equal(user1)
67 expect(id).equal(sid)
68 expect(args).instanceof(Array)
69 expect(name).a('string')
70 expect(mode).a('boolean')
71 expect(cb).instanceof(Function)
72 before = true
73 nextTick(cb)
74 }
75 let roomCreateAfter = (execInfo, cb) => {
76 let { server, userName, id, args, results, error } = execInfo
77 let [name, mode] = args
78 expect(server).instanceof(ChatService)
79 expect(userName).equal(user1)
80 expect(id).equal(sid)
81 expect(args).instanceof(Array)
82 expect(name).a('string')
83 expect(mode).a('boolean')
84 expect(results).instanceof(Array)
85 expect(error).null
86 expect(cb).instanceof(Function)
87 after = true
88 nextTick(cb, null, someData)
89 }
90 chatService = startService({ enableRoomsManagement: true },
91 { roomCreateBefore, roomCreateAfter })
92 socket1 = clientConnect(user1)
93 socket1.on('loginConfirmed', (u, data) => {
94 sid = data.id
95 socket1.emit('roomCreate', roomName1, true, (error, data) => {
96 expect(error).not.ok
97 expect(before).true
98 expect(after).true
99 expect(data).equal(someData)
100 done()
101 })
102 })
103 })
104
105 it('should execute hooks using promises api', function (done) {
106 let someData = 'data'
107 let before, after
108 let roomCreateBefore = execInfo => {
109 before = true
110 return Promise.resolve()
111 }
112 let roomCreateAfter = execInfo => {
113 after = true
114 return Promise.resolve(someData)
115 }
116 chatService = startService({ enableRoomsManagement: true },
117 { roomCreateBefore, roomCreateAfter })
118 socket1 = clientConnect(user1)
119 socket1.on('loginConfirmed', () => {
120 socket1.emit('roomCreate', roomName1, true, (error, data) => {
121 expect(error).not.ok
122 expect(before).true
123 expect(after).true
124 expect(data).equal(someData)
125 done()
126 })
127 })
128 })
129
130 it('should execute hooks with sync callbacks', function (done) {
131 let someData = 'data'
132 let before, after
133 let roomCreateBefore = (execInfo, cb) => {
134 before = true
135 cb()
136 }
137 let roomCreateAfter = (execInfo, cb) => {
138 after = true
139 cb(null, someData)
140 }
141 chatService = startService({ enableRoomsManagement: true },
142 { roomCreateBefore, roomCreateAfter })
143 socket1 = clientConnect(user1)
144 socket1.on('loginConfirmed', () => {
145 socket1.emit('roomCreate', roomName1, true, (error, data) => {
146 expect(error).not.ok
147 expect(before).true
148 expect(after).true
149 expect(data).equal(someData)
150 done()
151 })
152 })
153 })
154
155 it('should store commands additional arguments', function (done) {
156 let listOwnSocketsAfter = (execInfo, cb) => {
157 let { restArgs } = execInfo
158 expect(restArgs).instanceof(Array)
159 expect(restArgs).lengthOf(1)
160 expect(restArgs[0]).true
161 nextTick(cb)
162 }
163 chatService = startService(null, {listOwnSocketsAfter})
164 socket1 = clientConnect(user1)
165 socket1.on('loginConfirmed', () => {
166 socket1.emit('listOwnSockets', true, (error, data) => {
167 expect(error).not.ok
168 done()
169 })
170 })
171 })
172
173 it('should support changing arguments in before hooks', function (done) {
174 let roomGetWhitelistModeBefore = (execInfo, cb) => {
175 execInfo.args = [roomName2]
176 nextTick(cb)
177 }
178 chatService = startService({ enableRoomsManagement: true },
179 { roomGetWhitelistModeBefore })
180 socket1 = clientConnect(user1)
181 socket1.on('loginConfirmed', () => {
182 socket1.emit('roomCreate', roomName2, false, () => {
183 socket1.emit('roomCreate', roomName1, true, () => {
184 socket1.emit('roomGetWhitelistMode', roomName1, (error, data) => {
185 expect(error).not.ok
186 expect(data).false
187 done()
188 })
189 })
190 })
191 })
192 })
193
194 it('should support additional values from after hooks', function (done) {
195 let listOwnSocketsAfter = (execInfo, cb) =>
196 nextTick(cb, null, ...execInfo.results, true)
197 chatService = startService(null, { listOwnSocketsAfter })
198 socket1 = clientConnect(user1)
199 socket1.on('loginConfirmed', (u, data) => {
200 let sid = data.id
201 socket1.emit('listOwnSockets', (error, data, moredata) => {
202 expect(error).not.ok
203 expect(data[sid]).exits
204 expect(data[sid]).empty
205 expect(moredata).true
206 done()
207 })
208 })
209 })
210
211 it('should execute onDisconnect hook', function (done) {
212 let onDisconnect = (server, id, cb) => {
213 expect(server).instanceof(ChatService)
214 expect(id).a.string
215 nextTick(cb)
216 nextTick(done)
217 }
218 let chatService1 = startService(null, { onDisconnect })
219 socket1 = clientConnect(user1)
220 socket1.on('loginConfirmed', () => chatService1.close())
221 })
222
223 it('should stop commands if before hook returns a data', function (done) {
224 let val = 'asdf'
225 let listOwnSocketsBefore = (execInfo, cb) => nextTick(cb, null, val)
226 chatService = startService(null, { listOwnSocketsBefore })
227 socket1 = clientConnect(user1)
228 socket1.on('loginConfirmed', () => {
229 socket1.emit('listOwnSockets', (error, data) => {
230 expect(error).null
231 expect(data).equal(val)
232 done()
233 })
234 })
235 })
236
237 it('should accept custom direct messages using a hook', function (done) {
238 let html = '<b>HTML message.</b>'
239 let message = { htmlMessage: html }
240 let directMessagesChecker = (msg, cb) => nextTick(cb)
241 chatService =
242 startService({ enableDirectMessages: true }, { directMessagesChecker })
243 socket1 = clientConnect(user1)
244 socket1.on('loginConfirmed', () => {
245 socket2 = clientConnect(user2)
246 socket2.on('loginConfirmed', () => {
247 socket1.emit('directMessage', user2, message)
248 socket2.on('directMessage', msg => {
249 expect(msg).include.keys('htmlMessage', 'author', 'timestamp')
250 expect(msg.htmlMessage).equal(html)
251 expect(msg.author).equal(user1)
252 expect(msg.timestamp).a('Number')
253 done()
254 })
255 })
256 })
257 })
258
259 it('should accept custom room messages using a hook', function (done) {
260 let html = '<b>HTML message.</b>'
261 let message = { htmlMessage: html }
262 let roomMessagesChecker = (msg, cb) => nextTick(cb)
263 chatService = startService(null, { roomMessagesChecker })
264 chatService.addRoom(roomName1, null, () => {
265 socket1 = clientConnect(user1)
266 socket1.on('loginConfirmed', () => {
267 socket1.emit('roomJoin', roomName1, () => {
268 socket1.emit('roomMessage', roomName1, message)
269 socket1.on('roomMessage', (room, msg) => {
270 expect(room).equal(roomName1)
271 expect(msg).include.keys('htmlMessage', 'author', 'timestamp', 'id')
272 expect(msg.htmlMessage).equal(html)
273 expect(msg.author).equal(user1)
274 expect(msg.timestamp).a('Number')
275 expect(msg.id).equal(1)
276 done()
277 })
278 })
279 })
280 })
281 })
282
283 it('should correctly send room messages with a binary data', function (done) {
284 let data = new Buffer([5])
285 let message = { data }
286 let roomMessagesChecker = (msg, cb) => nextTick(cb)
287 chatService = startService(null, { roomMessagesChecker })
288 chatService.addRoom(roomName1, null, () => {
289 socket1 = clientConnect(user1)
290 socket1.on('loginConfirmed', () => {
291 socket1.emit('roomJoin', roomName1, () => {
292 socket1.emit('roomMessage', roomName1, message)
293 socket1.on('roomMessage', (room, msg) => {
294 expect(room).equal(roomName1)
295 expect(msg).include.keys('data', 'author', 'timestamp', 'id')
296 expect(msg.data).deep.equal(data)
297 expect(msg.author).equal(user1)
298 expect(msg.timestamp).a('Number')
299 expect(msg.id).equal(1)
300 socket1.emit('roomRecentHistory', roomName1, (error, data) => {
301 expect(error).not.ok
302 expect(data[0]).deep.equal(msg)
303 done()
304 })
305 })
306 })
307 })
308 })
309 })
310}