package report import ( "bytes" "encoding/json" "os" "path/filepath" "strings" "testing" ) func TestNormalizeFillsMissingAsUntested(t *testing.T) { t.Parallel() items, err := Normalize(Results{Items: []Item{ {ID: "F01", Status: StatusPass, Note: "ok"}, {ID: "f08", Status: "失败", Note: "flaky"}, }}) if err != nil { t.Fatal(err) } if len(items) != 23 { t.Fatalf("len=%d", len(items)) } if items[0].Status != StatusPass || items[0].Note != "ok" { t.Fatalf("F01=%+v", items[0]) } if items[7].Status != StatusFail { t.Fatalf("F08=%+v", items[7]) } if items[22].Status != StatusUntested { t.Fatalf("F23=%+v", items[22]) } } func TestWriteMarkdownSample(t *testing.T) { t.Parallel() path := filepath.Join("testdata", "sample_results.json") r, err := LoadResults(path) if err != nil { t.Fatal(err) } items, err := Normalize(r) if err != nil { t.Fatal(err) } var buf bytes.Buffer if err := WriteMarkdown(&buf, items); err != nil { t.Fatal(err) } out := buf.String() for _, id := range []string{"F01", "F12", "F23"} { if !strings.Contains(out, id) { t.Fatalf("missing %s in:\n%s", id, out) } } if !strings.Contains(out, "未测") { t.Fatalf("expected 未测:\n%s", out) } if !strings.Contains(out, "通过 0,失败 0,未测 23") { t.Fatalf("summary mismatch:\n%s", out) } } func TestEmptyResultsRoundTrip(t *testing.T) { t.Parallel() dir := t.TempDir() path := filepath.Join(dir, "empty.json") raw, err := json.MarshalIndent(EmptyResults(), "", " ") if err != nil { t.Fatal(err) } if writeErr := os.WriteFile(path, raw, 0o644); writeErr != nil { t.Fatal(writeErr) } r, err := LoadResults(path) if err != nil { t.Fatal(err) } if len(r.Items) != 23 { t.Fatalf("items=%d", len(r.Items)) } } func TestParseStatusRejectsUnknown(t *testing.T) { t.Parallel() if _, err := Normalize(Results{Items: []Item{{ID: "F01", Status: "maybe"}}}); err == nil { t.Fatal("expected error") } }