Skip to content

Commit d72d75b

Browse files
openapi3: resolve refs in parameter examples (#1086)
1 parent 2de45f7 commit d72d75b

File tree

3 files changed

+167
-0
lines changed

3 files changed

+167
-0
lines changed

openapi3/example_refs_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package openapi3_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/getkin/kin-openapi/openapi3"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestParameterExampleRef(t *testing.T) {
11+
loader := openapi3.NewLoader()
12+
doc, err := loader.LoadFromFile("testdata/example_refs.yml")
13+
require.NoError(t, err)
14+
err = doc.Validate(loader.Context)
15+
require.NoError(t, err)
16+
param := doc.Paths.Value("/test").Post.Parameters[0].Value
17+
require.NotNil(t, param, "Parameter should not be nil")
18+
require.NotNil(t, param.Examples["Test"].Value, "Parameter example should not be nil")
19+
require.Equal(t, "An example", param.Examples["Test"].Value.Summary)
20+
}
21+
22+
func TestParameterExampleWithContentRef(t *testing.T) {
23+
loader := openapi3.NewLoader()
24+
doc, err := loader.LoadFromFile("testdata/example_refs.yml")
25+
require.NoError(t, err)
26+
err = doc.Validate(loader.Context)
27+
require.NoError(t, err)
28+
param := doc.Paths.Value("/test").Post.Parameters[1].Value
29+
require.NotNil(t, param, "Parameter should not be nil")
30+
require.NotNil(t, param.Content["application/json"].Examples["Test"].Value, "Parameter example should not be nil")
31+
require.Equal(t, "An example", param.Content["application/json"].Examples["Test"].Value.Summary)
32+
}
33+
34+
func TestRequestBodyExampleRef(t *testing.T) {
35+
loader := openapi3.NewLoader()
36+
doc, err := loader.LoadFromFile("testdata/example_refs.yml")
37+
require.NoError(t, err)
38+
err = doc.Validate(loader.Context)
39+
require.NoError(t, err)
40+
requestBody := doc.Paths.Value("/test").Post.RequestBody.Value
41+
require.NotNil(t, requestBody, "Request body should not be nil")
42+
require.NotNil(t, requestBody.Content["application/json"].Examples["Test"].Value, "Request body example should not be nil")
43+
require.Equal(t, "An example", requestBody.Content["application/json"].Examples["Test"].Value.Summary)
44+
}
45+
46+
func TestResponseExampleRef(t *testing.T) {
47+
loader := openapi3.NewLoader()
48+
doc, err := loader.LoadFromFile("testdata/example_refs.yml")
49+
require.NoError(t, err)
50+
err = doc.Validate(loader.Context)
51+
require.NoError(t, err)
52+
response := doc.Paths.Value("/test").Post.Responses.Value("200").Value
53+
require.NotNil(t, response, "Response should not be nil")
54+
require.NotNil(t, response.Content["application/json"].Examples["Test"].Value, "Response example should not be nil")
55+
require.Equal(t, "An example", response.Content["application/json"].Examples["Test"].Value.Summary)
56+
}
57+
58+
func TestHeaderExampleRef(t *testing.T) {
59+
loader := openapi3.NewLoader()
60+
doc, err := loader.LoadFromFile("testdata/example_refs.yml")
61+
require.NoError(t, err)
62+
err = doc.Validate(loader.Context)
63+
require.NoError(t, err)
64+
response := doc.Paths.Value("/test").Post.Responses.Value("200").Value
65+
header := response.Headers["X-Test-Header"].Value
66+
require.NotNil(t, header, "Header should not be nil")
67+
require.NotNil(t, header.Examples["Test"].Value, "Header example should not be nil")
68+
require.Equal(t, "An example", header.Examples["Test"].Value.Summary)
69+
}
70+
71+
func TestComponentExampleRef(t *testing.T) {
72+
loader := openapi3.NewLoader()
73+
doc, err := loader.LoadFromFile("testdata/example_refs.yml")
74+
require.NoError(t, err)
75+
err = doc.Validate(loader.Context)
76+
require.NoError(t, err)
77+
example := doc.Components.Examples["RefExample"].Value
78+
require.NotNil(t, example, "Example should not be nil")
79+
require.Equal(t, "An example", example.Summary)
80+
}

openapi3/loader.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,11 @@ func (loader *Loader) resolveHeaderRef(doc *T, component *HeaderRef, documentPat
657657
return err
658658
}
659659
}
660+
for _, example := range value.Examples {
661+
if err := loader.resolveExampleRef(doc, example, documentPath); err != nil {
662+
return err
663+
}
664+
}
660665
return nil
661666
}
662667

@@ -716,12 +721,22 @@ func (loader *Loader) resolveParameterRef(doc *T, component *ParameterRef, docum
716721
return err
717722
}
718723
}
724+
for _, example := range contentType.Examples {
725+
if err := loader.resolveExampleRef(doc, example, documentPath); err != nil {
726+
return err
727+
}
728+
}
719729
}
720730
if schema := value.Schema; schema != nil {
721731
if err := loader.resolveSchemaRef(doc, schema, documentPath, []string{}); err != nil {
722732
return err
723733
}
724734
}
735+
for _, example := range value.Examples {
736+
if err := loader.resolveExampleRef(doc, example, documentPath); err != nil {
737+
return err
738+
}
739+
}
725740
return nil
726741
}
727742

openapi3/testdata/example_refs.yml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
openapi: 3.0.3
2+
info:
3+
title: Test API
4+
version: 1.0.0
5+
paths:
6+
/test:
7+
post:
8+
summary: Test endpoint
9+
parameters:
10+
- $ref: '#/components/parameters/TestParameter'
11+
- $ref: '#/components/parameters/TestParameterWithContent'
12+
requestBody:
13+
$ref: '#/components/requestBodies/TestBody'
14+
responses:
15+
'200':
16+
$ref: '#/components/responses/TestResponse'
17+
components:
18+
examples:
19+
TestExample:
20+
summary: An example
21+
value: 'hello'
22+
RefExample:
23+
$ref: '#/components/examples/TestExample'
24+
headers:
25+
TestHeader:
26+
description: A test header
27+
schema:
28+
type: string
29+
examples:
30+
Test:
31+
$ref: '#/components/examples/TestExample'
32+
parameters:
33+
TestParameter:
34+
name: test
35+
in: query
36+
schema:
37+
type: string
38+
examples:
39+
Test:
40+
$ref: '#/components/examples/TestExample'
41+
TestParameterWithContent:
42+
name: testContent
43+
in: query
44+
content:
45+
application/json:
46+
schema:
47+
type: string
48+
examples:
49+
Test:
50+
$ref: '#/components/examples/TestExample'
51+
requestBodies:
52+
TestBody:
53+
content:
54+
application/json:
55+
schema:
56+
type: string
57+
examples:
58+
Test:
59+
$ref: '#/components/examples/TestExample'
60+
responses:
61+
TestResponse:
62+
description: A test response
63+
headers:
64+
X-Test-Header:
65+
$ref: '#/components/headers/TestHeader'
66+
content:
67+
application/json:
68+
schema:
69+
type: string
70+
examples:
71+
Test:
72+
$ref: '#/components/examples/TestExample'

0 commit comments

Comments
 (0)