github.com/openfga/openfga@v1.5.4-rc1/pkg/middleware/http/handler_test.go (about) 1 package http 2 3 import ( 4 "context" 5 "io" 6 "net/http" 7 "net/http/httptest" 8 "strings" 9 "testing" 10 11 "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" 12 openfgav1 "github.com/openfga/api/proto/openfga/v1" 13 "github.com/stretchr/testify/require" 14 "google.golang.org/grpc/metadata" 15 16 "github.com/openfga/openfga/pkg/server/errors" 17 ) 18 19 func TestCustomHTTPErrorHandler(t *testing.T) { 20 req := httptest.NewRequest(http.MethodGet, "/upper?word=abc", nil) 21 w := httptest.NewRecorder() 22 e := errors.NewEncodedError(int32(openfgav1.ErrorCode_assertions_too_many_items), "some error") 23 metaData := runtime.ServerMetadata{ 24 HeaderMD: metadata.New(map[string]string{ 25 "foo": "boo", 26 }), 27 TrailerMD: metadata.New(map[string]string{}), 28 } 29 ctx := runtime.NewServerMetadataContext(context.Background(), metaData) 30 CustomHTTPErrorHandler(ctx, w, req, e) 31 res := w.Result() 32 defer res.Body.Close() 33 require.Equal(t, http.StatusBadRequest, res.StatusCode) 34 35 header := res.Header.Get("Foo") 36 require.Equal(t, "boo", header) 37 38 contentType := res.Header.Get("Content-Type") 39 require.Equal(t, "application/json", contentType) 40 41 data, err := io.ReadAll(res.Body) 42 require.NoError(t, err) 43 44 expectedData := "{\"code\":\"assertions_too_many_items\",\"message\":\"some error\"}" 45 require.Equal(t, expectedData, strings.TrimSpace(string(data))) 46 } 47 48 func TestCustomHTTPErrorHandlerSpecialEncoding(t *testing.T) { 49 req := httptest.NewRequest(http.MethodGet, "/upper?word=abc", nil) 50 w := httptest.NewRecorder() 51 e := errors.NewEncodedError(int32(openfgav1.ErrorCode_assertions_too_many_items), "invalid character '<' looking for beginning of value,") 52 metaData := runtime.ServerMetadata{ 53 HeaderMD: metadata.New(map[string]string{ 54 "foo": "boo", 55 }), 56 TrailerMD: metadata.New(map[string]string{}), 57 } 58 ctx := runtime.NewServerMetadataContext(context.Background(), metaData) 59 CustomHTTPErrorHandler(ctx, w, req, e) 60 res := w.Result() 61 defer res.Body.Close() 62 require.Equal(t, http.StatusBadRequest, res.StatusCode) 63 64 header := res.Header.Get("Foo") 65 require.Equal(t, "boo", header) 66 67 contentType := res.Header.Get("Content-Type") 68 require.Equal(t, "application/json", contentType) 69 70 data, err := io.ReadAll(res.Body) 71 require.NoError(t, err) 72 73 expectedData := "{\"code\":\"assertions_too_many_items\",\"message\":\"invalid character '<' looking for beginning of value,\"}" 74 require.Equal(t, expectedData, strings.TrimSpace(string(data))) 75 }