1 | 'use strict'
|
2 |
|
3 |
|
4 | const { expect } = require('chai')
|
5 |
|
6 | const { ChatService, cleanup, clientConnect,
|
7 | nextTick, startService } = require('./testutils')
|
8 |
|
9 | const { cleanupTimeout, user1, roomName1 } = require('./config')
|
10 |
|
11 | module.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 | }
|