File: issue789_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 (126 lines) | stat: -rw-r--r-- 3,132 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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package openapi3filter_test

import (
	"net/http"
	"strings"
	"testing"

	"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 TestIssue789(t *testing.T) {
	anyOfArraySpec := `
openapi: 3.0.0
info:
  version: 1.0.0
  title: Sample API
paths:
  /items:
    get:
      description: Returns a list of stuff
      parameters:
      - description: test object
        explode: false
        in: query
        name: test
        required: true
        schema:
          type: string
          anyOf:
            - pattern: '\babc\b'
            - pattern: '\bfoo\b'
            - pattern: '\bbar\b'
      responses:
        '200':
          description: Successful response
`[1:]

	oneOfArraySpec := strings.ReplaceAll(anyOfArraySpec, "anyOf", "oneOf")

	allOfArraySpec := strings.ReplaceAll(anyOfArraySpec, "anyOf", "allOf")

	tests := []struct {
		name   string
		spec   string
		req    string
		errStr string
	}{
		{
			name: "success anyof string pattern match",
			spec: anyOfArraySpec,
			req:  "/items?test=abc",
		},
		{
			name:   "failed anyof string pattern match",
			spec:   anyOfArraySpec,
			req:    "/items?test=def",
			errStr: `parameter "test" in query has an error: doesn't match any schema from "anyOf"`,
		},
		{
			name: "success allof object array",
			spec: allOfArraySpec,
			req:  `/items?test=abc foo bar`,
		},
		{
			name:   "failed allof object array",
			spec:   allOfArraySpec,
			req:    `/items?test=foo`,
			errStr: `parameter "test" in query has an error: string doesn't match the regular expression`,
		},
		{
			name: "success oneof string pattern match",
			spec: oneOfArraySpec,
			req:  `/items?test=foo`,
		},
		{
			name:   "failed oneof string pattern match",
			spec:   oneOfArraySpec,
			req:    `/items?test=def`,
			errStr: `parameter "test" in query has an error: doesn't match schema due to: string doesn't match the regular expression`,
		},
		{
			name:   "failed oneof string pattern match",
			spec:   oneOfArraySpec,
			req:    `/items?test=foo bar`,
			errStr: `parameter "test" in query has an error: input matches more than one oneOf schemas`,
		},
	}

	for _, testcase := range tests {
		t.Run(testcase.name, func(t *testing.T) {
			loader := openapi3.NewLoader()
			ctx := loader.Context

			doc, err := loader.LoadFromData([]byte(testcase.spec))
			require.NoError(t, err)

			err = doc.Validate(ctx)
			require.NoError(t, err)

			router, err := gorillamux.NewRouter(doc)
			require.NoError(t, err)
			httpReq, err := http.NewRequest(http.MethodGet, testcase.req, nil)
			require.NoError(t, err)

			route, pathParams, err := router.FindRoute(httpReq)
			require.NoError(t, err)

			requestValidationInput := &openapi3filter.RequestValidationInput{
				Request:    httpReq,
				PathParams: pathParams,
				Route:      route,
			}
			err = openapi3filter.ValidateRequest(ctx, requestValidationInput)
			if testcase.errStr == "" {
				require.NoError(t, err)
			} else {
				require.ErrorContains(t, err, testcase.errStr)
			}
		},
		)
	}
}