Files
pikasTech-HWLAB/web/hwlab-cloud-web/src/composables/useTraceSubscription.test.ts
T
2026-07-03 05:49:05 +08:00

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);
});