Skip to content

Commit d89a84e

Browse files
derbylockAnton Tolokan
andauthored
Fixed recurive reference resolving when property referencies local co… (#660)
Co-authored-by: Anton Tolokan <[email protected]>
1 parent bd74bbf commit d89a84e

File tree

12 files changed

+201
-0
lines changed

12 files changed

+201
-0
lines changed

openapi3/loader.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,10 @@ func (loader *Loader) resolveSchemaRef(doc *T, component *SchemaRef, documentPat
748748
}
749749
documentPath = loader.documentPathForRecursiveRef(documentPath, foundPath)
750750
}
751+
if loader.visitedSchema == nil {
752+
loader.visitedSchema = make(map[*Schema]struct{})
753+
}
754+
loader.visitedSchema[component.Value] = struct{}{}
751755
}
752756
value := component.Value
753757
if value == nil {

openapi3/loader_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,29 @@ func TestLoadWithReferenceInReference(t *testing.T) {
263263
require.Equal(t, "string", doc.Paths["/api/test/ref/in/ref"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Properties["definition_reference"].Value.Type)
264264
}
265265

266+
func TestLoadWithRecursiveReferenceInLocalReferenceInParentSubdir(t *testing.T) {
267+
loader := NewLoader()
268+
loader.IsExternalRefsAllowed = true
269+
doc, err := loader.LoadFromFile("testdata/refInLocalRefInParentsSubdir/spec/openapi.json")
270+
require.NoError(t, err)
271+
require.NotNil(t, doc)
272+
err = doc.Validate(loader.Context)
273+
require.NoError(t, err)
274+
require.Equal(t, "object", doc.Paths["/api/test/ref/in/ref"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Properties["definition_reference"].Value.Type)
275+
}
276+
277+
func TestLoadWithRecursiveReferenceInRefrerenceInLocalReference(t *testing.T) {
278+
loader := NewLoader()
279+
loader.IsExternalRefsAllowed = true
280+
doc, err := loader.LoadFromFile("testdata/refInLocalRef/openapi.json")
281+
require.NoError(t, err)
282+
require.NotNil(t, doc)
283+
err = doc.Validate(loader.Context)
284+
require.NoError(t, err)
285+
require.Equal(t, "integer", doc.Paths["/api/test/ref/in/ref"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Properties["data"].Value.Properties["definition_reference"].Value.Properties["ref_prop_part"].Value.Properties["idPart"].Value.Type)
286+
require.Equal(t, "int64", doc.Paths["/api/test/ref/in/ref"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Properties["data"].Value.Properties["definition_reference"].Value.Properties["ref_prop_part"].Value.Properties["idPart"].Value.Format)
287+
}
288+
266289
func TestLoadWithReferenceInReferenceInProperty(t *testing.T) {
267290
loader := NewLoader()
268291
loader.IsExternalRefsAllowed = true
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"type": "object",
3+
"properties": {
4+
"id": {
5+
"type": "integer",
6+
"format": "int32"
7+
},
8+
"ref_prop_part": {
9+
"$ref": "./dataPart.json"
10+
}
11+
}
12+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "object",
3+
"properties": {
4+
"idPart": {
5+
"type": "integer",
6+
"format": "int64"
7+
}
8+
}
9+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"type": "object",
3+
"required": [
4+
"definition_reference"
5+
],
6+
"properties": {
7+
"definition_reference": {
8+
"$ref": "./data.json"
9+
}
10+
}
11+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "object",
3+
"properties": {
4+
"id": {
5+
"type": "integer",
6+
"format": "int32"
7+
}
8+
}
9+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"openapi": "3.0.3",
3+
"info": {
4+
"title": "Reference in reference example",
5+
"version": "1.0.0"
6+
},
7+
"paths": {
8+
"/api/test/ref/in/ref": {
9+
"post": {
10+
"requestBody": {
11+
"content": {
12+
"application/json": {
13+
"schema": {
14+
"type": "object",
15+
"properties" : {
16+
"data": {
17+
"$ref": "#/components/schemas/Request"
18+
}
19+
}
20+
}
21+
}
22+
}
23+
},
24+
"responses": {
25+
"200": {
26+
"description": "Successful response",
27+
"content": {
28+
"application/json": {
29+
"schema": {
30+
"$ref": "messages/response.json"
31+
}
32+
}
33+
}
34+
}
35+
}
36+
}
37+
}
38+
},
39+
"components": {
40+
"schemas": {
41+
"Request": {
42+
"$ref": "messages/request.json"
43+
}
44+
}
45+
}
46+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"type": "object",
3+
"properties": {
4+
"id": {
5+
"type": "integer",
6+
"format": "int32"
7+
},
8+
"ref_prop_part": {
9+
"$ref": "./dataPart.json"
10+
}
11+
}
12+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "object",
3+
"properties": {
4+
"idPart": {
5+
"type": "integer",
6+
"format": "int64"
7+
}
8+
}
9+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"type": "object",
3+
"required": [
4+
"definition_reference"
5+
],
6+
"properties": {
7+
"definition_reference": {
8+
"$ref": "./data.json"
9+
}
10+
}
11+
}

0 commit comments

Comments
 (0)