From fe6f513b0131c70b0e2e30d331eae89b66cf9218 Mon Sep 17 00:00:00 2001 From: afrokick Date: Sun, 15 Dec 2019 18:49:01 +0300 Subject: [PATCH] add test for messageQueue replace setTimeout to Promised wait --- dist/src/index.js | 1 - dist/src/models/messageQueue.js | 2 +- src/index.ts | 3 +- src/models/messageQueue.ts | 6 +- test/models/messageQueue.ts | 62 +++++++++++++++++++ test/services/checkBrokenConnections/index.ts | 31 +++++----- test/utils.ts | 1 + 7 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 test/models/messageQueue.ts create mode 100644 test/utils.ts diff --git a/dist/src/index.js b/dist/src/index.js index 7137006..92282b4 100644 --- a/dist/src/index.js +++ b/dist/src/index.js @@ -36,7 +36,6 @@ const init = ({ app, server, options }) => { const messageQueue = realm.getMessageQueueById(client.getId()); if (messageQueue) { let message; - // tslint:disable while (message = messageQueue.readMessage()) { messageHandler.handle(client, message); } diff --git a/dist/src/models/messageQueue.js b/dist/src/models/messageQueue.js index fbe3a77..fc04ea6 100644 --- a/dist/src/models/messageQueue.js +++ b/dist/src/models/messageQueue.js @@ -16,7 +16,7 @@ class MessageQueue { this.lastReadAt = new Date().getTime(); return this.messages.shift(); } - return null; + return undefined; } getMessages() { return this.messages; diff --git a/src/index.ts b/src/index.ts index 7e4b7e9..dc6e4ec 100644 --- a/src/index.ts +++ b/src/index.ts @@ -46,9 +46,8 @@ const init = ({ app, server, options }: { const messageQueue = realm.getMessageQueueById(client.getId()); if (messageQueue) { - let message: IMessage | null; + let message: IMessage | undefined; - // tslint:disable while (message = messageQueue.readMessage()) { messageHandler.handle(client, message); } diff --git a/src/models/messageQueue.ts b/src/models/messageQueue.ts index 1b5a94c..da716bb 100644 --- a/src/models/messageQueue.ts +++ b/src/models/messageQueue.ts @@ -5,7 +5,7 @@ export interface IMessageQueue { addMessage(message: IMessage): void; - readMessage(): IMessage | null; + readMessage(): IMessage | undefined; getMessages(): IMessage[]; } @@ -22,13 +22,13 @@ export class MessageQueue implements IMessageQueue { this.messages.push(message); } - public readMessage(): IMessage | null { + public readMessage(): IMessage | undefined { if (this.messages.length > 0) { this.lastReadAt = new Date().getTime(); return this.messages.shift()!; } - return null; + return undefined; } public getMessages(): IMessage[] { diff --git a/test/models/messageQueue.ts b/test/models/messageQueue.ts new file mode 100644 index 0000000..41118f2 --- /dev/null +++ b/test/models/messageQueue.ts @@ -0,0 +1,62 @@ +import { expect } from 'chai'; +import { MessageQueue } from '../../src/models/messageQueue'; +import { MessageType } from '../../src/enums'; +import { IMessage } from '../../src/models/message'; +import { wait } from '../utils'; + +describe('MessageQueue', () => { + const createTestMessage = (): IMessage => { + return { + type: MessageType.OPEN, + src: 'src', + dst: 'dst' + }; + }; + + describe('#addMessage', () => { + it('should add message to queue', () => { + const queue = new MessageQueue(); + queue.addMessage(createTestMessage()); + expect(queue.getMessages().length).to.eq(1); + }); + }); + + describe('#readMessage', () => { + it('should return undefined for empty queue', () => { + const queue = new MessageQueue(); + expect(queue.readMessage()).to.be.undefined; + }); + + it('should return message if any exists in queue', () => { + const queue = new MessageQueue(); + const message = createTestMessage(); + queue.addMessage(message); + + expect(queue.readMessage()).to.deep.eq(message); + expect(queue.readMessage()).to.be.undefined; + }); + }); + + describe('#getLastReadAt', () => { + it('should not be changed if no messages when read', () => { + const queue = new MessageQueue(); + const lastReadAt = queue.getLastReadAt(); + queue.readMessage(); + expect(queue.getLastReadAt()).to.be.eq(lastReadAt); + }); + + it('should be changed when read message', async () => { + const queue = new MessageQueue(); + const lastReadAt = queue.getLastReadAt(); + queue.addMessage(createTestMessage()); + + await wait(10); + + expect(queue.getLastReadAt()).to.be.eq(lastReadAt); + + queue.readMessage(); + + expect(queue.getLastReadAt()).to.be.greaterThan(lastReadAt + 10); + }); + }); +}); diff --git a/test/services/checkBrokenConnections/index.ts b/test/services/checkBrokenConnections/index.ts index a9f6005..a4b8ef4 100644 --- a/test/services/checkBrokenConnections/index.ts +++ b/test/services/checkBrokenConnections/index.ts @@ -2,9 +2,10 @@ import { expect } from 'chai'; import { Client } from '../../../src/models/client'; import { Realm } from '../../../src/models/realm'; import { CheckBrokenConnections } from '../../../src/services/checkBrokenConnections'; +import { wait } from '../../utils'; describe('checkBrokenConnections service', () => { - it('should remove client after 2 checks', (done) => { + it('should remove client after 2 checks', async () => { const realm = new Realm(); const doubleCheckTime = 55;//~ equals to checkBrokenConnections.checkInterval * 2 const checkBrokenConnections = new CheckBrokenConnections({ realm, config: { alive_timeout: doubleCheckTime }, checkInterval: 30 }); @@ -13,14 +14,14 @@ describe('checkBrokenConnections service', () => { checkBrokenConnections.start(); - setTimeout(() => { - expect(realm.getClientById('id')).to.be.undefined; - checkBrokenConnections.stop(); - done(); - }, checkBrokenConnections.checkInterval * 2 + 30); + await wait(checkBrokenConnections.checkInterval * 2 + 30); + + expect(realm.getClientById('id')).to.be.undefined; + + checkBrokenConnections.stop(); }); - it('should remove client after 1 ping', (done) => { + it('should remove client after 1 ping', async () => { const realm = new Realm(); const doubleCheckTime = 55;//~ equals to checkBrokenConnections.checkInterval * 2 const checkBrokenConnections = new CheckBrokenConnections({ realm, config: { alive_timeout: doubleCheckTime }, checkInterval: 30 }); @@ -30,14 +31,14 @@ describe('checkBrokenConnections service', () => { checkBrokenConnections.start(); //set ping after first check - setTimeout(() => { - client.setLastPing(new Date().getTime()); + await wait(checkBrokenConnections.checkInterval); - setTimeout(() => { - expect(realm.getClientById('id')).to.be.undefined; - checkBrokenConnections.stop(); - done(); - }, checkBrokenConnections.checkInterval * 2 + 10); - }, checkBrokenConnections.checkInterval); + client.setLastPing(new Date().getTime()); + + await wait(checkBrokenConnections.checkInterval * 2 + 10); + + expect(realm.getClientById('id')).to.be.undefined; + + checkBrokenConnections.stop(); }); }); diff --git a/test/utils.ts b/test/utils.ts new file mode 100644 index 0000000..cbbd648 --- /dev/null +++ b/test/utils.ts @@ -0,0 +1 @@ +export const wait = (ms: number): Promise => new Promise(resolve => setTimeout(resolve, ms));