From 801c3f8484c7ac6bcb62483a644e2ba23a9d7bd5 Mon Sep 17 00:00:00 2001 From: dblock Date: Fri, 9 Aug 2024 08:41:10 -0400 Subject: [PATCH] Added x-distributions-included and excluded. Signed-off-by: dblock --- DEVELOPER_GUIDE.md | 5 ++- TESTING_GUIDE.md | 31 ++++++++++++++--- spec/namespaces/_core.yaml | 5 ++- tests/default/_core/info.yaml | 2 +- tools/src/OpenSearchHttpClient.ts | 1 + tools/src/linter/SchemasValidator.ts | 4 ++- tools/src/linter/components/OperationGroup.ts | 2 +- tools/src/merger/OpenApiVersionExtractor.ts | 12 +++++-- tools/src/tester/SchemaValidator.ts | 4 ++- tools/src/tester/StoryEvaluator.ts | 14 +++++--- tools/src/types.ts | 2 ++ .../merger/OpenApiVersionExtractor.test.ts | 8 ++--- .../fixtures/extractor/expected_1.3.yaml | 6 ++++ .../fixtures/extractor/expected_2.0.yaml | 6 ++++ tools/tests/tester/MergedOpenApiSpec.test.ts | 33 +++++++++++-------- tools/tests/tester/fixtures/evals/passed.yaml | 19 +++++++++++ .../specs/complete/namespaces/index.yaml | 22 ++++++++----- .../tests/tester/fixtures/stories/passed.yaml | 6 ++++ 18 files changed, 135 insertions(+), 47 deletions(-) diff --git a/DEVELOPER_GUIDE.md b/DEVELOPER_GUIDE.md index 7f8b21261..f719b10ef 100644 --- a/DEVELOPER_GUIDE.md +++ b/DEVELOPER_GUIDE.md @@ -146,7 +146,10 @@ This repository includes several OpenAPI Specification Extensions to fill in any - `x-ignorable`: Denotes that the operation should be ignored by the client generator. This is used in operation groups where some operations have been replaced by newer ones, but we still keep them in the specs because the server still supports them. - `x-global`: Denotes that the parameter is a global parameter that is included in every operation. These parameters are listed in the [spec/_global_parameters.yaml](spec/_global_parameters.yaml). - `x-default`: Contains the default value of a parameter. This is often used to override the default value specified in the schema, or to avoid accidentally changing the default value when updating a shared schema. -- `x-distributions`: Contains a list of distributions known to include the API. Use `opensearch.org` for the official distribution, `aos` for Amazon Managed OpenSearch, and `aoss` for Amazon OpenSearch Serverless. +- `x-distributions-included`: Contains a list of distributions known to include the API. +- `x-distributions-excluded`: Contains a list of distributions known to exclude the API. + +Use `opensearch.org` for the official distribution in `x-distributions-*`, `amazon-opensearch` for Amazon Managed OpenSearch, and `amazon-serverless` for Amazon OpenSearch Serverless. ## Writing Spec Tests diff --git a/TESTING_GUIDE.md b/TESTING_GUIDE.md index 3155fd4f9..4c64e3841 100644 --- a/TESTING_GUIDE.md +++ b/TESTING_GUIDE.md @@ -210,15 +210,17 @@ The test tool will fetch the server version when it starts and use it automatica ### Managing Distributions -OpenSearch consists of plugins that may or may not be present in various distributions. When adding a new API in the spec, you can specify `x-distributions` with a list of distributions that have a particular feature. For example, the Amazon Managed OpenSearch supports `GET /`, but Amazon Serverless OpenSearch does not. +OpenSearch consists of plugins that may or may not be present in various distributions. When adding a new API in the spec, you can specify `x-distributions-included` or `x-distributions-excluded` with a list of distributions that have a particular feature. For example, the Amazon Managed OpenSearch supports `GET /`, but Amazon Serverless OpenSearch does not. ```yaml /: get: operationId: info.0 - x-distributions: + x-distributions-included: - opensearch.org - - aos + - amazon-managed + x-distributions-excluded: + - amazon-serverless description: Returns basic information about the cluster. ``` @@ -227,8 +229,8 @@ Similarly, skip tests that are not applicable to a distribution by listing the d ```yaml description: Test root endpoint. distributions: + - amazon-managed - opensearch.org - - aos chapters: - synopsis: Get server info. path: / @@ -237,7 +239,26 @@ chapters: status: 200 ``` -To test a particular distribution pass `--opensearch-distribution` to the test tool. +To test a particular distribution pass `--opensearch-distribution` to the test tool. For example, the following runs tests against an Amazon Managed OpenSearch instance. + +```bash +export AWS_ACCESS_KEY_ID=... +export AWS_SECRET_ACCESS_KEY=... +export AWS_SESSION_TOKEN=... +export AWS_REGION=us-west-2 + +export OPENSEARCH_URL=https://....us-west-2.es.amazonaws.com + +npm run test:spec -- --opensearch-distribution=amazon-managed +``` + +The output will visible skip APIs that are not available in the `amazon-managed` distribution. + +``` +PASSED _core/bulk.yaml (.../_core/bulk.yaml) +PASSED _core/info.yaml (.../_core/info.yaml) +SKIPPED indices/forcemerge.yaml (Skipped because distribution amazon-managed is not opensearch.org.) +``` ### Waiting for Tasks diff --git a/spec/namespaces/_core.yaml b/spec/namespaces/_core.yaml index 4b5a55cc8..bc90411bb 100644 --- a/spec/namespaces/_core.yaml +++ b/spec/namespaces/_core.yaml @@ -9,9 +9,8 @@ paths: operationId: info.0 x-operation-group: info x-version-added: '1.0' - x-distributions: - - aos - - opensearch.org + x-distributions-excluded: + - amazon-serverless description: Returns basic information about the cluster. externalDocs: url: https://opensearch.org/docs/latest diff --git a/tests/default/_core/info.yaml b/tests/default/_core/info.yaml index 9de580a2f..9cc644a6b 100644 --- a/tests/default/_core/info.yaml +++ b/tests/default/_core/info.yaml @@ -3,7 +3,7 @@ $schema: ../../../json_schemas/test_story.schema.yaml description: Test root endpoint. distributions: - - aos + - amazon-managed - opensearch.org chapters: - synopsis: Get server info. diff --git a/tools/src/OpenSearchHttpClient.ts b/tools/src/OpenSearchHttpClient.ts index 7bc09d1f7..9ecaa7215 100644 --- a/tools/src/OpenSearchHttpClient.ts +++ b/tools/src/OpenSearchHttpClient.ts @@ -23,6 +23,7 @@ export const OPENSEARCH_URL_OPTION = new Option('--opensearch-url ', 'URL a .env('OPENSEARCH_URL') export const OPENSEARCH_DISTRIBUTION_OPTION = new Option('--opensearch-distribution ', 'OpenSearch distribution') + .default('opensearch.org') .env('OPENSEARCH_DISTRIBUTION') export const OPENSEARCH_USERNAME_OPTION = new Option('--opensearch-username ', 'username to use when authenticating with OpenSearch') diff --git a/tools/src/linter/SchemasValidator.ts b/tools/src/linter/SchemasValidator.ts index 06672285b..c463e49d9 100644 --- a/tools/src/linter/SchemasValidator.ts +++ b/tools/src/linter/SchemasValidator.ts @@ -16,7 +16,9 @@ const ADDITIONAL_KEYWORDS = [ 'x-version-added', 'x-version-deprecated', 'x-version-removed', - 'x-deprecation-message' + 'x-deprecation-message', + 'x-distributions-included', + 'x-distributions-excluded' ] export default class SchemasValidator { diff --git a/tools/src/linter/components/OperationGroup.ts b/tools/src/linter/components/OperationGroup.ts index dc45765bc..f980e56b5 100644 --- a/tools/src/linter/components/OperationGroup.ts +++ b/tools/src/linter/components/OperationGroup.ts @@ -13,7 +13,7 @@ import ValidatorBase from './base/ValidatorBase' export default class OperationGroup extends ValidatorBase { static readonly OP_PRIORITY = ['operationId', 'x-operation-group', 'x-ignorable', 'deprecated', - 'x-deprecation-message', 'x-version-added', 'x-version-deprecated', 'x-version-removed', + 'x-deprecation-message', 'x-version-added', 'x-version-deprecated', 'x-version-removed', 'x-distributions-included', 'x-distributions-excluded', 'description', 'externalDocs', 'parameters', 'requestBody', 'responses'] name: string diff --git a/tools/src/merger/OpenApiVersionExtractor.ts b/tools/src/merger/OpenApiVersionExtractor.ts index ff32c8857..a70df93ef 100644 --- a/tools/src/merger/OpenApiVersionExtractor.ts +++ b/tools/src/merger/OpenApiVersionExtractor.ts @@ -69,9 +69,15 @@ export default class OpenApiVersionExtractor { #exclude_per_distribution(obj: any): boolean { if (this._target_distribution == undefined) return false - const x_distributions = obj['x-distributions'] as string[] + const x_distributions_included = obj['x-distributions-included'] as string[] - if (x_distributions?.length > 0 && !x_distributions.includes(this._target_distribution)) { + if (x_distributions_included?.length > 0 && !x_distributions_included.includes(this._target_distribution)) { + return true + } + + const x_distributions_excluded = obj['x-distributions-excluded'] as string[] + + if (x_distributions_excluded?.length > 0 && x_distributions_excluded.includes(this._target_distribution)) { return true } @@ -84,7 +90,7 @@ export default class OpenApiVersionExtractor { delete_matching_keys(this._spec, this.#exclude_per_semver.bind(this)) } - // Remove any elements that are x-distributions incompatible with the target distribution. + // Remove any elements that are x-distributions-included incompatible with the target distribution. #remove_keys_not_matching_distribution(): void { if (this._target_distribution === undefined) return delete_matching_keys(this._spec, this.#exclude_per_distribution.bind(this)) diff --git a/tools/src/tester/SchemaValidator.ts b/tools/src/tester/SchemaValidator.ts index 7f71e3870..01b55b5ad 100644 --- a/tools/src/tester/SchemaValidator.ts +++ b/tools/src/tester/SchemaValidator.ts @@ -19,7 +19,9 @@ const ADDITIONAL_KEYWORDS = [ 'x-version-added', 'x-version-deprecated', 'x-version-removed', - 'x-deprecation-message' + 'x-deprecation-message', + 'x-distributions-included', + 'x-distributions-excluded' ] export default class SchemaValidator { diff --git a/tools/src/tester/StoryEvaluator.ts b/tools/src/tester/StoryEvaluator.ts index d523fc1eb..f8b7b46cd 100644 --- a/tools/src/tester/StoryEvaluator.ts +++ b/tools/src/tester/StoryEvaluator.ts @@ -14,8 +14,8 @@ import { overall_result } from './helpers' import { StoryOutputs } from './StoryOutputs' import SupplementalChapterEvaluator from './SupplementalChapterEvaluator' import { ChapterOutput } from './ChapterOutput' -import * as semver from 'semver' import _ from 'lodash' +import semver from 'semver' export default class StoryEvaluator { private readonly _chapter_evaluator: ChapterEvaluator @@ -27,7 +27,7 @@ export default class StoryEvaluator { } async evaluate({ story, display_path, full_path }: StoryFile, version?: string, distribution?: string, dry_run: boolean = false): Promise { - if (version != undefined && story.version !== undefined && !semver.satisfies(version, story.version)) { + if (version !== undefined && story.version !== undefined && !StoryEvaluator.#semver_satisfies(version, story.version)) { return { result: Result.SKIPPED, display_path, @@ -43,7 +43,7 @@ export default class StoryEvaluator { display_path, full_path, description: story.description, - message: `Skipped because distribution ${distribution} is not ${story.distributions.length > 1 ? 'one of ' : ''}${story.distributions.sort().join(', ')}.` + message: `Skipped because distribution ${distribution} is not ${story.distributions.length > 1 ? 'one of ' : ''}${story.distributions.join(', ')}.` } } @@ -92,12 +92,12 @@ export default class StoryEvaluator { if (dry_run) { const title = chapter.synopsis || `${chapter.method} ${chapter.path}` evaluations.push({ title, overall: { result: Result.SKIPPED, message: 'Dry Run', error: undefined } }) - } else if (version != undefined && chapter.version !== undefined && !semver.satisfies(version, chapter.version)) { + } else if (version != undefined && chapter.version !== undefined && !StoryEvaluator.#semver_satisfies(version, chapter.version)) { const title = chapter.synopsis || `${chapter.method} ${chapter.path}` evaluations.push({ title, overall: { result: Result.SKIPPED, message: `Skipped because version ${version} does not satisfy ${chapter.version}.`, error: undefined } }) } else if (distribution != undefined && chapter.distributions !== undefined && !chapter.distributions.includes(distribution)) { const title = chapter.synopsis || `${chapter.method} ${chapter.path}` - evaluations.push({ title, overall: { result: Result.SKIPPED, message: `Skipped because distribution ${distribution} is not ${chapter.distributions.length > 1 ? 'one of ' : ''}${chapter.distributions.sort().join(', ')}.`, error: undefined } }) + evaluations.push({ title, overall: { result: Result.SKIPPED, message: `Skipped because distribution ${distribution} is not ${chapter.distributions.length > 1 ? 'one of ' : ''}${chapter.distributions.join(', ')}.`, error: undefined } }) } else { const evaluation = await this._chapter_evaluator.evaluate(chapter, has_errors, story_outputs) has_errors = has_errors || evaluation.overall.result === Result.ERROR @@ -236,4 +236,8 @@ export default class StoryEvaluator { static #failed_evaluation(title: string, message: string): ChapterEvaluation { return { title, overall: { result: Result.FAILED, message } } } + + static #semver_satisfies(version: string, range: string): boolean { + return _.every(range.split(','), (portion) => semver.satisfies(version, portion)) + } } diff --git a/tools/src/types.ts b/tools/src/types.ts index a9497dbcb..d40726b5f 100644 --- a/tools/src/types.ts +++ b/tools/src/types.ts @@ -16,6 +16,8 @@ export interface OperationSpec extends OpenAPIV3.OperationObject { 'x-version-deprecated'?: string 'x-deprecation-message'?: string 'x-ignorable'?: boolean + 'x-distributions-included'?: string + 'x-distributions-excluded'?: string parameters?: OpenAPIV3.ReferenceObject[] requestBody?: OpenAPIV3.ReferenceObject diff --git a/tools/tests/merger/OpenApiVersionExtractor.test.ts b/tools/tests/merger/OpenApiVersionExtractor.test.ts index 0b62493ae..ca3e14eb0 100644 --- a/tools/tests/merger/OpenApiVersionExtractor.test.ts +++ b/tools/tests/merger/OpenApiVersionExtractor.test.ts @@ -43,7 +43,7 @@ describe('extract() from a merged API spec', () => { test('has matching responses', () => { const spec = extractor.extract() expect(_.keys(spec.paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500', '503', 'removed-2.0', 'added-1.3-removed-2.0' + '200', '201', '404', '500', '503', 'removed-2.0', 'added-1.3-removed-2.0', 'distributed-excluded-amazon-serverless' ]) }) }) @@ -54,7 +54,7 @@ describe('extract() from a merged API spec', () => { test('has matching responses', () => { const spec = extractor.extract() expect(_.keys(spec.paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500', '503', 'added-2.0' + '200', '201', '404', '500', '503', 'added-2.0', 'distributed-excluded-amazon-serverless' ]) }) @@ -81,12 +81,12 @@ describe('extract() from a merged API spec', () => { }) describe('2.1', () => { - const extractor = new OpenApiVersionExtractor(merger.spec(), '2.1', 'ignore') + const extractor = new OpenApiVersionExtractor(merger.spec(), '2.1', 'oracle-managed') test('has matching responses', () => { const spec = extractor.extract() expect(_.keys(spec.paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500', '503', 'added-2.0', 'added-2.1' + '200', '201', '404', '500', '503', 'added-2.0', 'added-2.1', 'distributed-excluded-amazon-serverless' ]) }) }) diff --git a/tools/tests/merger/fixtures/extractor/expected_1.3.yaml b/tools/tests/merger/fixtures/extractor/expected_1.3.yaml index d0fa222f7..a4497ccbb 100644 --- a/tools/tests/merger/fixtures/extractor/expected_1.3.yaml +++ b/tools/tests/merger/fixtures/extractor/expected_1.3.yaml @@ -35,6 +35,10 @@ paths: x-version-removed: '2.0' added-1.3-removed-2.0: $ref: '#/components/responses/info@added-1.3-removed-2.0' + distributed-excluded-amazon-serverless: + $ref: '#/components/responses/info@distributed-all' + x-distributions-excluded: + - amazon-serverless parameters: [] /nodes: get: @@ -106,6 +110,8 @@ components: description: Added in 1.3, removed in 2.0 via attribute in response body. x-version-added: '1.3' x-version-removed: '2.0' + info@distributed-all: + description: Distributed in opensearch.org, AOS and AOSS. info@removed-2.0: description: Removed in 2.0 via attribute next to ref. nodes.info@200: diff --git a/tools/tests/merger/fixtures/extractor/expected_2.0.yaml b/tools/tests/merger/fixtures/extractor/expected_2.0.yaml index cfb4279d2..c684b7af9 100644 --- a/tools/tests/merger/fixtures/extractor/expected_2.0.yaml +++ b/tools/tests/merger/fixtures/extractor/expected_2.0.yaml @@ -57,6 +57,10 @@ paths: added-2.0: $ref: '#/components/responses/info@added-2.0' x-version-added: '2.0' + distributed-excluded-amazon-serverless: + $ref: '#/components/responses/info@distributed-all' + x-distributions-excluded: + - amazon-serverless parameters: [] /nodes: get: @@ -144,6 +148,8 @@ components: type: object info@added-2.0: description: Added in 2.0 via attribute next to ref. + info@distributed-all: + description: Distributed in opensearch.org, AOS and AOSS. nodes.info@200: description: All nodes. content: diff --git a/tools/tests/tester/MergedOpenApiSpec.test.ts b/tools/tests/tester/MergedOpenApiSpec.test.ts index 57d75f429..db852a030 100644 --- a/tools/tests/tester/MergedOpenApiSpec.test.ts +++ b/tools/tests/tester/MergedOpenApiSpec.test.ts @@ -30,7 +30,8 @@ describe('merged API spec', () => { test('has all responses', () => { expect(_.keys(spec.spec().paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500','503', 'added-2.0', 'removed-2.0', 'added-1.3-removed-2.0', 'added-2.1', 'distributed-aos', 'distributed-all' + '200', '201', '404', '500','503', 'added-2.0', 'removed-2.0', 'added-1.3-removed-2.0', 'added-2.1', + 'distributed-included-all', 'distributed-included-amazon-managed', 'distributed-excluded-amazon-serverless' ]) }) @@ -69,17 +70,19 @@ describe('merged API spec', () => { test('has matching responses', () => { expect(_.keys(spec.spec().paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500', '503', 'removed-2.0', 'added-1.3-removed-2.0', 'distributed-aos', 'distributed-all' + '200', '201', '404', '500', '503', 'removed-2.0', 'added-1.3-removed-2.0', + 'distributed-included-all', 'distributed-included-amazon-managed', 'distributed-excluded-amazon-serverless' ]) }) }) - describe('another', () => { - const spec = new MergedOpenApiSpec('tools/tests/tester/fixtures/specs/complete', undefined, 'another', new Logger()) + describe('oracle-managed', () => { + const spec = new MergedOpenApiSpec('tools/tests/tester/fixtures/specs/complete', undefined, 'oracle-managed', new Logger()) test('has matching responses', () => { expect(_.keys(spec.spec().paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500', '503', 'added-2.0', 'removed-2.0', 'added-1.3-removed-2.0', 'added-2.1', 'distributed-all' + '200', '201', '404', '500', '503', 'added-2.0', 'removed-2.0', 'added-1.3-removed-2.0', 'added-2.1', + 'distributed-excluded-amazon-serverless' ]) }) }) @@ -89,27 +92,30 @@ describe('merged API spec', () => { test('has matching responses', () => { expect(_.keys(spec.spec().paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500', '503', 'added-2.0', 'distributed-aos', 'distributed-all' + '200', '201', '404', '500', '503', 'added-2.0', + 'distributed-included-all', 'distributed-included-amazon-managed', 'distributed-excluded-amazon-serverless' ]) }) }) - describe('2.0 aos', () => { - const spec = new MergedOpenApiSpec('tools/tests/tester/fixtures/specs/complete', '2.0', 'aos', new Logger()) + describe('2.0 amazon-serverless', () => { + const spec = new MergedOpenApiSpec('tools/tests/tester/fixtures/specs/complete', '2.0', 'amazon-serverless', new Logger()) test('has matching responses', () => { expect(_.keys(spec.spec().paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500', '503', 'added-2.0', 'distributed-aos' + '200', '201', '404', '500', '503', 'added-2.0', + 'distributed-included-all' ]) }) }) - describe('2.0 another', () => { - const spec = new MergedOpenApiSpec('tools/tests/tester/fixtures/specs/complete', '2.0', 'another', new Logger()) + describe('2.0 oracle-managed', () => { + const spec = new MergedOpenApiSpec('tools/tests/tester/fixtures/specs/complete', '2.0', 'oracle-managed', new Logger()) test('has matching responses', () => { expect(_.keys(spec.spec().paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500', '503', 'added-2.0', 'distributed-all' + '200', '201', '404', '500', '503', 'added-2.0', + 'distributed-excluded-amazon-serverless' ]) }) }) @@ -119,7 +125,8 @@ describe('merged API spec', () => { test('has matching responses', () => { expect(_.keys(spec.spec().paths['/index']?.get?.responses)).toEqual([ - '200', '201', '404', '500', '503', 'added-2.0', 'added-2.1', 'distributed-aos', 'distributed-all' + '200', '201', '404', '500', '503', 'added-2.0', 'added-2.1', + 'distributed-included-all', 'distributed-included-amazon-managed', 'distributed-excluded-amazon-serverless' ]) }) }) diff --git a/tools/tests/tester/fixtures/evals/passed.yaml b/tools/tests/tester/fixtures/evals/passed.yaml index 12c1b2c32..e38fc243f 100644 --- a/tools/tests/tester/fixtures/evals/passed.yaml +++ b/tools/tests/tester/fixtures/evals/passed.yaml @@ -176,6 +176,25 @@ chapters: overall: result: SKIPPED message: Skipped because version 2.16.0 does not satisfy >= 2.999.0. + - title: This GET /_cat/health should not be skipped (> 2.0, < 10). + overall: + result: PASSED + path: GET /_cat/health + request: + parameters: + format: + result: PASSED + request: + result: PASSED + response: + status: + result: PASSED + payload_body: + result: PASSED + payload_schema: + result: PASSED + output_values: + result: SKIPPED epilogues: - title: DELETE /books overall: diff --git a/tools/tests/tester/fixtures/specs/complete/namespaces/index.yaml b/tools/tests/tester/fixtures/specs/complete/namespaces/index.yaml index 972cb6af9..0c0a09234 100644 --- a/tools/tests/tester/fixtures/specs/complete/namespaces/index.yaml +++ b/tools/tests/tester/fixtures/specs/complete/namespaces/index.yaml @@ -28,16 +28,20 @@ paths: $ref: '#/components/responses/info@500' '503': $ref: '#/components/responses/info@503' - distributed-aos: - $ref: '#/components/responses/info@distributed-aos' - x-distributions: - - aos - distributed-all: + distributed-included-all: $ref: '#/components/responses/info@distributed-all' - x-distributions: - - another - - distribution + x-distributions-included: + - amazon-managed + - amazon-serverless - opensearch.org + distributed-included-amazon-managed: + $ref: '#/components/responses/info@distributed-amazon-managed' + x-distributions-included: + - amazon-managed + distributed-excluded-amazon-serverless: + $ref: '#/components/responses/info@distributed-all' + x-distributions-excluded: + - amazon-serverless components: responses: info@200: @@ -86,7 +90,7 @@ components: info@added-2.1: description: Added in 2.1 via attribute in response body. x-version-added: '2.1' - info@distributed-aos: + info@distributed-amazon-managed: description: Distributed only in AOS. info@distributed-all: description: Distributed in opensearch.org, AOS and AOSS. diff --git a/tools/tests/tester/fixtures/stories/passed.yaml b/tools/tests/tester/fixtures/stories/passed.yaml index b4b08b963..fe4ae93cd 100644 --- a/tools/tests/tester/fixtures/stories/passed.yaml +++ b/tools/tests/tester/fixtures/stories/passed.yaml @@ -89,3 +89,9 @@ chapters: path: /_cat/health parameters: format: json + - synopsis: This GET /_cat/health should not be skipped (> 2.0, < 10). + version: '>= 2.0, < 10' + method: GET + path: /_cat/health + parameters: + format: json