Skip to content

Commit

Permalink
feat(apidom-converter): add infoSummaryRefractorPlugin (#3848)
Browse files Browse the repository at this point in the history
This plugin removes the summary fixed field of Info Object.

Refs #3697
  • Loading branch information
kowalczyk-krzysztof committed Feb 22, 2024
1 parent 3334c6b commit 1f0a39c
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 0 deletions.
Expand Up @@ -22,6 +22,7 @@ import securitySchemeTypeRefractorPlugin from './refractor-plugins/security-sche
import securityRequirementsEmptyRolesRefractorPlugin from './refractor-plugins/security-requirements-empty-roles';
import type { ConverterOptions } from '../../options';
import createToolbox from './toolbox';
import infoSummaryRefractorPlugin from './refractor-plugins/info-summary';

// eslint-disable-next-line @typescript-eslint/naming-convention
const openAPI3_0_3MediaTypes = [
Expand Down Expand Up @@ -63,6 +64,7 @@ class OpenAPI31ToOpenAPI30ConvertStrategy extends ConvertStrategy {
webhooksRefractorPlugin({ annotations }),
securitySchemeTypeRefractorPlugin({ annotations }),
securityRequirementsEmptyRolesRefractorPlugin({ annotations }),
infoSummaryRefractorPlugin({ annotations }),
],
{
toolboxCreator: createToolbox,
Expand Down
@@ -0,0 +1,31 @@
import { InfoElement } from '@swagger-api/apidom-ns-openapi-3-1';
import { AnnotationElement } from '@swagger-api/apidom-core';

type InfoSummaryPluginOptions = {
annotations: AnnotationElement[];
};

const infoSummaryRefractorPlugin =
({ annotations }: InfoSummaryPluginOptions) =>
() => {
const annotation = new AnnotationElement(
'The "summary" field of Info Object is not supported in OpenAPI 3.0.3. It has been removed from the converted document.',
{ classes: ['warning'] },
{ code: 'info-summary' },
);

return {
visitor: {
InfoElement(element: InfoElement) {
if (!element.hasKey('summary')) return undefined;

annotations.push(annotation);
element.remove('summary');

return undefined;
},
},
};
};

export default infoSummaryRefractorPlugin;
@@ -0,0 +1,11 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`converter strategies openapi-3-1-to-openapi-3-0-3 info-summary should remove Info.summary field 1`] = `
{
"openapi": "3.0.3",
"info": {
"version": "1.0.0",
"title": "A title"
}
}
`;
@@ -0,0 +1,8 @@
{
"openapi": "3.1.0",
"info": {
"version": "1.0.0",
"title": "A title",
"summary": "A short summary"
}
}
@@ -0,0 +1,46 @@
import path from 'node:path';
import { expect, assert } from 'chai';
import { mediaTypes as openAPI31MediaTypes } from '@swagger-api/apidom-parser-adapter-openapi-json-3-1';
import { mediaTypes as openAPI30MediaTypes } from '@swagger-api/apidom-parser-adapter-openapi-json-3-0';
import {
AnnotationElement,
ParseResultElement,
toJSON,
includesClasses,
} from '@swagger-api/apidom-core';

import convert from '../../../../../src';

describe('converter', function () {
context('strategies', function () {
context('openapi-3-1-to-openapi-3-0-3', function () {
context('info-summary', function () {
const fixturePath = path.join(__dirname, 'fixtures', 'info-summary.json');
let convertedParseResult: ParseResultElement;

beforeEach(async function () {
convertedParseResult = await convert(fixturePath, {
convert: {
sourceMediaType: openAPI31MediaTypes.findBy('3.1.0', 'json'),
targetMediaType: openAPI30MediaTypes.findBy('3.0.3', 'json'),
},
});
});

specify('should remove Info.summary field', async function () {
expect(toJSON(convertedParseResult.api!, undefined, 2)).toMatchSnapshot();
});

specify('should create WARNING annotation', async function () {
const annotations = Array.from(convertedParseResult.annotations);
const annotation = annotations.find((a: AnnotationElement) =>
a.code?.equals('info-summary'),
);

assert.isDefined(annotation);
assert.isTrue(includesClasses(['warning'], annotation));
});
});
});
});
});

0 comments on commit 1f0a39c

Please sign in to comment.