package view import ( "testing" "time" ) // ---- The hub func TestDMARCHubShowsIngestAndTheLatestReports(t *testing.T) { out := renderSignedIn(t, "dmarc", dmarcHubFixture()) pageHas(t, "DMARC reports", out, `

DMARC reports

`, `rua=`, `

Ingest

`, `ok`, `
2026-09-21 06:12 UTC
`, `
14 kept · 0 parse failures
`, `
Hosted addresses
`, `
dmarc-reports+<domain>@mail.example.org
`, `
500 reports or 90 days
`, `Received, UTC`, `09-21 06:12`, `example.org`, "1 903", `7`, `0View`, ) } // Before the first report the box says how to get one, and a quiet ingest is // amber. func TestDMARCHubWithoutReports(t *testing.T) { p := NewDMARCHub(admin(), IngestInput{Hosted: "dmarc@mail.example.org", Host: "mail.example.org", RetentionMax: 500, RetentionDays: 90}) out := renderSignedIn(t, "dmarc", p.WithReports(nil)) pageHas(t, "DMARC reports", out, `quiet`, `
None yet
`, `publish MX for mail.example.org pointing at this server`, `No reports yet.`, `0 kept · 0 parse failures`) pageLacks(t, "DMARC reports", out, ``) one := NewDMARCHub(admin(), IngestInput{OK: true, Last: time.Now(), KeptThisWeek: 1, ParseFailures: 1}) pageHas(t, "DMARC reports", renderSignedIn(t, "dmarc", one), `1 kept · 1 parse failure`) } // A report of a domain the viewer cannot open is not a link. func TestDMARCHubLinksOnlyDomainsThatExist(t *testing.T) { p := NewDMARCHub(admin(), IngestInput{}).WithReports([]DMARCReportRow{ {Received: "09-21 06:12", Domain: "gone.example", Reporter: "google.com", Window: "20 Sep", Pass: 1, Href: "/outbound/dmarc/reports/1"}, }) out := renderSignedIn(t, "dmarc", p) pageHas(t, "DMARC reports", out, `gone.example`) pageLacks(t, "DMARC reports", out, `/outbound/dmarc/domains/`) } // ---- One sending domain // The stamp, the lead and the tables say the same thing about the window: how // much passed, what to do about what did not. func TestDMARCDomainStampAndLead(t *testing.T) { out := renderSignedIn(t, "dmarc-domain", dmarcDomainFixture()) pageHas(t, "DMARC domain", out, `

shop.example.org

`, `DMARC reports /`, `class="sp-postmark sp-warn"`, `DMARC99.6%PASS · 7 DAYS`, "11 204 pass · 41 fail in the last 7 days. A third-party source is not aligned. Do not tighten p= until that sender is fixed or removed.", `Domain page`, `

Sources · 7 days

`, `203.0.113.25 this relay`, `041none`, `none`, `

Reports

`, `Outlook.com`, ) for _, c := range []struct { pass, fail int level string word string }{ {500, 0, LevelOK, "100%"}, {9999, 1, LevelWarn, "99.9%"}, {1, 99999, LevelWarn, "0.0%"}, {0, 5, LevelFail, "0.0%"}, } { p := NewDMARCDomain(admin(), 1, "example.org", true, c.pass, c.fail, 7, "") if m := p.Head.Postmark; m == nil || m.Level != c.level || m.Word != c.word { t.Errorf("%d pass, %d fail are stamped %+v, want %s %s", c.pass, c.fail, m, c.level, c.word) } } // Rounding never turns a failure into a clean 100%. if got := passRate(99999, 1); got != "99.9%" { t.Errorf("99999 of 100000 is stamped %s", got) } } // With nothing in the window there is nothing to stamp; and a viewer who does not // reach the hub is not offered the way back to it. func TestDMARCDomainWithoutMailOrWithoutHub(t *testing.T) { p := NewDMARCDomain(Meta{User: "ops", HasOutbound: true}, 1, "example.org", false, 0, 0, 7, "No messages in the reporting window yet.") out := renderSignedIn(t, "dmarc-domain", p.WithSources(nil).WithReports(nil)) pageHas(t, "DMARC domain", out, `

DMARC reports /

`, `0 pass · 0 fail in the last 7 days. No messages in the reporting window yet.`, `No mail from any source in this window.`, `No reports for this domain yet.`) pageLacks(t, "DMARC domain", out, `sp-postmark`, ``) } func TestWithCodeOnlyMarksP(t *testing.T) { out := renderSignedIn(t, "dmarc-domain", NewDMARCDomain(admin(), 1, "example.org", true, 1, 0, 7, "Raise p= to quarantine, then p=reject.").WithSources(nil).WithReports(nil)) pageHas(t, "DMARC domain", out, `Raise p= to quarantine, then p=reject.`) } // ---- One report func TestDMARCReportShowsTheReportItsPolicyAndRecords(t *testing.T) { out := renderSignedIn(t, "dmarc-report", dmarcReportFixture()) pageHas(t, "DMARC report", out, `

Outlook.com · 20 Sep

`, `DMARC reports / shop.example.org /`, "shop.example.org1 903 pass7 fail", `

Report

`, `
5f1c9a0e7b2d4e61a3
`, `
20 Sep 00:00 – 21 Sep 00:00 UTC
`, `
2026-09-21 04:40 UTC
`, `

Published policy

`, `
none / none / 100
`, `
r / r
`, `
dmarc@mail.example.org
`, `

Records

`, `Parsed from the aggregate XML`, `203.0.113.25 this relay`, "1 903", `passpass`, `nonefailfail`, ) } // What a report does not hold is not drawn: no contact, no rua, no fail tag when // nothing failed, and a report with no records says so. func TestDMARCReportOmitsWhatItDoesNotHold(t *testing.T) { p := NewDMARCReport(admin(), ReportInput{ID: 1, Reporter: "google.com", ReportID: "r1", Domain: "example.org", DomainID: 1, Pass: 5, Period: "20 Sep 00:00 – 20 Sep 23:59 UTC", Received: "2026-09-21 04:40 UTC", PolicyP: "none", PolicySP: "none", PolicyPct: 100, PolicyADKIM: "r", PolicyASPF: "r"}) out := renderSignedIn(t, "dmarc-report", p.WithRecords(nil)) pageHas(t, "DMARC report", out, `

google.com

`, `5 pass`, `This report holds no records.`) pageLacks(t, "DMARC report", out, `fail`, `Contact`, `
rua
`, ``) } func TestDMARCPagesEscapeWhatReportersWrote(t *testing.T) { evil := `` hub := NewDMARCHub(admin(), IngestInput{Hosted: evil}).WithReports([]DMARCReportRow{{Domain: evil, Reporter: evil, Window: evil, Received: evil, Href: "/x"}}) dom := NewDMARCDomain(admin(), 1, evil, true, 1, 1, 7, evil). WithSources([]DMARCSourceRow{{Source: evil, Disposition: evil}}).WithReports([]DMARCReportRow{{Reporter: evil, Href: "/x"}}) rep := NewDMARCReport(admin(), ReportInput{Reporter: evil, ReportID: evil, Domain: evil, Contact: evil, Period: evil, Received: evil, PolicyP: evil, PolicyADKIM: evil, Recipient: evil}). WithRecords([]DMARCRecordRow{{Source: evil, Disposition: evil, SPF: evil, DKIM: evil, HeaderFrom: evil}}) for name, c := range map[string]struct { page string data any }{"hub": {"dmarc", hub}, "domain": {"dmarc-domain", dom}, "report": {"dmarc-report", rep}} { pageLacks(t, name, renderSignedIn(t, c.page, c.data), `