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  }