50 lines
2.5 KiB
TypeScript
50 lines
2.5 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { test } from "bun:test";
|
|
|
|
import type { ChatMessage, TraceEvent } from "@/types";
|
|
import { mergeRunnerTrace } from "./useTraceSubscription";
|
|
|
|
function event(projectedSeq: number, label = `event-${projectedSeq}`): TraceEvent {
|
|
return { projectedSeq, label, type: "event" };
|
|
}
|
|
|
|
function trace(input: NonNullable<ChatMessage["runnerTrace"]>): NonNullable<ChatMessage["runnerTrace"]> {
|
|
return input;
|
|
}
|
|
|
|
test("mergeRunnerTrace preserves event identity for replayed trace-api range", () => {
|
|
const previousEvents = [event(1), event(2)];
|
|
const previous = trace({ traceId: "trc_replay", eventSource: "trace-api", events: previousEvents, nextProjectedSeq: 2, range: { toProjectedSeq: 2 }, hasMore: true });
|
|
const next = trace({ traceId: "trc_replay", eventSource: "trace-api", events: [event(2)], range: { afterProjectedSeq: 1, fromProjectedSeq: 2, toProjectedSeq: 2, returned: 1 }, hasMore: true });
|
|
|
|
const merged = mergeRunnerTrace(previous, next);
|
|
|
|
assert.equal(merged.events, previousEvents);
|
|
assert.equal(merged.events?.length, 2);
|
|
});
|
|
|
|
test("mergeRunnerTrace appends only delta events after the canonical cursor", () => {
|
|
const previousEvents = [event(1), event(2)];
|
|
const delta = [event(3), event(4)];
|
|
const previous = trace({ traceId: "trc_delta", eventSource: "trace-api", events: previousEvents, nextProjectedSeq: 2, range: { toProjectedSeq: 2 }, hasMore: true });
|
|
const next = trace({ traceId: "trc_delta", eventSource: "trace-api", events: delta, range: { afterProjectedSeq: 2, fromProjectedSeq: 3, toProjectedSeq: 4, returned: 2 }, hasMore: false, fullTraceLoaded: true });
|
|
|
|
const merged = mergeRunnerTrace(previous, next);
|
|
|
|
assert.notEqual(merged.events, previousEvents);
|
|
assert.deepEqual(merged.events?.map((item) => item.projectedSeq), [1, 2, 3, 4]);
|
|
assert.equal(merged.events?.[0], previousEvents[0]);
|
|
assert.equal(merged.events?.[2], delta[0]);
|
|
});
|
|
|
|
test("mergeRunnerTrace can seal terminal metadata without requiring trace rows", () => {
|
|
const previousEvents = [event(1), event(2)];
|
|
const previous = trace({ traceId: "trc_terminal", eventSource: "trace-api", events: previousEvents, nextProjectedSeq: 2, range: { toProjectedSeq: 2 }, hasMore: true, status: "running" });
|
|
const terminal = trace({ traceId: "trc_terminal", eventSource: "turn-authority", events: [], status: "completed", traceStatus: "completed", fullTraceLoaded: false });
|
|
|
|
const merged = mergeRunnerTrace(previous, terminal);
|
|
|
|
assert.equal(merged.status, "completed");
|
|
assert.equal(merged.events, previousEvents);
|
|
});
|