1 | 'use strict'
|
2 |
|
3 |
|
4 | const Promise = require('bluebird')
|
5 | const { expect } = require('chai')
|
6 |
|
7 | const { cleanup, clientConnect, closeInstance,
|
8 | nextTick, ChatService, 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 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 | }
|