1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
package openapi3filter_test
import (
"bytes"
"context"
"encoding/json"
"math"
"math/big"
"net/http"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getkin/kin-openapi/openapi3"
"github.com/getkin/kin-openapi/openapi3filter"
"github.com/getkin/kin-openapi/routers/gorillamux"
)
func TestIntMax(t *testing.T) {
spec := `
openapi: 3.0.0
info:
version: 1.0.0
title: test large integer value
paths:
/test:
post:
requestBody:
content:
application/json:
schema:
type: object
properties:
testInteger:
type: integer
format: int64
testDefault:
type: boolean
default: false
responses:
'200':
description: Successful response
`[1:]
loader := openapi3.NewLoader()
doc, err := loader.LoadFromData([]byte(spec))
require.NoError(t, err)
err = doc.Validate(loader.Context)
require.NoError(t, err)
router, err := gorillamux.NewRouter(doc)
require.NoError(t, err)
testOne := func(value *big.Int, pass bool) {
valueString := value.String()
req, err := http.NewRequest(http.MethodPost, "/test", bytes.NewReader([]byte(`{"testInteger":`+valueString+`}`)))
require.NoError(t, err)
req.Header.Set("Content-Type", "application/json")
route, pathParams, err := router.FindRoute(req)
require.NoError(t, err)
err = openapi3filter.ValidateRequest(
context.Background(),
&openapi3filter.RequestValidationInput{
Request: req,
PathParams: pathParams,
Route: route,
})
if pass {
require.NoError(t, err)
dec := json.NewDecoder(req.Body)
dec.UseNumber()
var jsonAfter map[string]interface{}
err = dec.Decode(&jsonAfter)
require.NoError(t, err)
valueAfter := jsonAfter["testInteger"]
require.IsType(t, json.Number(""), valueAfter)
assert.Equal(t, valueString, string(valueAfter.(json.Number)))
} else {
if assert.Error(t, err) {
var serr *openapi3.SchemaError
if assert.ErrorAs(t, err, &serr) {
assert.Equal(t, "number must be an int64", serr.Reason)
}
}
}
}
bigMaxInt64 := big.NewInt(math.MaxInt64)
bigMaxInt64Plus1 := new(big.Int).Add(bigMaxInt64, big.NewInt(1))
bigMinInt64 := big.NewInt(math.MinInt64)
bigMinInt64Minus1 := new(big.Int).Sub(bigMinInt64, big.NewInt(1))
testOne(bigMaxInt64, true)
// XXX not yet fixed
// testOne(bigMaxInt64Plus1, false)
testOne(bigMaxInt64Plus1, true)
testOne(bigMinInt64, true)
// XXX not yet fixed
// testOne(bigMinInt64Minus1, false)
testOne(bigMinInt64Minus1, true)
}
|