UNPKG

5.99 kBJavaScriptView Raw
1'use strict'
2/* eslint-env mocha */
3
4const { expect } = require('chai')
5
6const { ChatService, cleanup, clientConnect,
7 nextTick, startService } = require('./testutils')
8
9const { cleanupTimeout, user1, roomName1 } = require('./config')
10
11module.exports = function () {
12 let chatService, socket1, socket2, socket3
13
14 afterEach(function (cb) {
15 this.timeout(cleanupTimeout)
16 cleanup(chatService, [socket1, socket2, socket3], cb)
17 chatService = socket1 = socket2 = socket3 = null
18 })
19
20 it('should check state constructor type', function (done) {
21 try {
22 chatService = startService({ state: {} })
23 } catch (error) {
24 expect(error).ok
25 nextTick(done)
26 }
27 })
28
29 it('should check transport constructor type', function (done) {
30 try {
31 chatService = startService({ transport: {} })
32 } catch (error) {
33 expect(error).ok
34 nextTick(done)
35 }
36 })
37
38 it('should check adapter constructor type', function (done) {
39 try {
40 chatService = startService({ adapter: {} })
41 } catch (error) {
42 expect(error).ok
43 nextTick(done)
44 }
45 })
46
47 it('should rollback a failed room join', function (done) {
48 chatService = startService()
49 chatService.addRoom(roomName1, null, () => {
50 socket1 = clientConnect(user1)
51 socket1.on('loginConfirmed', () => {
52 chatService.transport.joinChannel = function () {
53 throw new Error('This is an error mockup for testing.')
54 }
55 socket1.emit('roomJoin', roomName1, error => {
56 expect(error).ok
57 chatService.execUserCommand(
58 true, 'roomGetAccessList', roomName1, 'userlist', (error, data) => {
59 expect(error).not.ok
60 expect(data).an('Array')
61 expect(data).lengthOf(0)
62 done()
63 })
64 })
65 })
66 })
67 })
68
69 it('should rollback a failed socket connect', function (done) {
70 chatService = startService()
71 chatService.transport.joinChannel = function () {
72 throw new Error('This is an error mockup for testing.')
73 }
74 socket1 = clientConnect(user1)
75 socket1.on('loginRejected', error => {
76 expect(error).ok
77 chatService.execUserCommand(user1, 'listOwnSockets', (error, data) => {
78 expect(error).not.ok
79 expect(data).empty
80 done()
81 })
82 })
83 })
84
85 it('should rollback a disconnected socket connection', function (done) {
86 chatService = startService()
87 let orig = chatService.state.addSocket
88 chatService.state.addSocket = function (id) {
89 return orig.apply(chatService.state, arguments)
90 .finally(() => chatService.transport.disconnectSocket(id))
91 }
92 let tst = chatService.transport.rejectLogin
93 chatService.transport.rejectLogin = function () {
94 tst.apply(chatService.transport, arguments)
95 chatService.execUserCommand(user1, 'listOwnSockets', (error, data) => {
96 expect(error).not.ok
97 expect(data).empty
98 done()
99 })
100 }
101 socket1 = clientConnect(user1)
102 })
103
104 it('should not join a disconnected socket', function (done) {
105 chatService = startService()
106 chatService.addRoom(roomName1, null, () => {
107 socket1 = clientConnect(user1)
108 socket1.on('loginConfirmed', () => {
109 chatService.transport.getSocket = function () { return null }
110 socket1.emit('roomJoin', roomName1, (error, data) => {
111 expect(error).ok
112 done()
113 })
114 })
115 })
116 })
117
118 it('should emit closed on onStart hook error', function (done) {
119 let onStart = (chatService, cb) => {
120 expect(chatService).instanceof(ChatService)
121 nextTick(cb, new Error())
122 }
123 chatService = startService(null, { onStart })
124 chatService.on('closed', error => {
125 expect(error).ok
126 done()
127 })
128 })
129
130 it('should propagate transport close errors', function (done) {
131 chatService = startService()
132 let orig = chatService.transport.close
133 chatService.transport.close = function () {
134 return orig.apply(chatService.transport, arguments)
135 .then(() => { throw new Error() })
136 }
137 nextTick(
138 () => chatService.close().catch(error => {
139 expect(error).ok
140 done()
141 }))
142 })
143
144 it('should propagate onClose errors', function (done) {
145 let onClose = (chatService, error, cb) => {
146 expect(chatService).instanceof(ChatService)
147 expect(error).not.ok
148 nextTick(cb, new Error())
149 }
150 chatService = startService(null, { onClose })
151 nextTick(
152 () => chatService.close().catch(error => {
153 expect(error).ok
154 done()
155 }))
156 })
157
158 it('should propagate transport close errors', function (done) {
159 let onClose = (chatService, error, cb) => {
160 expect(error).ok
161 nextTick(cb, error)
162 }
163 chatService = startService(null, { onClose })
164 let orig = chatService.transport.close
165 chatService.transport.close = function () {
166 return orig.apply(chatService.transport, arguments)
167 .then(() => { throw new Error() })
168 }
169 nextTick(
170 () => chatService.close().catch(error => {
171 expect(error).ok
172 done()
173 }))
174 })
175
176 it('should return converted internal error objects', function (done) {
177 let msg
178 let onConnect = (server, id, cb) => {
179 let err = new Error('This is an error mockup for testing.')
180 msg = err.toString()
181 throw err
182 }
183 chatService = startService({useRawErrorObjects: true}, {onConnect})
184 socket1 = clientConnect(user1)
185 socket1.on('loginRejected', e => {
186 expect(e).an.Object
187 expect(e.code).equal('internalError')
188 expect(e.args[0]).equal(msg)
189 done()
190 })
191 })
192
193 it('should support extending ChatServiceError', function (done) {
194 chatService = startService()
195 let ChatServiceError = chatService.ChatServiceError
196 class MyError extends ChatServiceError {}
197 let error = new MyError()
198 expect(error).instanceof(ChatServiceError)
199 expect(error).instanceof(Error)
200 done()
201 })
202}