import { describe, expect, it } from "vite-plus/test";import { CommandId, EnvironmentId, MessageId, ThreadId } from "@t3tools/contracts";import type { QueuedThreadMessage } from "../../state/thread-outbox-model";import { appendPendingThreadMessages } from "./pending-thread-feed"; const pending = (id: string): QueuedThreadMessage => ({ environmentId: EnvironmentId.make("env"), threadId: ThreadId.make("thread"), messageId: MessageId.make(id), commandId: CommandId.make(id), text: id, attachments: [], createdAt: "2026-09-06T10:00:00.000Z",}); describe("pending timeline messages", () => { it("keeps pending messages after newer agent activity in queue order", () => { const activity = { type: "thinking", turnId: null, id: "thinking", createdAt: "2026-09-06T11:00:00.000Z", } as const; const entries = appendPendingThreadMessages( [activity], [], [pending("first"), pending("second")], ); expect(entries.map((entry) => entry.id)).toEqual(["thinking", "first", "second"]); expect(entries[1]?.pendingMessage?.text).toBe("first"); }); it("reuses the message id and suppresses the pending copy when delivery appears", () => { const queued = pending("sent"); const optimistic = appendPendingThreadMessages([], [], [queued])[0]!; const delivered = { ...optimistic, pendingMessage: undefined }; expect(appendPendingThreadMessages([delivered], [delivered], [queued])).toEqual([delivered]); // Folded messages still count as delivered even when absent from the presented rows. expect(appendPendingThreadMessages([], [delivered], [queued])).toEqual([]); });});
import { describe, expect, it } from "vite-plus/test";
import { CommandId, EnvironmentId, MessageId, ThreadId } from "@t3tools/contracts";
import type { QueuedThreadMessage } from "../../state/thread-outbox-model";
import { appendPendingThreadMessages } from "./pending-thread-feed";
const pending = (id: string): QueuedThreadMessage => ({
environmentId: EnvironmentId.make("env"),
threadId: ThreadId.make("thread"),
messageId: MessageId.make(id),
commandId: CommandId.make(id),
text: id,
attachments: [],
createdAt: "2026-09-06T10:00:00.000Z",
});
describe("pending timeline messages", () => {
it("keeps pending messages after newer agent activity in queue order", () => {
const activity = {
type: "thinking",
turnId: null,
id: "thinking",
createdAt: "2026-09-06T11:00:00.000Z",
} as const;
const entries = appendPendingThreadMessages(
[activity],
[],
[pending("first"), pending("second")],
);
expect(entries.map((entry) => entry.id)).toEqual(["thinking", "first", "second"]);
expect(entries[1]?.pendingMessage?.text).toBe("first");
});
it("reuses the message id and suppresses the pending copy when delivery appears", () => {
const queued = pending("sent");
const optimistic = appendPendingThreadMessages([], [], [queued])[0]!;
const delivered = { ...optimistic, pendingMessage: undefined };
expect(appendPendingThreadMessages([delivered], [delivered], [queued])).toEqual([delivered]);
// Folded messages still count as delivered even when absent from the presented rows.
expect(appendPendingThreadMessages([], [delivered], [queued])).toEqual([]);
});
});