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