File: issue733_test.go

package info (click to toggle)
golang-github-getkin-kin-openapi 0.124.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,288 kB
  • sloc: sh: 344; makefile: 4
file content (109 lines) | stat: -rw-r--r-- 2,672 bytes parent folder | download | duplicates (3)
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)
}