Skip to content

Commit 6ebec42

Browse files
enhance ws connection, add ws closures
1 parent 395c57b commit 6ebec42

5 files changed

Lines changed: 53 additions & 24 deletions

File tree

apps/meteor/tests/data/livechat/department.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,9 @@ export const createDepartmentWithAnAwayAgent = async ({
175175
credentials: Credentials;
176176
user: WithRequiredProperty<IUser, 'username'>;
177177
};
178+
ws: WebSocket;
178179
}> => {
179-
const { user, credentials } = await createAnAwayAgent();
180+
const { user, credentials, ws } = await createAnAwayAgent();
180181

181182
const department = (await createDepartment({
182183
allowReceiveForwardOffline,
@@ -192,6 +193,7 @@ export const createDepartmentWithAnAwayAgent = async ({
192193
credentials,
193194
user,
194195
},
196+
ws,
195197
};
196198
};
197199

apps/meteor/tests/data/livechat/users.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export const createAnOfflineAgent = async (): Promise<{
9393
export const createAnAwayAgent = async (): Promise<{
9494
credentials: Credentials;
9595
user: IUser & { username: string };
96+
ws: WebSocket;
9697
}> => {
9798
const username = `user.test.${Date.now()}.away`;
9899
const email = `${username}.offline@rocket.chat`;
@@ -108,6 +109,7 @@ export const createAnAwayAgent = async (): Promise<{
108109
return {
109110
credentials: createdUserCredentials,
110111
user: agent,
112+
ws,
111113
};
112114
};
113115

apps/meteor/tests/data/users.helper.ts

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -175,35 +175,26 @@ export const setUserAway = (overrideCredentials = credentials, config?: IRequest
175175
export const ddpLogin = (resume: string): Promise<WebSocket> =>
176176
new Promise((resolve, reject) => {
177177
const ws = new WebSocket('ws://localhost:4000/websocket');
178+
const loginId = `login-${Date.now()}-${Math.random()}`;
178179

179-
ws.onopen = () => {
180-
ws.send(
181-
JSON.stringify({
182-
msg: 'connect',
183-
version: '1',
184-
support: ['1'],
185-
}),
186-
);
187-
};
188-
189-
ws.onmessage = (event) => {
180+
const handler = (event: MessageEvent) => {
190181
const data = JSON.parse(event.data);
191182

192183
switch (data.msg) {
193184
case 'connected':
194185
ws.send(
195186
JSON.stringify({
196187
msg: 'method',
197-
id: 'login-1',
188+
id: loginId,
198189
method: 'login',
199190
params: [{ resume }],
200191
}),
201192
);
202193
break;
203194

204195
case 'result':
205-
if (data.id === 'login-1') {
206-
// NO cerrar el websocket
196+
if (data.id === loginId) {
197+
ws.removeEventListener('message', handler);
207198
resolve(ws);
208199
}
209200
break;
@@ -213,17 +204,30 @@ export const ddpLogin = (resume: string): Promise<WebSocket> =>
213204
break;
214205

215206
case 'error':
207+
ws.removeEventListener('message', handler);
216208
reject(data);
217209
break;
218210
}
219211
};
220212

213+
ws.addEventListener('message', handler);
214+
215+
ws.onopen = () => {
216+
ws.send(
217+
JSON.stringify({
218+
msg: 'connect',
219+
version: '1',
220+
support: ['1'],
221+
}),
222+
);
223+
};
224+
221225
ws.onerror = reject;
222226
});
223227

224228
export const setUserAwayWS = (ws: WebSocket): Promise<void> =>
225229
new Promise((resolve, reject) => {
226-
const id = 'away-1';
230+
const id = `away-${Date.now()}-${Math.random()}`;
227231

228232
const handler = (event: MessageEvent) => {
229233
const data = JSON.parse(event.data);

apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,7 +1547,7 @@ describe('LIVECHAT - rooms', () => {
15471547
await updateSetting('Livechat_Routing_Method', 'Manual_Selection');
15481548
await updateSetting('Livechat_enabled_when_agent_idle', false);
15491549
const { department: initialDepartment } = await createDepartmentWithAnOnlineAgent();
1550-
const { department: forwardToOfflineDepartment } = await createDepartmentWithAnAwayAgent({
1550+
const { department: forwardToOfflineDepartment, ws } = await createDepartmentWithAnAwayAgent({
15511551
allowReceiveForwardOffline: true,
15521552
});
15531553

@@ -1582,6 +1582,8 @@ describe('LIVECHAT - rooms', () => {
15821582
expect(res.body).to.have.property('count');
15831583
});
15841584

1585+
ws.close();
1586+
15851587
await Promise.all([
15861588
deleteDepartment(initialDepartment._id),
15871589
deleteDepartment(forwardToOfflineDepartment._id),
@@ -1675,7 +1677,7 @@ describe('LIVECHAT - rooms', () => {
16751677
async () => {
16761678
await updateSetting('Livechat_Routing_Method', 'Auto_Selection');
16771679
const { department: initialDepartment } = await createDepartmentWithAnOnlineAgent();
1678-
const { department: forwardToOfflineDepartment } = await createDepartmentWithAnAwayAgent({ allowReceiveForwardOffline: true });
1680+
const { department: forwardToOfflineDepartment, ws } = await createDepartmentWithAnAwayAgent({ allowReceiveForwardOffline: true });
16791681

16801682
const newVisitor = await createVisitor(initialDepartment._id);
16811683
const newRoom = await createLivechatRoom(newVisitor.token);
@@ -1698,6 +1700,8 @@ describe('LIVECHAT - rooms', () => {
16981700
expect(inquiry.status).to.equal('queued');
16991701
expect(inquiry.department).to.equal(forwardToOfflineDepartment._id);
17001702

1703+
ws.close();
1704+
17011705
await Promise.all([
17021706
deleteDepartment(initialDepartment._id),
17031707
deleteDepartment(forwardToOfflineDepartment._id),
@@ -1714,7 +1718,7 @@ describe('LIVECHAT - rooms', () => {
17141718
async () => {
17151719
await updateSetting('Livechat_Routing_Method', 'Auto_Selection');
17161720
const { department: initialDepartment } = await createDepartmentWithAnOnlineAgent();
1717-
const { department: forwardToOfflineDepartment } = await createDepartmentWithAnAwayAgent({ allowReceiveForwardOffline: false });
1721+
const { department: forwardToOfflineDepartment, ws } = await createDepartmentWithAnAwayAgent({ allowReceiveForwardOffline: false });
17181722

17191723
const newVisitor = await createVisitor(initialDepartment._id);
17201724
const newRoom = await createLivechatRoom(newVisitor.token);
@@ -1735,6 +1739,8 @@ describe('LIVECHAT - rooms', () => {
17351739
expect(res.status).to.equal(400);
17361740
expect(res.body).to.have.property('error', 'error-no-agents-available-for-service-on-department');
17371741

1742+
ws.close();
1743+
17381744
await Promise.all([
17391745
deleteDepartment(initialDepartment._id),
17401746
deleteDepartment(forwardToOfflineDepartment._id),
@@ -1791,7 +1797,11 @@ describe('LIVECHAT - rooms', () => {
17911797
await updateSetting('Livechat_Routing_Method', 'Auto_Selection');
17921798
await updateSetting('Livechat_enabled_when_agent_idle', true);
17931799
const { department: initialDepartment } = await createDepartmentWithAnOnlineAgent();
1794-
const { department: forwardToOfflineDepartment, agent } = await createDepartmentWithAnAwayAgent({
1800+
const {
1801+
department: forwardToOfflineDepartment,
1802+
agent,
1803+
ws,
1804+
} = await createDepartmentWithAnAwayAgent({
17951805
allowReceiveForwardOffline: true,
17961806
});
17971807

@@ -1814,6 +1824,8 @@ describe('LIVECHAT - rooms', () => {
18141824
expect(roomInfo.servedBy).to.have.property('_id', agent.user._id);
18151825
expect(roomInfo.departmentId).to.be.equal(forwardToOfflineDepartment._id);
18161826

1827+
ws.close();
1828+
18171829
await Promise.all([
18181830
deleteDepartment(initialDepartment._id),
18191831
deleteDepartment(forwardToOfflineDepartment._id),

apps/meteor/tests/end-to-end/api/livechat/24-routing.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ import { IS_EE } from '../../../e2e/config/constants';
227227
let testUser3: { user: IUser; credentials: Credentials };
228228
let testDepartment: ILivechatDepartment;
229229
let visitorEmail: string;
230+
const sockets: WebSocket[] = [];
230231

231232
before(async () => {
232233
const user = await createUser();
@@ -280,14 +281,20 @@ import { IS_EE } from '../../../e2e/config/constants';
280281
});
281282
});
282283

283-
after(async () =>
284-
Promise.all([
284+
after(async () => {
285+
await Promise.all([
285286
deleteUser(testUser.user),
286287
deleteUser(testUser2.user),
287288
deleteUser(testUser3.user),
288289
updateSetting('Livechat_enabled_when_agent_idle', true),
289-
]),
290-
);
290+
]);
291+
292+
for (const ws of sockets) {
293+
if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
294+
ws.close();
295+
}
296+
}
297+
});
291298

292299
it('should route a room to an available agent', async () => {
293300
const visitor = await createVisitor(testDepartment._id);
@@ -370,9 +377,11 @@ import { IS_EE } from '../../../e2e/config/constants';
370377
await updateSetting('Livechat_enabled_when_agent_idle', false);
371378
await setUserStatus(testUser.credentials, UserStatus.AWAY);
372379
const ws1 = await ddpLogin(testUser.credentials['X-Auth-Token']);
380+
sockets.push(ws1);
373381
await setUserAwayWS(ws1);
374382
await setUserStatus(testUser3.credentials, UserStatus.AWAY);
375383
const ws2 = await ddpLogin(testUser3.credentials['X-Auth-Token']);
384+
sockets.push(ws2);
376385
await setUserAwayWS(ws2);
377386
// Agent is available but should be ignored
378387
await switchLivechatStatus('available', testUser.credentials);

0 commit comments

Comments
 (0)