package rawsample import ( "encoding/json" "os" "path/filepath" "strings" "testing" ) func TestNormalizeSampleID(t *testing.T) { got := NormalizeSampleID(" Hello, World! ") if got != "hello-world" { t.Fatalf("expected hello-world, got %q", got) } } func TestPersistWritesSampleFilesAndMeta(t *testing.T) { root := t.TempDir() saved, err := Persist(PersistOptions{ RootDir: root, SampleID: "My Sample! 01", Source: "unit-test", Request: map[string]any{ "model": "deepseek-v4-flash", "stream": true, "messages": []any{ map[string]any{"role": "user", "content": "广州天气"}, }, }, Capture: CaptureSummary{ Label: "deepseek_completion", URL: "https://chat.deepseek.com/api/v0/chat/completion", StatusCode: 200, }, UpstreamBody: []byte("data: {\"v\":\"hello [reference:1]\"}\n\n" + "data: {\"v\":\"FINISHED\",\"p\":\"response/status\"}\n\n"), }) if err != nil { t.Fatalf("Persist failed: %v", err) } if saved.SampleID != "my-sample-01" { t.Fatalf("expected normalized sample id, got %q", saved.SampleID) } if _, err := os.Stat(saved.Dir); err != nil { t.Fatalf("sample dir missing: %v", err) } if _, err := os.Stat(saved.UpstreamPath); err != nil { t.Fatalf("upstream file missing: %v", err) } if _, err := os.Stat(filepath.Join(saved.Dir, "openai.stream.sse")); !os.IsNotExist(err) { t.Fatalf("unexpected processed stream file: %v", err) } if _, err := os.Stat(filepath.Join(saved.Dir, "openai.output.txt")); !os.IsNotExist(err) { t.Fatalf("unexpected processed text file: %v", err) } metaBytes, err := os.ReadFile(saved.MetaPath) if err != nil { t.Fatalf("read meta: %v", err) } var meta Meta if err := json.Unmarshal(metaBytes, &meta); err != nil { t.Fatalf("decode meta: %v", err) } if meta.SampleID != saved.SampleID { t.Fatalf("expected meta sample id %q, got %q", saved.SampleID, meta.SampleID) } if meta.Capture.ReferenceMarkerCount != 1 { t.Fatalf("expected one reference marker, got %+v", meta.Capture) } if meta.Capture.FinishedTokenCount != 1 { t.Fatalf("expected one finished token, got %+v", meta.Capture) } if strings.Contains(string(metaBytes), "\"processed\"") { t.Fatalf("meta should not include processed payload: %s", string(metaBytes)) } }