Why: Freeze L1 skeleton KV keys and honest no-findings placeholder so Backend can stop stuffing raw task text into progress cards. Evidence: go test ./... -count=1 Impact: New TaskSummaryView helpers; findings[] still deferred to U2/U3. Refs: fast-slow-channel-display-u1-plan W1 Co-authored-by: Cursor <cursoragent@cursor.com>
91 lines
2.7 KiB
Go
91 lines
2.7 KiB
Go
package core
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestTaskSummaryRunningBodyOmitsRawTaskAndUsesHonestPlaceholder(t *testing.T) {
|
|
v := TaskSummaryView{Focus: "核对需求与会议决定"}
|
|
body := v.RunningBody(TaskSummaryStatusQueued, [][2]string{{"材料键", "mk_x"}})
|
|
if len(body) != 2 || body[0].Type != UIMarkdown || body[1].Type != UIKV {
|
|
t.Fatalf("body shape = %+v", body)
|
|
}
|
|
if body[0].Markdown != TaskSummaryNoFindingsYet {
|
|
t.Fatalf("markdown = %q, want honest placeholder", body[0].Markdown)
|
|
}
|
|
rawTask := "逐页解析上传材料并对照验收条件" + strings.Repeat("x", 200)
|
|
if strings.Contains(body[0].Markdown, rawTask) {
|
|
t.Fatal("running body must not embed raw task text")
|
|
}
|
|
got := map[string]string{}
|
|
for _, kv := range body[1].KV {
|
|
got[kv[0]] = kv[1]
|
|
}
|
|
for _, key := range []string{TaskSummaryKVStatus, TaskSummaryKVFocus, TaskSummaryKVFindings, TaskSummaryKVRemaining, TaskSummaryKVNextStep, "材料键"} {
|
|
if _, ok := got[key]; !ok {
|
|
t.Fatalf("missing kv %q in %v", key, got)
|
|
}
|
|
}
|
|
if got[TaskSummaryKVStatus] != TaskSummaryStatusQueued {
|
|
t.Fatalf("status = %q", got[TaskSummaryKVStatus])
|
|
}
|
|
if got[TaskSummaryKVFindings] != TaskSummaryNoFindingsYet {
|
|
t.Fatalf("findings = %q", got[TaskSummaryKVFindings])
|
|
}
|
|
}
|
|
|
|
func TestTaskSummaryFinishedBodyFailureLabel(t *testing.T) {
|
|
v := TaskSummaryView{OutcomeLine: "执行失败:boom"}
|
|
body := v.FinishedBody(TaskSummaryStatusFailed, nil)
|
|
if body[0].Markdown != "执行失败:boom" {
|
|
t.Fatalf("outcome = %q", body[0].Markdown)
|
|
}
|
|
found := false
|
|
for _, kv := range body[1].KV {
|
|
if kv[0] == TaskSummaryKVStatus {
|
|
found = true
|
|
if kv[1] != TaskSummaryStatusFailed {
|
|
t.Fatalf("status = %q, want %q", kv[1], TaskSummaryStatusFailed)
|
|
}
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatal("missing status kv")
|
|
}
|
|
}
|
|
|
|
func TestTaskSummaryViewJSONRoundTrip(t *testing.T) {
|
|
in := TaskSummaryView{
|
|
Title: "核对三份材料", Focus: "核对需求", FindingsNote: TaskSummaryNoFindingsYet,
|
|
Remaining: "评审意见", NextStep: "整理冲突", OutcomeLine: "",
|
|
}
|
|
b, err := json.Marshal(in)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var out TaskSummaryView
|
|
if err := json.Unmarshal(b, &out); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if out != in {
|
|
t.Fatalf("round-trip = %+v, want %+v", out, in)
|
|
}
|
|
}
|
|
|
|
func TestCardDisplaysFailed(t *testing.T) {
|
|
if !CardDisplaysFailed(CardFailed, "danger") {
|
|
t.Fatal("CardFailed should display failed")
|
|
}
|
|
if !CardDisplaysFailed(CardDone, "danger") {
|
|
t.Fatal("legacy done+danger should display failed")
|
|
}
|
|
if CardDisplaysFailed(CardDone, "ok") {
|
|
t.Fatal("done+ok must not display failed")
|
|
}
|
|
if CardDisplaysFailed(CardActive, "info") {
|
|
t.Fatal("active must not display failed")
|
|
}
|
|
}
|