UNPKG

4.86 kBJavaScriptView Raw
1'use strict'
2/* eslint-env mocha */
3
4const { expect } = require('chai')
5
6const { ChatService, cleanup, clientConnect,
7 nextTick, parallel, startService } = require('./testutils')
8
9const { cleanupTimeout, user1 } = 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 send auth data with an id field', function (done) {
21 chatService = startService()
22 socket1 = clientConnect(user1)
23 socket1.on('loginConfirmed', (u, data) => {
24 expect(u).equal(user1)
25 expect(data).include.keys('id')
26 done()
27 })
28 })
29
30 it('should reject an empty user query', function (done) {
31 chatService = startService()
32 socket1 = clientConnect()
33 socket1.on('loginRejected', () => done())
34 })
35
36 it('should reject user names with illegal characters', function (done) {
37 chatService = startService()
38 socket1 = clientConnect('user}1')
39 socket1.on('loginRejected', () => done())
40 })
41
42 it('should execute socket.io middleware', function (done) {
43 let reason = 'some error'
44 let auth = (socket, cb) => nextTick(cb, new Error(reason))
45 chatService = startService({ transportOptions: {middleware: auth} })
46 socket1 = clientConnect()
47 socket1.on('error', e => {
48 expect(e).deep.equal(reason)
49 done()
50 })
51 })
52
53 it('should store and return a handshake data', function (done) {
54 let onConnect = (server, id, cb) => {
55 let data = server.transport.getHandshakeData(id)
56 expect(data).an('Object')
57 expect(data.isConnected).true
58 expect(data.query.user).equal(user1)
59 nextTick(cb)
60 }
61 chatService = startService(null, {onConnect})
62 socket1 = clientConnect(user1)
63 socket1.on('loginConfirmed', () => {
64 let data = chatService.transport.getHandshakeData('id')
65 expect(data).an('Object')
66 expect(data.isConnected).false
67 done()
68 })
69 })
70
71 it('should use an username and a data passed by onConnect', function (done) {
72 let name = 'someUser'
73 let data = { token: 'token' }
74 let onConnect = (server, id, cb) => {
75 expect(server).instanceof(ChatService)
76 expect(id).a('string')
77 nextTick(cb, null, name, data)
78 }
79 chatService = startService(null, {onConnect})
80 socket1 = clientConnect(user1)
81 socket1.on('loginConfirmed', (u, d) => {
82 expect(u).equal(name)
83 expect(d).include.keys('id')
84 expect(d.token).equal(data.token)
85 done()
86 })
87 })
88
89 it('should reject a login if onConnect passes an error', function (done) {
90 let err
91 let onConnect = (server, id, cb) => {
92 expect(server).instanceof(ChatService)
93 expect(id).a('string')
94 err = new ChatService.ChatServiceError('some error')
95 throw err
96 }
97 chatService = startService(null, {onConnect})
98 socket1 = clientConnect(user1)
99 socket1.on('loginRejected', e => {
100 expect(e).deep.equal(err.toString())
101 done()
102 })
103 })
104
105 it('should support multiple sockets per user', function (done) {
106 chatService = startService()
107 socket1 = clientConnect(user1)
108 socket1.on('loginConfirmed', () => {
109 socket2 = clientConnect(user1)
110 let sid2, sid2e
111 parallel([
112 cb => socket1.on('socketConnectEcho', (id, nconnected) => {
113 sid2e = id
114 expect(nconnected).equal(2)
115 cb()
116 }),
117 cb => socket2.on('loginConfirmed', (u, data) => {
118 sid2 = data.id
119 cb()
120 })
121 ], () => {
122 expect(sid2e).equal(sid2)
123 socket2.disconnect()
124 socket1.on('socketDisconnectEcho', (id, nconnected) => {
125 expect(id).equal(sid2)
126 expect(nconnected).equal(1)
127 done()
128 })
129 })
130 })
131 })
132
133 it('should disconnect all users on a server shutdown', function (done) {
134 let chatService1 = startService()
135 socket1 = clientConnect(user1)
136 socket1.on('loginConfirmed', () => parallel([
137 cb => chatService1.close(cb),
138 cb => socket1.on('disconnect', () => cb())
139 ], done))
140 })
141
142 it('should be able to get instance sockets', function (done) {
143 chatService = startService()
144 socket1 = clientConnect(user1)
145 socket1.on('loginConfirmed', (name, { id }) => parallel([
146 cb => chatService.state.getInstanceSockets().asCallback(cb),
147 cb => chatService.state.getInstanceSockets(chatService.instanceUID)
148 .asCallback(cb)
149 ], (error, [ s1, s2 ]) => {
150 expect(error).not.ok
151 expect(s1).an('Object')
152 expect(s2).an('Object')
153 expect(Object.keys(s1)).lengthOf(1)
154 expect(Object.keys(s2)).lengthOf(1)
155 expect(s1).property(id, user1)
156 expect(s2).property(id, user1)
157 done()
158 }))
159 })
160}