From 8a103d5cb21156fc5da30818ffe54023e0a80823 Mon Sep 17 00:00:00 2001 From: Jake Wang Date: Tue, 8 Sep 2026 11:54:38 -0400 Subject: [PATCH] assert: accept full HTTP success and redirect status classes --- assert/http_assertions.go | 4 ++-- assert/http_assertions_test.go | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/assert/http_assertions.go b/assert/http_assertions.go index 5a6bb75f2..afb7d7e32 100644 --- a/assert/http_assertions.go +++ b/assert/http_assertions.go @@ -35,7 +35,7 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) } - isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent + isSuccessCode := code >= http.StatusOK && code < http.StatusMultipleChoices if !isSuccessCode { Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code), msgAndArgs...) } @@ -57,7 +57,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) } - isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect + isRedirectCode := code >= http.StatusMultipleChoices && code < http.StatusBadRequest if !isRedirectCode { Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code), msgAndArgs...) } diff --git a/assert/http_assertions_test.go b/assert/http_assertions_test.go index a1dd4540d..ebc9a92f7 100644 --- a/assert/http_assertions_test.go +++ b/assert/http_assertions_test.go @@ -86,6 +86,43 @@ func TestHTTPRedirect(t *testing.T) { assert.True(mockT4.Failed()) } +func TestHTTPStatusClasses(t *testing.T) { + t.Parallel() + + for _, tt := range []struct { + code int + success bool + redirect bool + }{ + {199, false, false}, + {http.StatusOK, true, false}, + {http.StatusPartialContent, true, false}, + {http.StatusMultiStatus, true, false}, + {http.StatusAlreadyReported, true, false}, + {http.StatusIMUsed, true, false}, + {299, true, false}, + {http.StatusMultipleChoices, false, true}, + {http.StatusTemporaryRedirect, false, true}, + {http.StatusPermanentRedirect, false, true}, + {399, false, true}, + {http.StatusBadRequest, false, false}, + } { + t.Run(fmt.Sprint(tt.code), func(t *testing.T) { + handler := func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(tt.code) + } + + successT := new(mockTestingT) + Equal(t, tt.success, HTTPSuccess(successT, handler, "GET", "/", nil), "HTTPSuccess") + Equal(t, !tt.success, successT.Failed(), "HTTPSuccess failure") + + redirectT := new(mockTestingT) + Equal(t, tt.redirect, HTTPRedirect(redirectT, handler, "GET", "/", nil), "HTTPRedirect") + Equal(t, !tt.redirect, redirectT.Failed(), "HTTPRedirect failure") + }) + } +} + func TestHTTPError(t *testing.T) { t.Parallel()