1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package rest
- import (
- "errors"
- "io"
- "net/http/httptest"
- "testing"
- )
- func TestErrorWriteJSON(t *testing.T) {
- type TestCase struct {
- Input Error
- C int
- Output string
- Err error
- }
- testCases := []TestCase{
- // Empty error
- {Input: Err, C: 200, Output: `{"message":""}`},
- // Standard errors
- {Input: ErrPermanentRedirect, C: 308, Output: `{"message":"Permanent Redirect"}`},
- {Input: ErrNotFound, C: 404, Output: `{"message":"Not Found"}`},
- {Input: ErrInternalServerError, C: 500, Output: `{"message":"Internal Server Error"}`},
- // Error with changed message
- {Input: ErrBadRequest.WithMessage("Invalid Recipe"), C: 400, Output: `{"message":"Invalid Recipe"}`},
- // Error with data
- {
- Input: ErrGatewayTimeout.WithData(map[string]any{"service": "RecipeDatabase"}),
- C: 504,
- Output: `{"message":"Gateway Timeout","data":{"service":"RecipeDatabase"}}`,
- },
- // Error with value
- {
- Input: ErrGatewayTimeout.WithValue("service", "RecipeDatabase"),
- C: 504,
- Output: `{"message":"Gateway Timeout","data":{"service":"RecipeDatabase"}}`,
- },
- // Error with error
- {
- Input: ErrInternalServerError.WithError(errors.New("recipe is too delicious")),
- C: 500,
- Output: `{"message":"Internal Server Error","data":{"error":"recipe is too delicious"}}`,
- },
- }
- for i, tc := range testCases {
- t.Logf("(%d) Testing %v", i, tc.Input)
- rec := httptest.NewRecorder()
- err := tc.Input.WriteJSON(rec)
- if err != tc.Err {
- t.Errorf("Expected error %v, got %v", tc.Err, err)
- }
- if err != nil {
- continue
- }
- res := rec.Result()
- if res.StatusCode != tc.C {
- t.Errorf("Expected status code %d, got %d", tc.C, res.StatusCode)
- }
- body, err := io.ReadAll(res.Body)
- if err != nil {
- t.Errorf("Unexpected error reading response body: %v", err)
- continue
- }
- if string(body) != tc.Output {
- t.Errorf("Expected body %q, got %q", tc.Output, string(body))
- }
- }
- }
|