import { describe, expect, it } from "@jest/globals"; import { Client } from "../../../src/models/client"; import { Realm } from "../../../src/models/realm"; import type { IMessage } from "../../../src/models/message"; import { MessagesExpire } from "../../../src/services/messagesExpire"; import { MessageHandler } from "../../../src/messageHandler"; import { MessageType } from "../../../src/enums"; import { wait } from "../../utils"; describe("MessagesExpire", () => { const createTestMessage = (dst: string): IMessage => { return { type: MessageType.OPEN, src: "src", dst, }; }; it("should remove client if no read from queue", async () => { const realm = new Realm(); const messageHandler = new MessageHandler(realm); const checkInterval = 10; const expireTimeout = 50; const config = { cleanup_out_msgs: checkInterval, expire_timeout: expireTimeout, }; const messagesExpire = new MessagesExpire({ realm, config, messageHandler, }); const client = new Client({ id: "id", token: "" }); realm.setClient(client, "id"); realm.addMessageToQueue(client.getId(), createTestMessage("dst")); messagesExpire.startMessagesExpiration(); await wait(checkInterval * 2); expect( realm.getMessageQueueById(client.getId())?.getMessages().length, ).toBe(1); await wait(expireTimeout); expect(realm.getMessageQueueById(client.getId())).toBeUndefined(); messagesExpire.stopMessagesExpiration(); }); it("should fire EXPIRE message", async () => { const realm = new Realm(); const messageHandler = new MessageHandler(realm); const checkInterval = 10; const expireTimeout = 50; const config = { cleanup_out_msgs: checkInterval, expire_timeout: expireTimeout, }; const messagesExpire = new MessagesExpire({ realm, config, messageHandler, }); const client = new Client({ id: "id", token: "" }); realm.setClient(client, "id"); realm.addMessageToQueue(client.getId(), createTestMessage("dst1")); realm.addMessageToQueue(client.getId(), createTestMessage("dst2")); let handledCount = 0; messageHandler.handle = (client, message): boolean => { expect(client).toBeUndefined(); expect(message.type).toBe(MessageType.EXPIRE); handledCount++; return true; }; messagesExpire.startMessagesExpiration(); await wait(checkInterval * 2); await wait(expireTimeout); expect(handledCount).toBe(2); messagesExpire.stopMessagesExpiration(); }); });