76 lines
2.8 KiB
TypeScript
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);
|
|
});
|
|
});
|