github.com/PDOK/gokoala@v0.50.6/internal/engine/router_test.go (about) 1 package engine 2 3 import ( 4 "net/http" 5 "net/http/httptest" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestUnexpectedProblemRecoverer(t *testing.T) { 12 // given 13 defer func() { 14 _ = recover() 15 }() 16 w := httptest.NewRecorder() 17 18 r := newRouter("1.2.3", true, false) 19 r.Get("/panic", func(_ http.ResponseWriter, _ *http.Request) { 20 panic("oops") 21 }) 22 23 req, err := http.NewRequest(http.MethodGet, "/panic", nil) 24 if err != nil { 25 t.Fatal(err) 26 } 27 28 // when 29 r.ServeHTTP(w, req) 30 31 // then 32 assert.Contains(t, w.Body.String(), "{\"detail\":\"An unexpected error has occurred, try again or contact support if the problem persists\",\"status\":500,") 33 } 34 35 func TestExpectedProblemRecoverer(t *testing.T) { 36 // given 37 defer func() { 38 _ = recover() 39 }() 40 w := httptest.NewRecorder() 41 42 tests := []struct { 43 name string 44 path string 45 handlerFunc http.HandlerFunc 46 bodyContains string 47 }{ 48 {"Bad request", "/panic", func(_ http.ResponseWriter, _ *http.Request) { RenderProblem(ProblemBadRequest, w, "foo bar baz") }, "{\"detail\":\"foo bar baz\",\"status\":400,"}, 49 {"Bad gateway", "/noproxy", func(_ http.ResponseWriter, _ *http.Request) { RenderProblem(ProblemBadGateway, w) }, "{\"detail\":\"Failed to proxy request, try again or contact support if the problem persists\",\"status\":502,"}, 50 } 51 for _, tt := range tests { 52 t.Run(tt.name, func(t *testing.T) { 53 r := newRouter("1.2.3", true, false) 54 r.Get(tt.path, tt.handlerFunc) 55 56 req, err := http.NewRequest(http.MethodGet, tt.path, nil) 57 if err != nil { 58 t.Fatal(err) 59 } 60 61 // when 62 r.ServeHTTP(w, req) 63 64 // then 65 assert.Contains(t, w.Body.String(), tt.bodyContains) 66 }) 67 } 68 } 69 70 func TestAbortRecoverer(t *testing.T) { 71 defer func() { 72 // then 73 rcv := recover() 74 if rcv != http.ErrAbortHandler { //nolint:errorlint // already so in Chi 75 t.Fatalf("http.ErrAbortHandler should not be recovered") 76 } 77 }() 78 79 // given 80 w := httptest.NewRecorder() 81 82 r := newRouter("1.2.3", true, false) 83 r.Get("/panic", func(_ http.ResponseWriter, _ *http.Request) { 84 panic(http.ErrAbortHandler) 85 }) 86 87 req, err := http.NewRequest(http.MethodGet, "/panic", nil) 88 if err != nil { 89 t.Fatal(err) 90 } 91 92 // when 93 r.ServeHTTP(w, req) 94 }