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

Commit ad2b20a

Browse files
committed
fix(oas3): referenced data structures are now correct type
1 parent 3430c0d commit ad2b20a

File tree

6 files changed

+136
-2
lines changed

6 files changed

+136
-2
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212

1313
- Added support for header parameters.
1414

15+
- Instances of referenced data structures will now be instances of the
16+
referenced type.
17+
18+
For example, given a schema named 'username' contains `type: string`.
19+
When another data structure references the 'username' schema, it's instance
20+
will be a `StringElement`.
21+
1522
### Bug Fixes
1623

1724
- Prevents an exception being raised due to improper handling of invalid

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,16 @@ function parseReferenceObject(context, componentName, element, returnReferenceEl
5959
}
6060

6161
if (returnReferenceElement) {
62-
const element = new context.namespace.elements.Element();
62+
let Element;
63+
64+
const referenced = component.get(componentId);
65+
if (referenced instanceof context.namespace.elements.DataStructure) {
66+
Element = referenced.content.constructor;
67+
} else {
68+
({ Element } = context.namespace.elements);
69+
}
70+
71+
const element = new Element();
6372
element.element = componentId;
6473
return element;
6574
}

packages/fury-adapter-oas3-parser/test/integration/fixtures/components/media-type-object-schema.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,27 @@
8282
}
8383
},
8484
"content": [
85+
{
86+
"element": "asset",
87+
"meta": {
88+
"classes": {
89+
"element": "array",
90+
"content": [
91+
{
92+
"element": "string",
93+
"content": "messageBody"
94+
}
95+
]
96+
}
97+
},
98+
"attributes": {
99+
"contentType": {
100+
"element": "string",
101+
"content": "application/json"
102+
}
103+
},
104+
"content": "{}"
105+
},
85106
{
86107
"element": "dataStructure",
87108
"content": {

packages/fury-adapter-oas3-parser/test/integration/fixtures/petstore.json

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,27 @@
135135
}
136136
},
137137
"content": [
138+
{
139+
"element": "asset",
140+
"meta": {
141+
"classes": {
142+
"element": "array",
143+
"content": [
144+
{
145+
"element": "string",
146+
"content": "messageBody"
147+
}
148+
]
149+
}
150+
},
151+
"attributes": {
152+
"contentType": {
153+
"element": "string",
154+
"content": "application/json"
155+
}
156+
},
157+
"content": "[]"
158+
},
138159
{
139160
"element": "dataStructure",
140161
"content": {
@@ -289,6 +310,27 @@
289310
}
290311
},
291312
"content": [
313+
{
314+
"element": "asset",
315+
"meta": {
316+
"classes": {
317+
"element": "array",
318+
"content": [
319+
{
320+
"element": "string",
321+
"content": "messageBody"
322+
}
323+
]
324+
}
325+
},
326+
"attributes": {
327+
"contentType": {
328+
"element": "string",
329+
"content": "application/json"
330+
}
331+
},
332+
"content": "[]"
333+
},
292334
{
293335
"element": "dataStructure",
294336
"content": {

packages/fury-adapter-oas3-parser/test/integration/fixtures/petstore.sourcemap.json

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,27 @@
385385
}
386386
},
387387
"content": [
388+
{
389+
"element": "asset",
390+
"meta": {
391+
"classes": {
392+
"element": "array",
393+
"content": [
394+
{
395+
"element": "string",
396+
"content": "messageBody"
397+
}
398+
]
399+
}
400+
},
401+
"attributes": {
402+
"contentType": {
403+
"element": "string",
404+
"content": "application/json"
405+
}
406+
},
407+
"content": "[]"
408+
},
388409
{
389410
"element": "dataStructure",
390411
"content": {
@@ -814,6 +835,27 @@
814835
}
815836
},
816837
"content": [
838+
{
839+
"element": "asset",
840+
"meta": {
841+
"classes": {
842+
"element": "array",
843+
"content": [
844+
{
845+
"element": "string",
846+
"content": "messageBody"
847+
}
848+
]
849+
}
850+
},
851+
"attributes": {
852+
"contentType": {
853+
"element": "string",
854+
"content": "application/json"
855+
}
856+
},
857+
"content": "[]"
858+
},
817859
{
818860
"element": "dataStructure",
819861
"content": {

packages/fury-adapter-oas3-parser/test/unit/parser/oas/parseReferenceObject-test.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ describe('Reference Object', () => {
1414

1515
dataStructure = new namespace.elements.DataStructure();
1616
dataStructure.id = 'Node';
17+
dataStructure.content = new namespace.elements.Object();
1718

1819
context.state.components = new namespace.elements.Object({
1920
schemas: {
@@ -22,7 +23,6 @@ describe('Reference Object', () => {
2223
});
2324
});
2425

25-
2626
it('errors when parsing non-string $ref', () => {
2727
const reference = new namespace.elements.Object({
2828
$ref: true,
@@ -43,6 +43,19 @@ describe('Reference Object', () => {
4343
expect(structure).to.equal(dataStructure);
4444
});
4545

46+
it('can parse a reference and return reference', () => {
47+
const reference = new namespace.elements.Object({
48+
$ref: '#/components/schemas/Node',
49+
});
50+
const parseResult = parse(context, 'schemas', reference, true);
51+
52+
expect(parseResult.length).to.equal(1);
53+
54+
const structure = parseResult.get(0);
55+
expect(structure.element).to.equal('Node');
56+
expect(structure).to.be.instanceof(namespace.elements.Object);
57+
});
58+
4659
it('can parse a reference to a component with multiple values', () => {
4760
context.state.components.set('requestBodies', new namespace.elements.Object([
4861
new namespace.elements.Member('Example', new namespace.elements.HttpRequest()),

0 commit comments

Comments
 (0)