From 41a47c757dca86ec0684b060bdd1d3c4d55cc81f Mon Sep 17 00:00:00 2001 From: Grégoire Duchêne Date: Sat, 18 Jun 2022 12:52:57 +0100 Subject: Add FilterHTTPMethod and FilteringHTTPHandler --- http_test.go | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 http_test.go (limited to 'http_test.go') diff --git a/http_test.go b/http_test.go new file mode 100644 index 0000000..a8c3cb5 --- /dev/null +++ b/http_test.go @@ -0,0 +1,97 @@ +// SPDX-FileCopyrightText: © 2022 Grégoire Duchêne +// SPDX-License-Identifier: ISC + +package core_test + +import ( + "net/http" + "net/http/httptest" + "testing" + + "go.awhk.org/core" +) + +func TestFilteringHTTPHandler(s *testing.T) { + t := core.T{T: s} + + handler := core.FilteringHTTPHandler( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) }), + core.FilterHTTPMethod(http.MethodHead), + ) + for _, tc := range []struct { + name string + method string + + expHeader http.Header + expStatusCode int + }{ + { + name: "Success", + method: http.MethodHead, + + expHeader: http.Header{}, + expStatusCode: http.StatusOK, + }, + { + name: "WhenFiltered", + method: http.MethodGet, + + expHeader: http.Header{"Allowed": {"HEAD"}}, + expStatusCode: http.StatusMethodNotAllowed, + }, + } { + t.Run(tc.name, func(t *core.T) { + var ( + req = httptest.NewRequest(tc.method, "/", nil) + w = httptest.NewRecorder() + ) + handler.ServeHTTP(w, req) + + res := w.Result() + t.AssertEqual(tc.expHeader, res.Header) + t.AssertEqual(tc.expStatusCode, res.StatusCode) + }) + } +} + +func TestFilterHTTPMethod(s *testing.T) { + t := core.T{T: s} + + filter := core.FilterHTTPMethod(http.MethodPost, http.MethodGet) + for _, tc := range []struct { + name string + method string + + expAllowed string + expFiltered bool + expStatusCode int + }{ + { + name: "Success", + method: http.MethodPost, + + expFiltered: false, + expStatusCode: http.StatusOK, + }, + { + name: "WhenFiltered", + method: http.MethodHead, + + expAllowed: "GET, POST", + expFiltered: true, + expStatusCode: http.StatusMethodNotAllowed, + }, + } { + t.Run(tc.name, func(t *core.T) { + var ( + req = httptest.NewRequest(tc.method, "/", nil) + w = httptest.NewRecorder() + ) + t.AssertEqual(tc.expFiltered, filter(w, req)) + + res := w.Result() + t.AssertEqual(tc.expAllowed, res.Header.Get("Allowed")) + t.AssertEqual(tc.expStatusCode, res.StatusCode) + }) + } +} -- cgit v1.2.3-70-g09d2