package acceptance import ( "encoding/json" "os" "sync" "testing" "time" ) type Reporter struct { mu sync.Mutex started time.Time cases []ReportCase } type ReportCase struct { Name string `json:"name"` Domain string `json:"domain"` Method string `json:"method"` Path string `json:"path"` Expected string `json:"expected"` } type Report struct { RunID string `json:"run_id"` BaseURL string `json:"base_url"` Duration string `json:"duration"` Cases []ReportCase `json:"cases"` } var acceptanceReporter = &Reporter{started: time.Now()} func recordCase(t *testing.T, domain string, method string, path string, expected string) { t.Helper() acceptanceReporter.mu.Lock() defer acceptanceReporter.mu.Unlock() acceptanceReporter.cases = append(acceptanceReporter.cases, ReportCase{ Name: t.Name(), Domain: domain, Method: method, Path: path, Expected: expected, }) } func writeReport(c Config) error { if c.ReportPath == "" { return nil } acceptanceReporter.mu.Lock() defer acceptanceReporter.mu.Unlock() report := Report{ RunID: c.RunID, BaseURL: c.StagingURL, Duration: time.Since(acceptanceReporter.started).String(), Cases: append([]ReportCase(nil), acceptanceReporter.cases...), } out, err := json.MarshalIndent(report, "", " ") if err != nil { return err } return os.WriteFile(c.ReportPath, out, 0o600) }