Skip to content

Commit

Permalink
feat(parser-adapter-openapi-json-3-0): add support for OpenAPI 3.0.4
Browse files Browse the repository at this point in the history
Refs #4612
  • Loading branch information
char0n committed Dec 24, 2024
1 parent e1c2eb7 commit 681fcc1
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export { default as mediaTypes } from './media-types.ts';
/**
* @public
*/
export const detectionRegExp = /"openapi"\s*:\s*"(?<version_json>3\.0\.([0123]))"/;
export const detectionRegExp = /"openapi"\s*:\s*"(?<version_json>3\.0\.(?:[1-9]\d*|0))"/;

/**
* @public
Expand Down
22 changes: 19 additions & 3 deletions packages/apidom-parser-adapter-openapi-json-3-0/test/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ describe('adapter', function () {
assert.isFalse(await adapter.detect('{"openapi": "3.1.0"}'));
});

specify('should not detect patch version bump', async function () {
assert.isFalse(await adapter.detect('{"openapi": "3.0.4"}'));
specify('should detect patch version bump', async function () {
assert.isTrue(await adapter.detect('{"openapi": "3.0.24"}'));
});

specify('should not detect minor and patch version bump', async function () {
Expand Down Expand Up @@ -75,8 +75,24 @@ describe('adapter', function () {
});

context('detectionRegExp', function () {
specify('should detect version ranges in forward compatible way', function () {
assert.isTrue(adapter.detectionRegExp.test('"openapi": "3.0.0"'));
assert.isTrue(adapter.detectionRegExp.test('"openapi": "3.0.1"'));
assert.isTrue(adapter.detectionRegExp.test('"openapi": "3.0.2"'));
assert.isTrue(adapter.detectionRegExp.test('"openapi": "3.0.3"'));
assert.isTrue(adapter.detectionRegExp.test('"openapi": "3.0.4"'));
assert.isTrue(adapter.detectionRegExp.test('"openapi": "3.0.5"'));
assert.isTrue(adapter.detectionRegExp.test('"openapi": "3.0.6"'));
assert.isTrue(adapter.detectionRegExp.test('"openapi": "3.0.145"'));
});

specify('should reject rc version ranges', function () {
assert.isFalse(adapter.detectionRegExp.test('"openapi": "3.0.0-rc2'));
assert.isFalse(adapter.detectionRegExp.test('"openapi": "3.0.0-rc1"'));
assert.isFalse(adapter.detectionRegExp.test('"openapi": "3.0.0-rc0"'));
});

specify('should reject invalid version ranges', function () {
assert.isFalse(adapter.detectionRegExp.test('"openapi": "3.0.4"'));
assert.isFalse(adapter.detectionRegExp.test('"openapi": "3.1.145"'));
assert.isFalse(adapter.detectionRegExp.test('"openapi": "3.1.0"'));
assert.isFalse(adapter.detectionRegExp.test('"openapi": "3.01.0"'));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"openapi": "3.0.3",
"openapi": "3.0.4",
"info": {
"title": "Sample Pet Store App",
"description": "This is a sample server for a pet store.",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
openapi: 3.0.3
openapi: 3.0.4
info:
title: Sample Pet Store App
description: This is a sample server for a pet store.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ import * as openApiJsonAdapter from '../src/adapter.ts';
describe('given adapter is used in parser', function () {
const parser = new ApiDOMParser().use(openApiJsonAdapter);

context('given OpenAPI 3.0.4 definition in JSON format', function () {
specify('should find appropriate media type', async function () {
const mediaType = await parser.findMediaType('{"openapi": "3.0.4"}');

assert.strictEqual(mediaType, 'application/vnd.oai.openapi+json;version=3.0.4');
});
});

context('given OpenAPI 3.0.3 definition in JSON format', function () {
specify('should find appropriate media type', async function () {
const mediaType = await parser.findMediaType('{"openapi": "3.0.3"}');
Expand Down Expand Up @@ -38,9 +46,25 @@ describe('given adapter is used in parser', function () {
});
});

context('given OpenAPI 3.0.3-rc3 definition in JSON format', function () {
context('given OpenAPI 3.0.0-rc2 definition in JSON format', function () {
specify('should not find appropriate media type', async function () {
const mediaType = await parser.findMediaType('{"openapi": "3.0.0-rc2"}');

assert.strictEqual(mediaType, 'application/octet-stream');
});
});

context('given OpenAPI 3.0.0-rc1 definition in JSON format', function () {
specify('should not find appropriate media type', async function () {
const mediaType = await parser.findMediaType('{"openapi": "3.0.0-rc1"}');

assert.strictEqual(mediaType, 'application/octet-stream');
});
});

context('given OpenAPI 3.0.0-rc0 definition in JSON format', function () {
specify('should not find appropriate media type', async function () {
const mediaType = await parser.findMediaType('{"openapi": "3.0.3-rc3"}');
const mediaType = await parser.findMediaType('{"openapi": "3.0.0-rc1"}');

assert.strictEqual(mediaType, 'application/octet-stream');
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export { default as mediaTypes } from './media-types.ts';
* @public
*/
export const detectionRegExp =
/(?<YAML>^(["']?)openapi\2\s*:\s*(["']?)(?<version_yaml>3\.0\.[0123](?:-rc[012])?)\3(?:\s+|$))|(?<JSON>"openapi"\s*:\s*"(?<version_json>3\.0\.[0123](?:-rc[012])?)")/m;
/(?<YAML>^(["']?)openapi\2\s*:\s*(["']?)(?<version_yaml>3\.0\.(?:[1-9]\d*|0))\3(?:\s+|$))|(?<JSON>"openapi"\s*:\s*"(?<version_json>3\.0\.(?:[1-9]\d*|0))")/m;

/**
* @public
Expand Down

0 comments on commit 681fcc1

Please sign in to comment.