package handlers_test import ( "context" "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" "sneak.berlin/go/webhooker/internal/database" "sneak.berlin/go/webhooker/internal/handlers" "sneak.berlin/go/webhooker/internal/session" ) // renderPage renders a page template through the real template set as // an authenticated user and returns the resulting HTML. func renderPage( t *testing.T, h *handlers.Handlers, sess *session.Session, page string, data map[string]any, ) string { t.Helper() cookies := authenticatedCookies(t, sess, "test-user-id", "testuser") req := httptest.NewRequestWithContext( context.Background(), http.MethodGet, "/", nil, ) for _, c := range cookies { req.AddCookie(c) } w := httptest.NewRecorder() h.RenderTemplateForTest(w, req, page, data) return w.Body.String() } // TestNavbarUsesWebhookTerminology pins the user-visible navigation // label to "Webhooks". The /sources route is deliberately unchanged, so // the assertion targets the link text rather than the href. func TestNavbarUsesWebhookTerminology(t *testing.T) { t.Parallel() var h *handlers.Handlers var sess *session.Session app := newTestApp(t, &h, &sess) app.RequireStart() t.Cleanup(app.RequireStop) body := renderPage(t, h, sess, "sources_list.html", map[string]any{ "Webhooks": []handlers.WebhookListItem{}, }) assert.Contains(t, body, `class="btn-text">Webhooks`) assert.Contains( t, body, `class="btn-text w-full text-left">Webhooks`, ) assert.Contains( t, body, `

Webhooks

`, ) assert.NotContains( t, body, ">Sources<", "no user-visible element may still be labelled Sources", ) assert.Contains( t, body, `href="/sources"`, "the /sources route itself must not change", ) } // TestEditPageUsesWebhookTerminology pins the edit page's heading and // its back link. The link's href still points at /source/{id}, which is // intentional: only user-visible copy changes. func TestEditPageUsesWebhookTerminology(t *testing.T) { t.Parallel() var h *handlers.Handlers var sess *session.Session app := newTestApp(t, &h, &sess) app.RequireStart() t.Cleanup(app.RequireStop) webhook := database.Webhook{Name: "wh", RetentionDays: 14} webhook.ID = "wh-1" body := renderPage(t, h, sess, "source_edit.html", map[string]any{ "Webhook": webhook, "Error": "", }) assert.Contains(t, body, "Edit Webhook") assert.NotContains(t, body, ">Sources<") assert.Contains(t, body, `href="/source/wh-1"`) } // TestEntrypointCopyButtonIsProgressiveEnhancement proves the copy // affordance degrades: the button ships with the hidden attribute, so a // browser that never runs app.js shows no dead control, and the URL is // rendered as ordinary selectable text either way. func TestEntrypointCopyButtonIsProgressiveEnhancement(t *testing.T) { t.Parallel() var h *handlers.Handlers var sess *session.Session app := newTestApp(t, &h, &sess) app.RequireStart() t.Cleanup(app.RequireStop) entrypoint := database.Entrypoint{Path: "abc123"} entrypoint.ID = "ep-1" body := renderPage(t, h, sess, "source_detail.html", map[string]any{ "Webhook": database.Webhook{Name: "wh"}, "Entrypoints": []database.Entrypoint{entrypoint}, "Targets": []database.Target{}, "Events": []database.Event{}, "BaseURL": "https://hooks.example.com", }) assert.Contains( t, body, `