From a8d9fc68646652abcfc489d5429924a39ce5a313 Mon Sep 17 00:00:00 2001 From: Yeliz Henden Date: Thu, 13 Mar 2025 16:27:35 +0000 Subject: [PATCH 1/3] CLOUDP-306161: Improve single resource path evaluation --- .../utils/resourceEvaluation.test.js | 7 ++++++- .../functions/utils/resourceEvaluation.js | 20 +++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/tools/spectral/ipa/__tests__/utils/resourceEvaluation.test.js b/tools/spectral/ipa/__tests__/utils/resourceEvaluation.test.js index c98c8e029a..dbf903b5e5 100644 --- a/tools/spectral/ipa/__tests__/utils/resourceEvaluation.test.js +++ b/tools/spectral/ipa/__tests__/utils/resourceEvaluation.test.js @@ -227,6 +227,11 @@ describe('tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js', () path: '/resourceOne/{id}/{id}', isSingleResourceIdentifier: false, }, + { + description: 'invalid single identifier', + path: '/resource/resource/{id}', + isSingleResourceIdentifier: false, + }, { description: 'single identifier', path: '/resource/{id}', @@ -236,7 +241,7 @@ describe('tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js', () description: 'single identifier child', path: '/resource/{id}/child/{id}', isSingleResourceIdentifier: true, - }, + } ]; testCases.forEach((testCase) => { diff --git a/tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js b/tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js index c2abacf73e..3bf184d58b 100644 --- a/tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js +++ b/tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js @@ -27,8 +27,24 @@ export function isResourceCollectionIdentifier(path) { * @returns {boolean} true if the path represents a single resource, false otherwise */ export function isSingleResourceIdentifier(path) { - const pattern = new RegExp(`^.*/[a-zA-Z]+/{[a-zA-Z]+}$`); - return pattern.test(path); + const p = removePrefix(path); + + // Check if the path ends with /{paramName} pattern + const endsWithParamPattern = /\/\{[a-zA-Z][a-zA-Z0-9]*}$/; + + if (!endsWithParamPattern.test(p)) { + return false; + } + + // Extract the part before the final parameter + const lastSlashBeforeParam = p.lastIndexOf('/'); + if (lastSlashBeforeParam === -1) { + return false; + } + + // Check if the preceding part is a valid resource collection identifier + const collectionPath = p.substring(0, lastSlashBeforeParam); + return isResourceCollectionIdentifier(collectionPath); } export function isCustomMethodIdentifier(path) { From 6d8421230392edfd36b1e625efc0326b4fa9606b Mon Sep 17 00:00:00 2001 From: Yeliz Henden Date: Thu, 13 Mar 2025 16:29:53 +0000 Subject: [PATCH 2/3] prettier fix --- tools/spectral/ipa/__tests__/utils/resourceEvaluation.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/spectral/ipa/__tests__/utils/resourceEvaluation.test.js b/tools/spectral/ipa/__tests__/utils/resourceEvaluation.test.js index dbf903b5e5..6e791f898a 100644 --- a/tools/spectral/ipa/__tests__/utils/resourceEvaluation.test.js +++ b/tools/spectral/ipa/__tests__/utils/resourceEvaluation.test.js @@ -241,7 +241,7 @@ describe('tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js', () description: 'single identifier child', path: '/resource/{id}/child/{id}', isSingleResourceIdentifier: true, - } + }, ]; testCases.forEach((testCase) => { From 1e8e21fa4d5f20af514d47e8d5a61370fcaae9bb Mon Sep 17 00:00:00 2001 From: Yeliz Henden Date: Thu, 13 Mar 2025 16:33:07 +0000 Subject: [PATCH 3/3] docs fix --- .../ipa/rulesets/functions/utils/resourceEvaluation.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js b/tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js index 3bf184d58b..b8eb785f29 100644 --- a/tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js +++ b/tools/spectral/ipa/rulesets/functions/utils/resourceEvaluation.js @@ -20,8 +20,10 @@ export function isResourceCollectionIdentifier(path) { /** * Checks if a path represents a single resource. For example: * '/resource/{id}' returns true + * '/resource/{resourceId}/child/{childId}' returns true * '/resource/{id}/child' returns false - * '/resource/{id}/{id}' returns false + * '/resource' returns false + * '/resource/child/{id}' returns false * * @param {string} path the path to evaluate * @returns {boolean} true if the path represents a single resource, false otherwise