package core import ( "encoding/json" "strings" "testing" "time" ) func TestWorkCardSurvivesPersistedSnapshot(t *testing.T) { completed := time.Date(2026, 10, 15, 6, 0, 0, 0, time.UTC) card := ActivityCard{ID: "card_work", Status: CardDone, Work: &WorkCard{ Result: strings.Repeat("完整结果\n", 200) + "最后一项依据", ResultVersion: 2, ReadVersion: 1, CompletedAt: &completed, Decision: &WorkDecision{Mode: "multiple", State: "submitted", Options: []WorkOption{{ID: "summary", Label: "生成摘要"}}, SelectedIDs: []string{"summary"}, FreeText: "请突出关键限制", RespondedAt: &completed}, }} data, err := json.Marshal(card) if err != nil { t.Fatal(err) } var restored ActivityCard if err := json.Unmarshal(data, &restored); err != nil { t.Fatal(err) } if restored.Work == nil || restored.Work.Result != card.Work.Result || restored.Work.ReadVersion != 1 || restored.Work.ResultVersion != 2 { t.Fatalf("complete result or unread version lost: %+v", restored.Work) } if d := restored.Work.Decision; d.State != "submitted" || d.SelectedIDs[0] != "summary" || d.FreeText != "请突出关键限制" || !d.RespondedAt.Equal(completed) { t.Fatalf("decision history lost: %+v", d) } } func TestLegacyCardOmitsOptionalWork(t *testing.T) { var legacy ActivityCard if err := json.Unmarshal([]byte(`{"id":"old","status":"resolved","body":[{"type":"markdown","markdown":"保留历史"}]}`), &legacy); err != nil { t.Fatal(err) } data, err := json.Marshal(legacy) if err != nil { t.Fatal(err) } if legacy.Work != nil || strings.Contains(string(data), `"work"`) || legacy.Body[0].Markdown != "保留历史" { t.Fatalf("legacy payload changed: %s", data) } }