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  }