package safariconformance import ( "encoding/json" "strings" "testing" "time" ) func TestRealSafariCompleteMatrixPasses(t *testing.T) { t.Parallel() capture := safariFixture("MACOS_SAFARI") report := Evaluate(capture, capture.CandidateVersion, capture.BuildDigest, time.Now()) if report.Result != "PASS" || report.EvidenceScope != "REAL_SAFARI" || report.ExternalValidationRequired || report.ResultCount != 24 { t.Fatalf("unexpected report: %+v", report) } } func TestRealSafariMissingWorkflowFails(t *testing.T) { t.Parallel() capture := safariFixture("MACOS_SAFARI") capture.Runs[1].Results = capture.Runs[1].Results[:len(capture.Runs[1].Results)-1] report := Evaluate(capture, capture.CandidateVersion, capture.BuildDigest, time.Now()) if report.Result != "FAIL" || !report.ExternalValidationRequired { t.Fatalf("expected failed report: %+v", report) } } func TestNonSafariToolchainCannotCompleteExternalValidation(t *testing.T) { t.Parallel() capture := safariFixture("NON_SAFARI_TOOLCHAIN") capture.Runs = capture.Runs[:1] capture.Runs[0].BrowserName = "Chrome" report := Evaluate(capture, capture.CandidateVersion, capture.BuildDigest, time.Now()) if report.Result != "PASS" || report.EvidenceScope != "NON_SAFARI_TOOLCHAIN" || !report.ExternalValidationRequired { t.Fatalf("unexpected toolchain report: %+v", report) } } func TestParseCaptureRejectsUnknownFields(t *testing.T) { t.Parallel() content, err := json.Marshal(safariFixture("NON_SAFARI_TOOLCHAIN")) if err != nil { t.Fatal(err) } content = []byte(strings.TrimSuffix(string(content), "}") + `,"unexpected":true}`) if _, err = ParseCapture(content); err == nil { t.Fatal("expected unknown field rejection") } } func safariFixture(source string) Capture { startedAt := time.Date(2026, 8, 25, 10, 0, 0, 0, time.UTC) collectedAt := startedAt.Add(3 * time.Hour) environment := "STAGING" if source == "NON_SAFARI_TOOLCHAIN" { environment = "LOCAL" } runs := make([]BrowserRun, 0, 2) for rankPosition, rank := range RequiredReleaseRanks { results := make([]WorkflowResult, 0, len(RequiredWorkflows)*len(RequiredViewports)) for _, workflow := range RequiredWorkflows { for _, viewport := range RequiredViewports { results = append(results, WorkflowResult{Workflow: workflow, Viewport: viewport, Status: "PASS", EvidenceRef: "evidence:" + rank + ":" + workflow + ":" + viewport}) } } runs = append(runs, BrowserRun{ ReleaseRank: rank, BrowserName: "Safari", BrowserVersion: []string{"26.0", "18.6"}[rankPosition], MacOSVersion: "macOS-test", MachineRef: "mac-runner-a", ExecutionMode: "SAFARIDRIVER", StartedAt: startedAt.Add(time.Duration(rankPosition) * time.Hour), EndedAt: startedAt.Add(time.Duration(rankPosition+1) * time.Hour), Results: results, }) } return Capture{ SchemaVersion: CaptureSchema, EvidenceSource: source, CandidateVersion: "0.63.0-rc.1", BuildDigest: "sha256:" + strings.Repeat("a", 64), Environment: environment, ReleaseReferenceRef: "apple-release-baseline:2026-08-25", ChangeTicketRef: "change-20260825", ExecutedByRef: "qa-executor", AttestedByRef: "qa-reviewer", AttestedAt: collectedAt.Add(-30 * time.Minute), CollectedAt: collectedAt, Runs: runs, } }