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

Commit 1587583

Browse files
pksunkarakylef
andcommitted
fix(oas3): apply suggestions from code review
Co-Authored-By: Kyle Fuller <[email protected]>
1 parent 9565020 commit 1587583

File tree

6 files changed

+62
-41
lines changed

6 files changed

+62
-41
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ Key:
7272
| responses | [~](#responses-object) |
7373
| callbacks | [](https://github.com/apiaryio/api-elements.js/issues/74) |
7474
| deprecated ||
75-
| security | |
75+
| security | [](https://github.com/apiaryio/api-elements.js/issues/329) |
7676
| servers | [](https://github.com/apiaryio/api-elements.js/issues/76) |
7777

7878
## Parameter Object

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ function parseOASObject(context, object) {
130130
if (components) {
131131
const schemes = R.or(components.get('securitySchemes'), new namespace.elements.Array());
132132

133-
if (schemes.length > 0) {
133+
if (!schemes.isEmpty) {
134134
api.push(new namespace.elements.Category(
135135
schemes.content, { classes: ['authSchemes'] }
136136
));

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,12 @@ function parseOperationObject(context, path, member) {
112112
return requirement.get(0);
113113
}
114114

115-
const allOf = new namespace.elements.Array(requirement.content);
116-
allOf.element = 'allOf';
115+
const link = new namespace.elements.Link();
116+
link.relation = 'profile';
117+
link.href = 'https://github.com/refractproject/rfcs/issues/39';
118+
119+
const allOf = new namespace.elements.Extension(requirement.content);
120+
allOf.meta.set('links', new namespace.elements.Array([link]));
117121

118122
return allOf;
119123
}));

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

+23-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ const name = 'Security Scheme Object';
1616
const requiredKeys = ['type'];
1717
const unsupportedKeys = ['bearerFormat', 'openIdConnectUrl'];
1818
const isUnsupportedKey = R.anyPass(R.map(hasKey, unsupportedKeys));
19-
const passThrough = R.anyPass(R.map(hasKey, ['name', 'in', 'scheme', 'flows']));
19+
const outerPassThrough = R.anyPass(R.map(hasKey, ['name', 'in', 'scheme', 'flows']));
20+
const innerPassThrough = R.anyPass(R.map(hasKey, ['type', 'description']));
2021

2122
const isApiKeyScheme = securityScheme => securityScheme.getValue('type') === 'apiKey';
2223
const isHttpScheme = securityScheme => securityScheme.getValue('type') === 'http';
@@ -43,27 +44,43 @@ function validateApiKeyScheme(context, securityScheme) {
4344
[hasKey('name'), parseString(context, name, false)],
4445
[hasKey('in'), parseIn],
4546

46-
[R.T, e => e],
47+
[innerPassThrough, e => e],
48+
[isUnsupportedKey, e => e],
49+
[isExtension, e => e],
50+
51+
[R.T, createInvalidMemberWarning(namespace, `${name}' 'apiKey`)],
4752
]);
4853

4954
return parseObject(context, name, parseMember, ['name', 'in'], [], true)(securityScheme);
5055
}
5156

5257
function validateHttpScheme(context, securityScheme) {
58+
const { namespace } = context;
59+
5360
const parseMember = R.cond([
5461
[hasKey('scheme'), parseString(context, name, false)],
5562

56-
[R.T, e => e],
63+
[innerPassThrough, e => e],
64+
[isUnsupportedKey, e => e],
65+
[isExtension, e => e],
66+
67+
[R.T, createInvalidMemberWarning(namespace, `${name}' 'http`)],
5768
]);
5869

5970
return parseObject(context, name, parseMember, ['scheme'], [], true)(securityScheme);
6071
}
6172

6273
function validateOauth2Scheme(context, securityScheme) {
74+
const { namespace } = context;
75+
6376
const parseMember = R.cond([
6477
[hasKey('flows'), R.compose(parseOauthFlowsObject(context), getValue)],
6578

66-
[R.T, e => e],
79+
[innerPassThrough, e => e],
80+
[isUnsupportedKey, e => e],
81+
[isExtension, e => e],
82+
83+
[R.T, createInvalidMemberWarning(namespace, `${name}' 'oauth2`)],
6784
]);
6885

6986
return parseObject(context, name, parseMember, ['flows'], [], true)(securityScheme);
@@ -100,7 +117,7 @@ function parseSecuritySchemeObject(context, object) {
100117
const parseMember = R.cond([
101118
[hasKey('type'), parseType],
102119
[hasKey('description'), parseString(context, name, false)],
103-
[passThrough, e => e],
120+
[outerPassThrough, e => e],
104121

105122
[isUnsupportedKey, createUnsupportedMemberWarning(namespace, name)],
106123

@@ -129,7 +146,7 @@ function parseSecuritySchemeObject(context, object) {
129146
if (description) {
130147
flows.forEach((flow) => {
131148
// eslint-disable-next-line no-param-reassign
132-
flow.description = description;
149+
flow.description = description.clone();
133150
});
134151
}
135152

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

+7-7
Original file line numberDiff line numberDiff line change
@@ -574,13 +574,13 @@ describe('Operation Object', () => {
574574
expect(authSchemes.length).to.equal(2);
575575
expect(authSchemes.get(0)).to.be.instanceof(namespace.elements.AuthScheme);
576576
expect(authSchemes.get(0).element).to.equal('apiKey');
577-
expect(authSchemes.get(1)).to.be.instanceof(namespace.elements.Array);
578-
expect(authSchemes.get(1).element).to.equal('allOf');
579-
expect(authSchemes.get(1).length).to.equal(2);
580-
expect(authSchemes.get(1).get(0)).to.be.instanceof(namespace.elements.AuthScheme);
581-
expect(authSchemes.get(1).get(0).element).to.equal('custom1');
582-
expect(authSchemes.get(1).get(1)).to.be.instanceof(namespace.elements.AuthScheme);
583-
expect(authSchemes.get(1).get(1).element).to.equal('custom2');
577+
expect(authSchemes.get(1)).to.be.instanceof(namespace.elements.Extension);
578+
expect(authSchemes.get(1).content.length).to.equal(2);
579+
// TODO: Remove content[n] and use get(n) when moved to allOf element
580+
expect(authSchemes.get(1).content[0]).to.be.instanceof(namespace.elements.AuthScheme);
581+
expect(authSchemes.get(1).content[0].element).to.equal('custom1');
582+
expect(authSchemes.get(1).content[1]).to.be.instanceof(namespace.elements.AuthScheme);
583+
expect(authSchemes.get(1).content[1].element).to.equal('custom2');
584584
});
585585
});
586586

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

+24-24
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ describe('Security Scheme Object', () => {
241241
expect(members.get(0).value.toValue()).to.equal('example');
242242
});
243243

244-
it('does not complain about scheme', () => {
244+
it('provides warning for invalid scheme', () => {
245245
const securityScheme = new namespace.elements.Object({
246246
type: 'apiKey',
247247
name: 'example',
@@ -251,11 +251,11 @@ describe('Security Scheme Object', () => {
251251

252252
const parseResult = parse(context, securityScheme);
253253

254-
expect(parseResult.length).to.equal(1);
255-
expect(parseResult).to.not.contain.annotations;
254+
expect(parseResult.length).to.equal(2);
255+
expect(parseResult).to.contain.warning("'Security Scheme Object' 'apiKey' contains invalid key 'scheme'");
256256
});
257257

258-
it('does not complain about flows', () => {
258+
it('provides warning for invalid flows', () => {
259259
const securityScheme = new namespace.elements.Object({
260260
type: 'apiKey',
261261
name: 'example',
@@ -265,8 +265,8 @@ describe('Security Scheme Object', () => {
265265

266266
const parseResult = parse(context, securityScheme);
267267

268-
expect(parseResult.length).to.equal(1);
269-
expect(parseResult).to.not.contain.annotations;
268+
expect(parseResult.length).to.equal(2);
269+
expect(parseResult).to.contain.warning("'Security Scheme Object' 'apiKey' contains invalid key 'flows'");
270270
});
271271
});
272272

@@ -320,7 +320,7 @@ describe('Security Scheme Object', () => {
320320
expect(parseResult.get(0).get(1).description.toValue()).to.equal('oauth2 implementation');
321321
});
322322

323-
it('does not complain about name', () => {
323+
it('provides warning for invalid name', () => {
324324
const securityScheme = new namespace.elements.Object({
325325
type: 'oauth2',
326326
flows: {},
@@ -329,11 +329,11 @@ describe('Security Scheme Object', () => {
329329

330330
const parseResult = parse(context, securityScheme);
331331

332-
expect(parseResult.length).to.equal(1);
333-
expect(parseResult).to.not.contain.annotations;
332+
expect(parseResult.length).to.equal(2);
333+
expect(parseResult).to.contain.warning("'Security Scheme Object' 'oauth2' contains invalid key 'name'");
334334
});
335335

336-
it('does not complain about in', () => {
336+
it('provides warning for invalid in', () => {
337337
const securityScheme = new namespace.elements.Object({
338338
type: 'oauth2',
339339
flows: {},
@@ -342,11 +342,11 @@ describe('Security Scheme Object', () => {
342342

343343
const parseResult = parse(context, securityScheme);
344344

345-
expect(parseResult.length).to.equal(1);
346-
expect(parseResult).to.not.contain.annotations;
345+
expect(parseResult.length).to.equal(2);
346+
expect(parseResult).to.contain.warning("'Security Scheme Object' 'oauth2' contains invalid key 'in'");
347347
});
348348

349-
it('does not complain about scheme', () => {
349+
it('provides warning for invalid scheme', () => {
350350
const securityScheme = new namespace.elements.Object({
351351
type: 'oauth2',
352352
flows: {},
@@ -355,8 +355,8 @@ describe('Security Scheme Object', () => {
355355

356356
const parseResult = parse(context, securityScheme);
357357

358-
expect(parseResult.length).to.equal(1);
359-
expect(parseResult).to.not.contain.annotations;
358+
expect(parseResult.length).to.equal(2);
359+
expect(parseResult).to.contain.warning("'Security Scheme Object' 'oauth2' contains invalid key 'scheme'");
360360
});
361361
});
362362

@@ -375,7 +375,7 @@ describe('Security Scheme Object', () => {
375375
expect(parseResult.get(0).members.length).to.equal(0);
376376
});
377377

378-
it('does not complain about name', () => {
378+
it('provides warning for invalid name', () => {
379379
const securityScheme = new namespace.elements.Object({
380380
type: 'http',
381381
scheme: 'basic',
@@ -384,11 +384,11 @@ describe('Security Scheme Object', () => {
384384

385385
const parseResult = parse(context, securityScheme);
386386

387-
expect(parseResult.length).to.equal(1);
388-
expect(parseResult).to.not.contain.annotations;
387+
expect(parseResult.length).to.equal(2);
388+
expect(parseResult).to.contain.warning("'Security Scheme Object' 'http' contains invalid key 'name'");
389389
});
390390

391-
it('does not complain about in', () => {
391+
it('provides warning for invalid in', () => {
392392
const securityScheme = new namespace.elements.Object({
393393
type: 'http',
394394
scheme: 'basic',
@@ -397,11 +397,11 @@ describe('Security Scheme Object', () => {
397397

398398
const parseResult = parse(context, securityScheme);
399399

400-
expect(parseResult.length).to.equal(1);
401-
expect(parseResult).to.not.contain.annotations;
400+
expect(parseResult.length).to.equal(2);
401+
expect(parseResult).to.contain.warning("'Security Scheme Object' 'http' contains invalid key 'in'");
402402
});
403403

404-
it('does not complain about flows', () => {
404+
it('provides warning for invalid flows', () => {
405405
const securityScheme = new namespace.elements.Object({
406406
type: 'http',
407407
scheme: 'basic',
@@ -410,8 +410,8 @@ describe('Security Scheme Object', () => {
410410

411411
const parseResult = parse(context, securityScheme);
412412

413-
expect(parseResult.length).to.equal(1);
414-
expect(parseResult).to.not.contain.annotations;
413+
expect(parseResult.length).to.equal(2);
414+
expect(parseResult).to.contain.warning("'Security Scheme Object' 'http' contains invalid key 'flows'");
415415
});
416416
});
417417

0 commit comments

Comments
 (0)