95 lines
2.5 KiB
TypeScript
95 lines
2.5 KiB
TypeScript
import { describe, expect, test } from "vitest";
|
|
|
|
import type { ConversationRow } from "./conversation";
|
|
import { projectConversation } from "./conversation";
|
|
|
|
const row = (
|
|
overrides: Partial<ConversationRow> &
|
|
Pick<ConversationRow, "messageId" | "role" | "status">
|
|
): ConversationRow => ({
|
|
attachments: [],
|
|
error: null,
|
|
rawText: "",
|
|
...overrides,
|
|
});
|
|
|
|
describe("projectConversation", () => {
|
|
test("keeps queued assistant rows as status instead of duplicate messages", () => {
|
|
const state = projectConversation([
|
|
row({
|
|
messageId: "user-1",
|
|
rawText: "Build it",
|
|
role: "user",
|
|
status: "dispatching",
|
|
}),
|
|
row({ messageId: "assistant-1", role: "assistant", status: "queued" }),
|
|
]);
|
|
expect(state.pending).toBe(true);
|
|
expect(state.messages).toHaveLength(1);
|
|
});
|
|
|
|
test("projects partial assistant text as streaming", () => {
|
|
const state = projectConversation([
|
|
row({
|
|
messageId: "assistant-streaming",
|
|
rawText: "Working",
|
|
role: "assistant",
|
|
status: "running",
|
|
}),
|
|
]);
|
|
expect(state.streaming).toBe(true);
|
|
expect(state.messages[0]?.parts).toEqual([
|
|
{ state: "streaming", text: "Working", type: "text" },
|
|
]);
|
|
});
|
|
|
|
test("projects completed Convex rows into renderable messages", () => {
|
|
const state = projectConversation([
|
|
row({
|
|
messageId: "assistant-1",
|
|
rawText: "Captured the request.",
|
|
role: "assistant",
|
|
status: "completed",
|
|
}),
|
|
]);
|
|
expect(state.messages[0]?.parts).toEqual([
|
|
{ state: "done", text: "Captured the request.", type: "text" },
|
|
]);
|
|
});
|
|
|
|
test("clears a historical failure after a newer turn succeeds", () => {
|
|
const state = projectConversation([
|
|
row({
|
|
error: "Old admission failure",
|
|
messageId: "assistant-failed",
|
|
role: "assistant",
|
|
status: "failed",
|
|
}),
|
|
row({
|
|
messageId: "assistant-completed",
|
|
rawText: "Recovered",
|
|
role: "assistant",
|
|
status: "completed",
|
|
}),
|
|
]);
|
|
expect(state.failedError).toBeUndefined();
|
|
});
|
|
|
|
test("clears historical pending state after a newer turn completes", () => {
|
|
const state = projectConversation([
|
|
row({
|
|
messageId: "assistant-stale",
|
|
role: "assistant",
|
|
status: "running",
|
|
}),
|
|
row({
|
|
messageId: "assistant-completed",
|
|
rawText: "Recovered",
|
|
role: "assistant",
|
|
status: "completed",
|
|
}),
|
|
]);
|
|
expect(state.pending).toBe(false);
|
|
});
|
|
});
|