All checks were successful
Check / check (pull_request) Successful in 3m22s
Bump golangci-lint from v2.10.1 to v2.12.2 in the Dockerfile lint stage (tag+digest pin) and script/bootstrap release-archive pins (linux amd64/arm64 sha256s). Replace .golangci.yml with the canonical v2-layout config so linter settings (lll 88, funlen 80/50, cyclop 15, dupl 100) actually apply. Fix all findings surfaced by the new linter and config: - noctx: use httptest.NewRequestWithContext in all tests - gosec G710/G703: route app redirects through a path-escaping redirectToApp helper; annotate internal log path usage - goconst: introduce shared constants for template/JSON keys and repeated test literals - lll: wrap lines to the 88-column limit - dupl: extract shared helpers (generic findAllByAppID in models, deleteAppResource in handlers, parsePush in webhook payloads, table-driven/helper-based test dedup) - nolintlint: drop nolint directives made obsolete by the new limits Record the change in TODO.md; make check is green.
78 lines
2.2 KiB
Go
78 lines
2.2 KiB
Go
package handlers_test
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// TestRenderTemplateBuffersOutput verifies that successful template rendering
|
|
// produces a complete HTML response (not partial/corrupt).
|
|
func TestRenderTemplateBuffersOutput(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testCtx := setupTestHandlers(t)
|
|
|
|
// The setup page is simple and has no DB dependencies
|
|
request := httptest.NewRequestWithContext(
|
|
t.Context(), http.MethodGet, "/setup", nil,
|
|
)
|
|
recorder := httptest.NewRecorder()
|
|
|
|
handler := testCtx.handlers.HandleSetupGET()
|
|
handler.ServeHTTP(recorder, request)
|
|
|
|
assert.Equal(t, http.StatusOK, recorder.Code)
|
|
|
|
body := recorder.Body.String()
|
|
// A properly buffered response should contain the closing </html> tag,
|
|
// proving the full template was rendered before being sent.
|
|
assert.Contains(t, body, "</html>")
|
|
// Should NOT contain the error text that would be appended on failure
|
|
assert.NotContains(t, body, "Internal Server Error")
|
|
}
|
|
|
|
// TestDashboardRenderTemplateBuffersOutput verifies the dashboard handler
|
|
// also uses buffered template rendering.
|
|
func TestDashboardRenderTemplateBuffersOutput(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testCtx := setupTestHandlers(t)
|
|
|
|
request := httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/", nil)
|
|
recorder := httptest.NewRecorder()
|
|
|
|
handler := testCtx.handlers.HandleDashboard()
|
|
handler.ServeHTTP(recorder, request)
|
|
|
|
assert.Equal(t, http.StatusOK, recorder.Code)
|
|
|
|
body := recorder.Body.String()
|
|
assert.Contains(t, body, "</html>")
|
|
assert.NotContains(t, body, "Internal Server Error")
|
|
}
|
|
|
|
// TestLoginRenderTemplateBuffersOutput verifies the login handler
|
|
// uses buffered template rendering.
|
|
func TestLoginRenderTemplateBuffersOutput(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testCtx := setupTestHandlers(t)
|
|
|
|
request := httptest.NewRequestWithContext(
|
|
t.Context(), http.MethodGet, "/login", nil,
|
|
)
|
|
recorder := httptest.NewRecorder()
|
|
|
|
handler := testCtx.handlers.HandleLoginGET()
|
|
handler.ServeHTTP(recorder, request)
|
|
|
|
assert.Equal(t, http.StatusOK, recorder.Code)
|
|
|
|
body := recorder.Body.String()
|
|
assert.Contains(t, body, "</html>")
|
|
assert.NotContains(t, body, "Internal Server Error")
|
|
}
|