diff --git a/src/core/components/operation-summary.jsx b/src/core/components/operation-summary.jsx index bed0b3b4dea..8896f0d7854 100644 --- a/src/core/components/operation-summary.jsx +++ b/src/core/components/operation-summary.jsx @@ -56,8 +56,10 @@ export default class OperationSummary extends PureComponent { const OperationSummaryPath = getComponent("OperationSummaryPath") const JumpToPath = getComponent("JumpToPath", true) + const hasSecurity = security && !!security.count() + const securityIsOptional = hasSecurity && security.size === 1 && security.first().isEmpty() + const allowAnonymous = !hasSecurity || securityIsOptional return ( -
@@ -71,7 +73,7 @@ export default class OperationSummary extends PureComponent { {displayOperationId && (originalOperationId || operationId) ? {originalOperationId || operationId} : null} { - (!security || !security.count()) ? null : + allowAnonymous ? null : { diff --git a/test/e2e-cypress/static/documents/security/anonymous.yaml b/test/e2e-cypress/static/documents/security/anonymous.yaml new file mode 100644 index 00000000000..e71331c2cdd --- /dev/null +++ b/test/e2e-cypress/static/documents/security/anonymous.yaml @@ -0,0 +1,35 @@ +openapi: 3.0.0 +info: + title: Test anonymous operations + version: 1.0.0 +paths: + /withBoth: + get: + security: [{}, {"apikeyScheme": []}, {"apikeyScheme2": []}] + responses: + 200: + description: asdadasd + /onlyEmpty: + get: + security: [{}] + responses: + 200: + description: asdadasd + /required: + get: + security: [{"apikeyScheme": []}] + responses: + 200: + description: asdadasd +security: + - apikeyScheme: [] +components: + securitySchemes: + apikeyScheme: + name: test + type: apiKey + in: header + apikeyScheme2: + name: test2 + type: apiKey + in: header diff --git a/test/e2e-cypress/tests/security/anonymous.js b/test/e2e-cypress/tests/security/anonymous.js new file mode 100644 index 00000000000..312e38a18fa --- /dev/null +++ b/test/e2e-cypress/tests/security/anonymous.js @@ -0,0 +1,22 @@ +describe("#6767: Operation should be considered anonymous if its security only includes empty object (this was decided by implementation choice and may change or be extended in the future)", () => { + it("Should consider method anonymous if security contains only empty object", () => { + cy + .visit("/?url=/documents/security/anonymous.yaml") + .get("#operations-default-get_onlyEmpty .authorization__btn") + .should("not.exist") + }) + + it("Should consider method as secured if security contains no empty object", () => { + cy + .visit("/?url=/documents/security/anonymous.yaml") + .get("#operations-default-get_required .authorization__btn") + .should("exist") + }) + + it("Should consider method as secured if security contains empty object but has at least one more security defined", () => { + cy + .visit("/?url=/documents/security/anonymous.yaml") + .get("#operations-default-get_withBoth .authorization__btn") + .should("exist") + }) +})