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

Commit 186bca8

Browse files
committed
refactor(core): added authSchemeRequirement
1 parent 13917af commit 186bca8

File tree

8 files changed

+129
-48
lines changed

8 files changed

+129
-48
lines changed

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

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
const R = require('ramda');
22
const {
3-
isMember, isExtension, hasKey, getValue,
3+
isArray, isMember, isExtension, hasKey, getValue,
44
} = require('../../predicates');
55
const {
6+
createWarning,
67
createUnsupportedMemberWarning,
78
createInvalidMemberWarning,
89
createIdentifierNotUniqueWarning,
@@ -13,6 +14,7 @@ const parseObject = require('../parseObject');
1314
const parseString = require('../parseString');
1415
const parseResponsesObject = require('./parseResponsesObject');
1516
const parseParameterObjects = require('./parseParameterObjects');
17+
const parseSecurityRequirementObject = require('./parseSecurityRequirementObject');
1618
const parseRequestBodyObject = require('./parseRequestBodyObject');
1719
const parseReference = require('../parseReference');
1820

@@ -21,7 +23,7 @@ const parseRequestBodyObjectOrRef = parseReference('requestBodies', parseRequest
2123
const name = 'Operation Object';
2224
const requiredKeys = ['responses'];
2325
const unsupportedKeys = [
24-
'tags', 'externalDocs', 'callbacks', 'deprecated', 'security',
26+
'tags', 'externalDocs', 'callbacks', 'deprecated',
2527
];
2628
const isUnsupportedKey = R.anyPass(R.map(hasKey, unsupportedKeys));
2729

@@ -102,13 +104,18 @@ function parseOperationObject(context, path, member) {
102104
),
103105
]));
104106

107+
const parseSecurity = pipeParseResult(namespace,
108+
R.unless(isArray, createWarning(namespace, `'${name}' 'security' is not an array`)),
109+
R.compose(R.chain(parseSecurityRequirementObject(context)), R.constructN(1, namespace.elements.Array)));
110+
105111
const parseMember = R.cond([
106112
[hasKey('summary'), parseString(context, name, false)],
107113
[hasKey('description'), parseCopy(context, name, false)],
108114
[hasKey('operationId'), pipeParseResult(namespace, parseString(context, name, false), parseOperationId)],
109115
[hasKey('responses'), R.compose(parseResponsesObject(context), getValue)],
110116
[hasKey('requestBody'), R.compose(parseRequestBodyObjectOrRef(context), getValue)],
111117
[hasKey('parameters'), R.compose(parseParameterObjects(context, name), getValue)],
118+
[hasKey('security'), R.compose(parseSecurity, getValue)],
112119

113120
[isUnsupportedKey, createUnsupportedMemberWarning(namespace, name)],
114121

@@ -161,6 +168,13 @@ function parseOperationObject(context, path, member) {
161168
}
162169
}
163170

171+
const security = operation.get('security');
172+
if (security) {
173+
transactions.forEach((transaction) => {
174+
transaction.attributes.set('authSchemeRequirements', security);
175+
});
176+
}
177+
164178
return transition;
165179
});
166180

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

+12-16
Original file line numberDiff line numberDiff line change
@@ -39,25 +39,21 @@ function parseSecurityRequirementObject(context, object) {
3939

4040
const parseSecurityRequirement = pipeParseResult(namespace,
4141
parseObject(context, name, parseMember),
42-
(securityRequirement) => {
43-
const arr = new namespace.elements.AuthSchemeRequirment([]);
42+
e => new namespace.elements.AuthSchemeRequirement(e.content),
43+
R.map((member) => {
44+
let e;
45+
const scopes = member.value.map(scope => scope.toValue());
4446

45-
securityRequirement.forEach((value, key) => {
46-
let e;
47-
const scopes = value.map(scope => scope.toValue());
47+
if (scopes.length) {
48+
e = new namespace.elements.Object({ scopes });
49+
} else {
50+
e = new namespace.elements.Object({});
51+
}
4852

49-
if (scopes.length) {
50-
e = new namespace.elements.Object({ scopes });
51-
} else {
52-
e = new namespace.elements.Object({});
53-
}
53+
e.element = member.key.toValue();
5454

55-
e.element = key.toValue();
56-
arr.push(e);
57-
});
58-
59-
return arr;
60-
});
55+
return e;
56+
}));
6157

6258
return parseSecurityRequirement(object);
6359
}

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

+82-11
Original file line numberDiff line numberDiff line change
@@ -105,17 +105,6 @@ describe('Operation Object', () => {
105105
expect(parseResult).to.contain.warning("'Operation Object' contains unsupported key 'deprecated'");
106106
});
107107

108-
it('provides warning for unsupported security key', () => {
109-
const operation = new namespace.elements.Member('get', {
110-
security: '',
111-
responses: {},
112-
});
113-
114-
const parseResult = parse(context, path, operation);
115-
116-
expect(parseResult).to.contain.warning("'Operation Object' contains unsupported key 'security'");
117-
});
118-
119108
it('does not provide warning/errors for extensions', () => {
120109
const operation = new namespace.elements.Member('get', {
121110
responses: {},
@@ -507,6 +496,88 @@ describe('Operation Object', () => {
507496
});
508497
});
509498

499+
describe('#security', () => {
500+
it('warns when security is not an array', () => {
501+
const operation = new namespace.elements.Member('get', {
502+
security: {},
503+
responses: {},
504+
});
505+
506+
const parseResult = parse(context, path, operation);
507+
508+
expect(parseResult.length).to.equal(2);
509+
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.Transition);
510+
511+
expect(parseResult).to.contain.warning("'Operation Object' 'security' is not an array");
512+
});
513+
514+
it('parses correctly when there is a security requirement', () => {
515+
const operation = new namespace.elements.Member('get', {
516+
security: [
517+
{
518+
apiKey: [],
519+
},
520+
],
521+
responses: {
522+
200: {
523+
description: 'dummy',
524+
},
525+
},
526+
});
527+
528+
const parseResult = parse(context, path, operation);
529+
530+
expect(parseResult.length).to.equal(1);
531+
532+
const transition = parseResult.get(0);
533+
534+
expect(transition).to.be.instanceof(namespace.elements.Transition);
535+
expect(transition.transactions.length).to.equal(1);
536+
537+
const transaction = transition.transactions.get(0);
538+
const { authSchemeRequirements } = transaction;
539+
540+
expect(authSchemeRequirements).to.be.instanceof(namespace.elements.Array);
541+
expect(authSchemeRequirements.length).to.equal(1);
542+
expect(authSchemeRequirements.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirement);
543+
});
544+
545+
it('parses correctly when there are multiple security requirement', () => {
546+
const operation = new namespace.elements.Member('get', {
547+
security: [
548+
{
549+
apiKey: [],
550+
},
551+
{
552+
custom: [],
553+
},
554+
],
555+
responses: {
556+
200: {
557+
description: 'dummy',
558+
},
559+
},
560+
});
561+
562+
const parseResult = parse(context, path, operation);
563+
564+
expect(parseResult.length).to.equal(1);
565+
566+
const transition = parseResult.get(0);
567+
568+
expect(transition).to.be.instanceof(namespace.elements.Transition);
569+
expect(transition.transactions.length).to.equal(1);
570+
571+
const transaction = transition.transactions.get(0);
572+
const { authSchemeRequirements } = transaction;
573+
574+
expect(authSchemeRequirements).to.be.instanceof(namespace.elements.Array);
575+
expect(authSchemeRequirements.length).to.equal(2);
576+
expect(authSchemeRequirements.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirement);
577+
expect(authSchemeRequirements.get(1)).to.be.instanceof(namespace.elements.AuthSchemeRequirement);
578+
});
579+
});
580+
510581
describe('#responses', () => {
511582
it('returns a transition including a transaction', () => {
512583
const operation = new namespace.elements.Member('get', {

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ describe('Security Requirement Object', () => {
2828
const parseResult = parse(context, securityRequirement);
2929

3030
expect(parseResult.length).to.equal(2);
31-
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirment);
31+
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirement);
3232
expect(parseResult.get(0).length).to.equal(0);
3333

3434
expect(parseResult).to.contain.warning("'Security Requirement Object' 'customApiKey' is not an array");
@@ -42,7 +42,7 @@ describe('Security Requirement Object', () => {
4242
const parseResult = parse(context, securityRequirement);
4343

4444
expect(parseResult.length).to.equal(1);
45-
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirment);
45+
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirement);
4646

4747
const arr = parseResult.get(0);
4848

@@ -62,7 +62,7 @@ describe('Security Requirement Object', () => {
6262
const parseResult = parse(context, securityRequirement);
6363

6464
expect(parseResult.length).to.equal(1);
65-
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirment);
65+
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirement);
6666

6767
const arr = parseResult.get(0);
6868

@@ -89,7 +89,7 @@ describe('Security Requirement Object', () => {
8989
const parseResult = parse(context, securityRequirement);
9090

9191
expect(parseResult.length).to.equal(2);
92-
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirment);
92+
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirement);
9393

9494
const arr = parseResult.get(0);
9595

@@ -115,7 +115,7 @@ describe('Security Requirement Object', () => {
115115
const parseResult = parse(context, securityRequirement);
116116

117117
expect(parseResult.length).to.equal(1);
118-
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirment);
118+
expect(parseResult.get(0)).to.be.instanceof(namespace.elements.AuthSchemeRequirement);
119119

120120
const arr = parseResult.get(0);
121121

packages/minim-api-description/lib/api-description.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const hrefVariables = require('./elements/href-variables');
2626
const asset = require('./elements/asset');
2727
const httpMessagePayload = require('./elements/http-message-payload');
2828
const authScheme = require('./elements/auth-scheme');
29-
const authSchemeRequirment = require('./elements/auth-scheme-requirement');
29+
const authSchemeRequirement = require('./elements/auth-scheme-requirement');
3030
const httpTransaction = require('./elements/http-transaction');
3131
const transition = require('./elements/transition');
3232
const resource = require('./elements/resource');
@@ -44,7 +44,7 @@ const namespace = (options) => {
4444
hrefVariables(options.base);
4545
asset(options.base);
4646
httpMessagePayload(options.base);
47-
authSchemeRequirment(options.base);
47+
authSchemeRequirement(options.base);
4848
authScheme(options.base);
4949
httpTransaction(options.base);
5050
transition(options.base);

packages/minim-api-description/lib/elements/auth-scheme-requirement.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@ module.exports = (namespace) => {
22
const ArrayElement = namespace.getElementClass('array');
33

44
/**
5-
* @class AuthSchemeRequirment
5+
* @class AuthSchemeRequirement
66
*
77
* @param {Array} content
88
* @param meta
99
* @param attributes
1010
*
1111
* @extends ArrayElement
1212
*/
13-
class AuthSchemeRequirment extends ArrayElement {
13+
class AuthSchemeRequirement extends ArrayElement {
1414
constructor(...args) {
1515
super(...args);
16-
this.element = 'authSchemeRequirment';
16+
this.element = 'authSchemeRequirement';
1717
}
1818
}
1919

20-
namespace.register('authSchemeRequirment', AuthSchemeRequirment);
20+
namespace.register('authSchemeRequirement', AuthSchemeRequirement);
2121
};

packages/minim-api-description/lib/elements/http-transaction.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ module.exports = (namespace) => {
3535
}
3636

3737
/**
38-
* @name authSchemeRequirments
38+
* @name authSchemeRequirements
3939
* @type ArrayElement
4040
* @memberof HttpTransaction.prototype
4141
*/
42-
get authSchemeRequirments() {
43-
return this.attributes.get('authSchemeRequirments');
42+
get authSchemeRequirements() {
43+
return this.attributes.get('authSchemeRequirements');
4444
}
4545
}
4646

packages/minim-api-description/test/api-description-test.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const HttpTransaction = namespace.getElementClass('httpTransaction');
2020
const HttpRequest = namespace.getElementClass('httpRequest');
2121
const HttpResponse = namespace.getElementClass('httpResponse');
2222
const Asset = namespace.getElementClass('asset');
23-
const AuthSchemeRequirment = namespace.getElementClass('authSchemeRequirment');
23+
const AuthSchemeRequirement = namespace.getElementClass('authSchemeRequirement');
2424
const AuthScheme = namespace.getElementClass('authScheme');
2525
const DataStructure = namespace.getElementClass('dataStructure');
2626
const MemberElement = namespace.getElementClass('member');
@@ -1064,11 +1064,11 @@ describe('API description namespace', () => {
10641064
refracted = {
10651065
element: 'httpTransaction',
10661066
attributes: {
1067-
authSchemeRequirments: {
1067+
authSchemeRequirements: {
10681068
element: 'array',
10691069
content: [
10701070
{
1071-
element: 'authSchemeRequirment',
1071+
element: 'authSchemeRequirement',
10721072
content: [
10731073
{
10741074
element: 'Token Authentication Scheme',
@@ -1108,10 +1108,10 @@ describe('API description namespace', () => {
11081108
});
11091109

11101110
it('should contain auth scheme requirements', () => {
1111-
const schemes = transaction.authSchemeRequirments;
1111+
const schemes = transaction.authSchemeRequirements;
11121112
expect(schemes).to.have.length(1);
11131113
schemes.forEach((item) => {
1114-
expect(item).to.be.an.instanceof(AuthSchemeRequirment);
1114+
expect(item).to.be.an.instanceof(AuthSchemeRequirement);
11151115
});
11161116
});
11171117
});

0 commit comments

Comments
 (0)