Skip to content
Merged
114 changes: 114 additions & 0 deletions tools/spectral/ipa/__tests__/eachCustomMethodMustBeGetOrPost.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import testRule from './__helpers__/testRule';
import { DiagnosticSeverity } from '@stoplight/types';

testRule('xgen-IPA-109-custom-method-must-be-GET-or-POST', [
{
name: 'valid methods',
document: {
paths: {
'/a/{exampleId}:method': {
post: {},
},
'/a:method': {
post: {},
},
'/b/{exampleId}:method': {
get: {},
},
'/b:method': {
get: {},
},
},
},
errors: [],
},
{
name: 'invalid methods',
document: {
paths: {
'/a/{exampleId}:method': {
put: {},
},
'/a:method': {
put: {},
},
'/b/{exampleId}:method': {
get: {},
put: {},
},
'/b:method': {
get: {},
put: {},
},
'/c/{exampleId}:method': {
post: {},
get: {},
put: {},
},
'/c:method': {
post: {},
get: {},
put: {},
},
'/d/{exampleId}:method': {
post: {},
get: {},
},
'/d:method': {
post: {},
get: {},
},
},
},
errors: [
{
code: 'xgen-IPA-109-custom-method-must-be-GET-or-POST',
message: 'The HTTP method for custom methods must be GET or POST. http://go/ipa/109',
path: ['paths', '/a/{exampleId}:method'],
severity: DiagnosticSeverity.Warning,
},
{
code: 'xgen-IPA-109-custom-method-must-be-GET-or-POST',
message: 'The HTTP method for custom methods must be GET or POST. http://go/ipa/109',
path: ['paths', '/a:method'],
severity: DiagnosticSeverity.Warning,
},
{
code: 'xgen-IPA-109-custom-method-must-be-GET-or-POST',
message: 'The HTTP method for custom methods must be GET or POST. http://go/ipa/109',
path: ['paths', '/b/{exampleId}:method'],
severity: DiagnosticSeverity.Warning,
},
{
code: 'xgen-IPA-109-custom-method-must-be-GET-or-POST',
message: 'The HTTP method for custom methods must be GET or POST. http://go/ipa/109',
path: ['paths', '/b:method'],
severity: DiagnosticSeverity.Warning,
},
{
code: 'xgen-IPA-109-custom-method-must-be-GET-or-POST',
message: 'The HTTP method for custom methods must be GET or POST. http://go/ipa/109',
path: ['paths', '/c/{exampleId}:method'],
severity: DiagnosticSeverity.Warning,
},
{
code: 'xgen-IPA-109-custom-method-must-be-GET-or-POST',
message: 'The HTTP method for custom methods must be GET or POST. http://go/ipa/109',
path: ['paths', '/c:method'],
severity: DiagnosticSeverity.Warning,
},
{
code: 'xgen-IPA-109-custom-method-must-be-GET-or-POST',
message: 'The HTTP method for custom methods must be GET or POST. http://go/ipa/109',
path: ['paths', '/d/{exampleId}:method'],
severity: DiagnosticSeverity.Warning,
},
{
code: 'xgen-IPA-109-custom-method-must-be-GET-or-POST',
message: 'The HTTP method for custom methods must be GET or POST. http://go/ipa/109',
path: ['paths', '/d:method'],
severity: DiagnosticSeverity.Warning,
},
],
},
]);
1 change: 1 addition & 0 deletions tools/spectral/ipa/ipa-spectral.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
extends:
- ./rulesets/IPA-102.yaml
- ./rulesets/IPA-104.yaml
- ./rulesets/IPA-109.yaml
15 changes: 15 additions & 0 deletions tools/spectral/ipa/rulesets/IPA-109.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# IPA-109: Custom Methods
# http://go/ipa/109

functions:
- eachCustomMethodMustBeGetOrPost

rules:
xgen-IPA-109-custom-method-must-be-GET-or-POST:
description: 'The HTTP method for custom methods must be GET or POST. http://go/ipa/109'
message: '{{error}} http://go/ipa/109'
severity: warn
given: '$.paths'
then:
field: '@key'
function: 'eachCustomMethodMustBeGetOrPost'
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { isCustomMethod } from './utils/resourceEvaluation.js';

const ERROR_MESSAGE = 'The HTTP method for custom methods must be GET or POST.';
const ERROR_RESULT = [{ message: ERROR_MESSAGE }];
const validMethods = ['get', 'post'];

export default (input, _, { documentInventory }) => {
if (!isCustomMethod(input)) {
return;
}

const oas = documentInventory.resolved;
let httpMethods = Object.keys(oas.paths[input]);

const invalidMethodsFound = httpMethods.some((key) => !validMethods.includes(key));
if (invalidMethodsFound) {
return ERROR_RESULT;
}

const validMethodsFound = httpMethods.filter((key) => validMethods.includes(key));
if (validMethodsFound.length > 1) {
return ERROR_RESULT;
}
};
Loading