Skip to content
This repository was archived by the owner on Nov 8, 2024. It is now read-only.

Commit 17cfc6d

Browse files
committed
fix(oas3): clone parameter to prevent duplicate instance in tree
1 parent 95df0a9 commit 17cfc6d

File tree

6 files changed

+308
-11
lines changed

6 files changed

+308
-11
lines changed

packages/fury-adapter-oas3-parser/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Fury OAS3 Parser Changelog
22

3+
## Master
4+
5+
### Bug Fixes
6+
7+
- Prevents an exception being raised when using `freeze()` on the parse result
8+
returned by the parser when you reference a parameter component multiple
9+
times in an OpenAPI Document.
10+
311
## 0.7.4 (2019-04-12)
412

513
### Enhancements

packages/fury-adapter-oas3-parser/lib/parser/oas/parseOperationObject.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ function parseOperationObject(context, path, member) {
156156
R.reject(member => !headers.include(member.key.toValue()).isEmpty, headerParameters.content)
157157
);
158158

159-
request.headers = headers;
159+
request.headers = headers.clone();
160160
});
161161
}
162162
}

packages/fury-adapter-oas3-parser/lib/parser/oas/parseParameterObjects.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ function parseParameterObjects(context, name, array) {
2929

3030
// Convert an array of parameters into the correct types
3131
const convertParameters = R.cond([
32-
[isPathOrQuery, member => new namespace.elements.HrefVariables(member.value.content)],
32+
[isPathOrQuery, member => new namespace.elements.HrefVariables(member.value.clone().content)],
3333
// FIXME when headers and cookies are supported these should be converted
34-
[R.T, member => member],
34+
[R.T, member => member.clone()],
3535
]);
3636

3737
const parseParameters = pipeParseResult(namespace,

packages/fury-adapter-oas3-parser/test/integration/components-test.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,21 @@ const testParseFixture = require('./testParseFixture');
44
const fixtures = path.join(__dirname, 'fixtures', 'components');
55

66
describe('components', () => {
7-
it("'Path Item Object' parameter references", () => {
8-
const file = path.join(fixtures, 'path-item-object-parameters');
9-
return testParseFixture(file);
10-
});
11-
12-
it("'Path Item Object' parameter referencing unsupported parameter", () => {
13-
const file = path.join(fixtures, 'path-item-object-parameters-unsupported-parameter');
14-
return testParseFixture(file);
7+
describe('Path Item Object', () => {
8+
it('handles parameter references', () => {
9+
const file = path.join(fixtures, 'path-item-object-parameters');
10+
return testParseFixture(file);
11+
});
12+
13+
it('handles multiple references to same parameter', () => {
14+
const file = path.join(fixtures, 'path-item-object-parameters-multiple');
15+
return testParseFixture(file);
16+
});
17+
18+
it('handles parameter referencing unsupported parameter', () => {
19+
const file = path.join(fixtures, 'path-item-object-parameters-unsupported-parameter');
20+
return testParseFixture(file);
21+
});
1522
});
1623

1724
it("'Media Type Object' schema references", () => {
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
{
2+
"element": "parseResult",
3+
"content": [
4+
{
5+
"element": "category",
6+
"meta": {
7+
"classes": {
8+
"element": "array",
9+
"content": [
10+
{
11+
"element": "string",
12+
"content": "api"
13+
}
14+
]
15+
},
16+
"title": {
17+
"element": "string",
18+
"content": "Parameter Components"
19+
}
20+
},
21+
"attributes": {
22+
"version": {
23+
"element": "string",
24+
"content": "1.0.0"
25+
}
26+
},
27+
"content": [
28+
{
29+
"element": "resource",
30+
"attributes": {
31+
"href": {
32+
"element": "string",
33+
"content": "/1{?skip,limit}"
34+
},
35+
"hrefVariables": {
36+
"element": "hrefVariables",
37+
"content": [
38+
{
39+
"element": "member",
40+
"meta": {
41+
"description": {
42+
"element": "string",
43+
"content": "number of items to skip"
44+
}
45+
},
46+
"attributes": {
47+
"typeAttributes": {
48+
"element": "array",
49+
"content": [
50+
{
51+
"element": "string",
52+
"content": "required"
53+
}
54+
]
55+
}
56+
},
57+
"content": {
58+
"key": {
59+
"element": "string",
60+
"content": "skip"
61+
}
62+
}
63+
},
64+
{
65+
"element": "member",
66+
"meta": {
67+
"description": {
68+
"element": "string",
69+
"content": "max records to return"
70+
}
71+
},
72+
"attributes": {
73+
"typeAttributes": {
74+
"element": "array",
75+
"content": [
76+
{
77+
"element": "string",
78+
"content": "required"
79+
}
80+
]
81+
}
82+
},
83+
"content": {
84+
"key": {
85+
"element": "string",
86+
"content": "limit"
87+
}
88+
}
89+
}
90+
]
91+
}
92+
},
93+
"content": [
94+
{
95+
"element": "transition",
96+
"meta": {
97+
"title": {
98+
"element": "string",
99+
"content": "List all pets"
100+
}
101+
},
102+
"content": [
103+
{
104+
"element": "httpTransaction",
105+
"content": [
106+
{
107+
"element": "httpRequest",
108+
"attributes": {
109+
"method": {
110+
"element": "string",
111+
"content": "GET"
112+
}
113+
}
114+
},
115+
{
116+
"element": "httpResponse",
117+
"attributes": {
118+
"statusCode": {
119+
"element": "string",
120+
"content": "204"
121+
}
122+
},
123+
"content": [
124+
{
125+
"element": "copy",
126+
"content": "no content"
127+
}
128+
]
129+
}
130+
]
131+
}
132+
]
133+
}
134+
]
135+
},
136+
{
137+
"element": "resource",
138+
"attributes": {
139+
"href": {
140+
"element": "string",
141+
"content": "/2{?skip,limit}"
142+
},
143+
"hrefVariables": {
144+
"element": "hrefVariables",
145+
"content": [
146+
{
147+
"element": "member",
148+
"meta": {
149+
"description": {
150+
"element": "string",
151+
"content": "number of items to skip"
152+
}
153+
},
154+
"attributes": {
155+
"typeAttributes": {
156+
"element": "array",
157+
"content": [
158+
{
159+
"element": "string",
160+
"content": "required"
161+
}
162+
]
163+
}
164+
},
165+
"content": {
166+
"key": {
167+
"element": "string",
168+
"content": "skip"
169+
}
170+
}
171+
},
172+
{
173+
"element": "member",
174+
"meta": {
175+
"description": {
176+
"element": "string",
177+
"content": "max records to return"
178+
}
179+
},
180+
"attributes": {
181+
"typeAttributes": {
182+
"element": "array",
183+
"content": [
184+
{
185+
"element": "string",
186+
"content": "required"
187+
}
188+
]
189+
}
190+
},
191+
"content": {
192+
"key": {
193+
"element": "string",
194+
"content": "limit"
195+
}
196+
}
197+
}
198+
]
199+
}
200+
},
201+
"content": [
202+
{
203+
"element": "transition",
204+
"meta": {
205+
"title": {
206+
"element": "string",
207+
"content": "retrieve"
208+
}
209+
},
210+
"content": [
211+
{
212+
"element": "httpTransaction",
213+
"content": [
214+
{
215+
"element": "httpRequest",
216+
"attributes": {
217+
"method": {
218+
"element": "string",
219+
"content": "GET"
220+
}
221+
}
222+
},
223+
{
224+
"element": "httpResponse",
225+
"attributes": {
226+
"statusCode": {
227+
"element": "string",
228+
"content": "204"
229+
}
230+
},
231+
"content": [
232+
{
233+
"element": "copy",
234+
"content": "no content"
235+
}
236+
]
237+
}
238+
]
239+
}
240+
]
241+
}
242+
]
243+
}
244+
]
245+
}
246+
]
247+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
openapi: "3.0.0"
2+
info:
3+
version: 1.0.0
4+
title: Parameter Components
5+
paths:
6+
/1:
7+
parameters:
8+
- $ref: '#/components/parameters/skipParam'
9+
- $ref: '#/components/parameters/limitParam'
10+
get:
11+
summary: List all pets
12+
responses:
13+
'204':
14+
description: no content
15+
/2:
16+
parameters:
17+
- $ref: '#/components/parameters/skipParam'
18+
- $ref: '#/components/parameters/limitParam'
19+
get:
20+
summary: retrieve
21+
responses:
22+
'204':
23+
description: no content
24+
components:
25+
parameters:
26+
skipParam:
27+
name: skip
28+
in: query
29+
description: number of items to skip
30+
required: true
31+
limitParam:
32+
name: limit
33+
in: query
34+
description: max records to return
35+
required: true

0 commit comments

Comments
 (0)