59 lines
2.8 KiB
Go
59 lines
2.8 KiB
Go
package workbenchruntime
|
|
|
|
import "strings"
|
|
import "testing"
|
|
|
|
func TestWorkbenchRuntimeReadIndexesCoverTraceFanout(t *testing.T) {
|
|
want := []string{
|
|
"idx_workbench_sessions_last_trace_updated",
|
|
"idx_workbench_messages_trace_updated",
|
|
"idx_workbench_parts_trace_updated",
|
|
"idx_workbench_turns_trace_updated",
|
|
"idx_workbench_projection_checkpoints_trace_updated",
|
|
}
|
|
joined := strings.Join(workbenchRuntimeReadIndexes, "\n")
|
|
for _, name := range want {
|
|
if !strings.Contains(joined, name) {
|
|
t.Fatalf("workbench runtime trace fanout index %s is not ensured", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSessionSummaryUsesNewestTurnFactsOverStaleSessionLastTrace(t *testing.T) {
|
|
sessionID := "ses_triad_current_trace"
|
|
oldTraceID := "trc_triad_completed"
|
|
newTraceID := "trc_triad_running"
|
|
facts := emptyFacts()
|
|
facts["messages"] = []any{
|
|
map[string]any{"messageId": "msg_old_user", "sessionId": sessionID, "traceId": oldTraceID, "role": "user", "status": "sent", "updatedAt": "2026-07-01T00:00:00Z", "projectedSeq": int64(10)},
|
|
map[string]any{"messageId": "msg_old_agent", "sessionId": sessionID, "traceId": oldTraceID, "role": "agent", "status": "completed", "text": "first done", "updatedAt": "2026-07-01T00:00:02Z", "projectedSeq": int64(20)},
|
|
map[string]any{"messageId": "msg_new_user", "sessionId": sessionID, "traceId": newTraceID, "role": "user", "status": "sent", "updatedAt": "2026-07-01T00:00:03Z", "projectedSeq": int64(30)},
|
|
map[string]any{"messageId": "msg_new_agent", "sessionId": sessionID, "traceId": newTraceID, "role": "agent", "status": "running", "updatedAt": "2026-07-01T00:00:04Z", "projectedSeq": int64(40)},
|
|
}
|
|
facts["turns"] = []any{
|
|
map[string]any{"turnId": oldTraceID, "sessionId": sessionID, "traceId": oldTraceID, "status": "completed", "terminal": true, "updatedAt": "2026-07-01T00:00:02Z", "projectedSeq": int64(20)},
|
|
map[string]any{"turnId": newTraceID, "sessionId": sessionID, "traceId": newTraceID, "status": "running", "terminal": false, "updatedAt": "2026-07-01T00:00:04Z", "projectedSeq": int64(40)},
|
|
}
|
|
summary := sessionSummary(map[string]any{
|
|
"sessionId": sessionID,
|
|
"ownerUserId": "usr_triad",
|
|
"status": "completed",
|
|
"lastTraceId": oldTraceID,
|
|
"updatedAt": "2026-07-01T00:00:02Z",
|
|
}, facts)
|
|
|
|
if got := text(summary["lastTraceId"]); got != newTraceID {
|
|
t.Fatalf("lastTraceId=%q, want %q; summary=%#v", got, newTraceID, summary)
|
|
}
|
|
if got := text(summary["status"]); got != "running" {
|
|
t.Fatalf("status=%q, want running; summary=%#v", got, summary)
|
|
}
|
|
turnSummary := objectMap(summary["turnSummary"])
|
|
if got := text(turnSummary["traceId"]); got != newTraceID {
|
|
t.Fatalf("turnSummary.traceId=%q, want %q; turnSummary=%#v", got, newTraceID, turnSummary)
|
|
}
|
|
if got := text(turnSummary["status"]); got != "running" {
|
|
t.Fatalf("turnSummary.status=%q, want running; turnSummary=%#v", got, turnSummary)
|
|
}
|
|
}
|