diff --git a/internal/web/handlers/e2e_markup_probe_test.go b/internal/web/handlers/e2e_markup_probe_test.go new file mode 100644 index 0000000..17c8a9f --- /dev/null +++ b/internal/web/handlers/e2e_markup_probe_test.go @@ -0,0 +1,46 @@ +package handlers + +import ( + "regexp" + "strings" + "testing" +) + +// TestE2ESendLogStatusMarkupDrift renders the real deliveries_rows fragment and +// checks whether the e2e gate's HTML scrapers still match it. +func TestE2ESendLogStatusMarkupDrift(t *testing.T) { + h, _ := serverWithDelivery(t) + rendered := getBody(t, h.HandleDeliveriesRows, "/deliveries/rows") + + // These mirror test/e2e/main_test.go — keep in sync when fixing the e2e gate. + statusCellPattern := regexp.MustCompile(`class="st st-[^"]+">(queued|sent|deferred|bounced|rejected)`) + containsCell := func(html, needle string) bool { + return strings.Contains(html, ``+needle+``) + } + + if statusCellPattern.FindStringSubmatch(rendered) == nil { + t.Fatalf("e2e statusCellPattern does not match rendered send-log rows:\n%s", snippet(rendered, `class="status"`)) + } + if !containsCell(rendered, "sent") { + t.Fatalf("e2e containsCell does not match rendered send-log rows:\n%s", snippet(rendered, `class="status"`)) + } +} + +func snippet(s, needle string) string { + i := strings.Index(s, needle) + if i < 0 { + if len(s) > 200 { + return s[:200] + "..." + } + return s + } + start := i - 20 + if start < 0 { + start = 0 + } + end := i + 120 + if end > len(s) { + end = len(s) + } + return s[start:end] +} diff --git a/test/e2e/main_test.go b/test/e2e/main_test.go index 8a0deb5..7bdac92 100644 --- a/test/e2e/main_test.go +++ b/test/e2e/main_test.go @@ -19,7 +19,7 @@ import ( "time" ) -var statusCellPattern = regexp.MustCompile(`(queued|sent|deferred|bounced|rejected)`) +var statusCellPattern = regexp.MustCompile(`class="st st-[^"]+">(queued|sent|deferred|bounced|rejected)`) // h is the single shared stand for the whole ordered scenario in TestE2E. // TestHostnameGate does not use it — it spins its own disposable container. @@ -247,7 +247,7 @@ func uniqueToken(label string) string { } func containsCell(html, needle string) bool { - return strings.Contains(html, ""+needle+"") + return strings.Contains(html, ``+needle+``) } func firstStatusCell(html string) string {