...

Source file src/github.com/go-openapi/runtime/middleware/body_test.go

Documentation: github.com/go-openapi/runtime/middleware

     1  package middleware
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  	"net/http"
     7  	"path"
     8  	"testing"
     9  
    10  	"github.com/go-openapi/runtime"
    11  	"github.com/go-openapi/runtime/internal/testing/petstore"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  type eofReader struct {
    17  }
    18  
    19  func (r *eofReader) Read(_ []byte) (int, error) {
    20  	return 0, io.EOF
    21  }
    22  
    23  func (r *eofReader) Close() error {
    24  	return nil
    25  }
    26  
    27  type rbn func(*http.Request, *MatchedRoute) error
    28  
    29  func (b rbn) BindRequest(r *http.Request, rr *MatchedRoute) error {
    30  	return b(r, rr)
    31  }
    32  
    33  func TestBindRequest_BodyValidation(t *testing.T) {
    34  	spec, api := petstore.NewAPI(t)
    35  	ctx := NewContext(spec, api, nil)
    36  	api.DefaultConsumes = runtime.JSONMime
    37  	ctx.router = DefaultRouter(spec, ctx.api)
    38  
    39  	req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, path.Join(spec.BasePath(), "/pets"), new(eofReader))
    40  	require.NoError(t, err)
    41  	req.Header.Set("Content-Type", runtime.JSONMime)
    42  
    43  	ri, rCtx, ok := ctx.RouteInfo(req)
    44  	require.True(t, ok)
    45  	req = rCtx
    46  
    47  	err = ctx.BindValidRequest(req, ri, rbn(func(r *http.Request, _ *MatchedRoute) error {
    48  		defer r.Body.Close()
    49  		var data interface{}
    50  		e := runtime.JSONConsumer().Consume(r.Body, &data)
    51  		_ = data
    52  		return e
    53  	}))
    54  	require.Error(t, err)
    55  	assert.Equal(t, io.EOF, err)
    56  }
    57  
    58  func TestBindRequest_DeleteNoBody(t *testing.T) {
    59  	spec, api := petstore.NewAPI(t)
    60  	ctx := NewContext(spec, api, nil)
    61  	api.DefaultConsumes = runtime.JSONMime
    62  	ctx.router = DefaultRouter(spec, ctx.api)
    63  
    64  	req, err := http.NewRequestWithContext(context.Background(), http.MethodDelete, path.Join(spec.BasePath(), "/pets/123"), new(eofReader))
    65  	require.NoError(t, err)
    66  
    67  	req.Header.Set("Accept", "*/*")
    68  	ri, rCtx, ok := ctx.RouteInfo(req)
    69  	require.True(t, ok)
    70  	req = rCtx
    71  
    72  	err = ctx.BindValidRequest(req, ri, rbn(func(_ *http.Request, _ *MatchedRoute) error {
    73  		return nil
    74  	}))
    75  	require.NoError(t, err)
    76  	// assert.Equal(t, io.EOF, bverr)
    77  
    78  	req, err = http.NewRequestWithContext(context.Background(), http.MethodDelete, path.Join(spec.BasePath(), "/pets/123"), new(eofReader))
    79  	require.NoError(t, err)
    80  	req.Header.Set("Accept", "*/*")
    81  	req.Header.Set("Content-Type", runtime.JSONMime)
    82  	req.ContentLength = 1
    83  
    84  	ri, rCtx, ok = ctx.RouteInfo(req)
    85  	require.True(t, ok)
    86  	req = rCtx
    87  
    88  	err = ctx.BindValidRequest(req, ri, rbn(func(r *http.Request, _ *MatchedRoute) error {
    89  		defer r.Body.Close()
    90  		var data interface{}
    91  		e := runtime.JSONConsumer().Consume(r.Body, &data)
    92  		_ = data
    93  		return e
    94  	}))
    95  	require.Error(t, err)
    96  	assert.Equal(t, io.EOF, err)
    97  }
    98  

View as plain text