multica/apps/gateway/telegram/message-context-queue.test.ts

76 lines
2.8 KiB
TypeScript

import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { MessageContextQueue } from "./message-context-queue.js";
describe("MessageContextQueue", () => {
it("keeps the first context active while newer messages stay pending", () => {
const queue = new MessageContextQueue();
const contextKey = "device-1:session-1";
queue.enqueue(contextKey, { telegramChatId: 100, telegramMessageId: 1 });
queue.enqueue(contextKey, { telegramChatId: 100, telegramMessageId: 2 });
assert.deepEqual(queue.activate(contextKey), {
telegramChatId: 100,
telegramMessageId: 1,
});
assert.deepEqual(queue.peekForSend(contextKey), {
telegramChatId: 100,
telegramMessageId: 1,
});
assert.deepEqual(queue.release(contextKey), {
telegramChatId: 100,
telegramMessageId: 1,
});
assert.deepEqual(queue.peekForSend(contextKey), {
telegramChatId: 100,
telegramMessageId: 2,
});
});
it("releases oldest pending context when a run errors before message_start", () => {
const queue = new MessageContextQueue();
const contextKey = "device-2:session-2";
queue.enqueue(contextKey, { telegramChatId: 200, telegramMessageId: 11 });
queue.enqueue(contextKey, { telegramChatId: 200, telegramMessageId: 12 });
// No activate(): simulate agent_error before streaming starts
assert.deepEqual(queue.release(contextKey), {
telegramChatId: 200,
telegramMessageId: 11,
});
assert.deepEqual(queue.peekForSend(contextKey), {
telegramChatId: 200,
telegramMessageId: 12,
});
});
it("does not advance queue on repeated activate calls during one run", () => {
const queue = new MessageContextQueue();
const contextKey = "device-3:session-3";
queue.enqueue(contextKey, { telegramChatId: 300, telegramMessageId: 21 });
queue.enqueue(contextKey, { telegramChatId: 300, telegramMessageId: 22 });
assert.equal(queue.activate(contextKey)?.telegramMessageId, 21);
assert.equal(queue.activate(contextKey)?.telegramMessageId, 21);
assert.equal(queue.release(contextKey)?.telegramMessageId, 21);
assert.equal(queue.peekForSend(contextKey)?.telegramMessageId, 22);
});
it("isolates contexts by context key", () => {
const queue = new MessageContextQueue();
queue.enqueue("a:session-1", { telegramChatId: 1, telegramMessageId: 1 });
queue.enqueue("a:session-2", { telegramChatId: 2, telegramMessageId: 2 });
assert.equal(queue.activate("a:session-1")?.telegramMessageId, 1);
assert.equal(queue.peekForSend("a:session-2")?.telegramMessageId, 2);
assert.equal(queue.release("a:session-1")?.telegramMessageId, 1);
assert.equal(queue.peekForSend("a:session-1"), undefined);
assert.equal(queue.peekForSend("a:session-2")?.telegramMessageId, 2);
});
});