UNPKG

@redocly/openapi-core

Version:

See https://github.com/Redocly/redocly-cli

357 lines (347 loc) 10.3 kB
import { SpecVersion } from '../../oas-types'; import { Config, StyleguideConfig } from '../config'; import { getMergedConfig } from '../utils'; import { doesYamlFileExist } from '../../utils'; import { parseYaml } from '../../js-yaml'; import { readFileSync } from 'fs'; import { ignoredFileStub } from './fixtures/ingore-file'; import * as path from 'path'; import { NormalizedProblem } from '../../walk'; import { Source } from '../../resolve'; jest.mock('../../utils'); jest.mock('../../js-yaml'); jest.mock('fs'); const testConfig: Config = { rawConfig: { apis: { 'test@v1': { root: 'resources/pets.yaml', styleguide: { rules: { 'operation-summary': 'warn' } }, }, }, organization: 'redocly-test', telemetry: 'on', styleguide: { rules: { 'operation-summary': 'error', 'no-empty-servers': 'error' }, plugins: [], }, }, configFile: 'redocly.yaml', apis: { 'test@v1': { root: 'resources/pets.yaml', styleguide: { rules: { 'operation-summary': 'warn' } }, }, }, styleguide: { rawConfig: { rules: { 'operation-summary': 'error', 'no-empty-servers': 'error' }, plugins: [], }, configFile: 'redocly.yaml', ignore: {}, _usedRules: new Set(), _usedVersions: new Set(), recommendedFallback: false, plugins: [], doNotResolveExamples: false, rules: { oas2: { 'operation-summary': 'error', 'no-empty-servers': 'error' }, oas3_0: { 'operation-summary': 'error', 'no-empty-servers': 'error' }, oas3_1: { 'operation-summary': 'error', 'no-empty-servers': 'error' }, }, preprocessors: { oas2: {}, oas3_0: {}, oas3_1: {} }, decorators: { oas2: {}, oas3_0: {}, oas3_1: {} }, } as unknown as StyleguideConfig, theme: { openapi: {}, mockServer: {}, }, resolve: { http: { headers: [] } }, organization: 'redocly-test', files: [], }; describe('getMergedConfig', () => { it('should get styleguide defined in "apis" section', () => { expect(getMergedConfig(testConfig, 'test@v1')).toMatchInlineSnapshot(` Config { "apis": { "test@v1": { "root": "resources/pets.yaml", "styleguide": { "rules": { "operation-summary": "warn", }, }, }, }, "configFile": "redocly.yaml", "files": [], "organization": "redocly-test", "rawConfig": { "apis": { "test@v1": { "root": "resources/pets.yaml", "styleguide": { "rules": { "operation-summary": "warn", }, }, }, }, "files": [], "organization": "redocly-test", "styleguide": { "extendPaths": [], "pluginPaths": [], "rules": { "operation-summary": "warn", }, }, "telemetry": "on", "theme": {}, }, "region": undefined, "resolve": { "http": { "customFetch": undefined, "headers": [], }, }, "styleguide": StyleguideConfig { "_usedRules": Set {}, "_usedVersions": Set {}, "configFile": "redocly.yaml", "decorators": { "arazzo1": {}, "async2": {}, "async3": {}, "oas2": {}, "oas3_0": {}, "oas3_1": {}, "overlay1": {}, }, "doNotResolveExamples": false, "extendPaths": [], "ignore": {}, "pluginPaths": [], "plugins": [], "preprocessors": { "arazzo1": {}, "async2": {}, "async3": {}, "oas2": {}, "oas3_0": {}, "oas3_1": {}, "overlay1": {}, }, "rawConfig": { "extendPaths": [], "pluginPaths": [], "rules": { "operation-summary": "warn", }, }, "recommendedFallback": false, "rules": { "arazzo1": { "operation-summary": "warn", }, "async2": { "operation-summary": "warn", }, "async3": { "operation-summary": "warn", }, "oas2": { "operation-summary": "warn", }, "oas3_0": { "operation-summary": "warn", }, "oas3_1": { "operation-summary": "warn", }, "overlay1": { "operation-summary": "warn", }, }, }, "telemetry": "on", "theme": {}, } `); }); it('should take into account a config file', () => { const result = getMergedConfig(testConfig, 'test@v1'); expect(result.configFile).toEqual('redocly.yaml'); expect(result.styleguide.configFile).toEqual('redocly.yaml'); }); it('should return the same config when there is no alias provided', () => { expect(getMergedConfig(testConfig)).toEqual(testConfig); }); it('should handle wrong alias - return the same styleguide, empty features', () => { expect(getMergedConfig(testConfig, 'wrong-alias')).toMatchInlineSnapshot(` Config { "apis": { "test@v1": { "root": "resources/pets.yaml", "styleguide": { "rules": { "operation-summary": "warn", }, }, }, }, "configFile": "redocly.yaml", "files": [], "organization": "redocly-test", "rawConfig": { "apis": { "test@v1": { "root": "resources/pets.yaml", "styleguide": { "rules": { "operation-summary": "warn", }, }, }, }, "files": [], "organization": "redocly-test", "styleguide": { "extendPaths": [], "pluginPaths": [], "plugins": [], "rules": { "no-empty-servers": "error", "operation-summary": "error", }, }, "telemetry": "on", "theme": {}, }, "region": undefined, "resolve": { "http": { "customFetch": undefined, "headers": [], }, }, "styleguide": StyleguideConfig { "_usedRules": Set {}, "_usedVersions": Set {}, "configFile": "redocly.yaml", "decorators": { "arazzo1": {}, "async2": {}, "async3": {}, "oas2": {}, "oas3_0": {}, "oas3_1": {}, "overlay1": {}, }, "doNotResolveExamples": false, "extendPaths": [], "ignore": {}, "pluginPaths": [], "plugins": [], "preprocessors": { "arazzo1": {}, "async2": {}, "async3": {}, "oas2": {}, "oas3_0": {}, "oas3_1": {}, "overlay1": {}, }, "rawConfig": { "extendPaths": [], "pluginPaths": [], "plugins": [], "rules": { "no-empty-servers": "error", "operation-summary": "error", }, }, "recommendedFallback": false, "rules": { "arazzo1": { "no-empty-servers": "error", "operation-summary": "error", }, "async2": { "no-empty-servers": "error", "operation-summary": "error", }, "async3": { "no-empty-servers": "error", "operation-summary": "error", }, "oas2": { "no-empty-servers": "error", "operation-summary": "error", }, "oas3_0": { "no-empty-servers": "error", "operation-summary": "error", }, "oas3_1": { "no-empty-servers": "error", "operation-summary": "error", }, "overlay1": { "no-empty-servers": "error", "operation-summary": "error", }, }, }, "telemetry": "on", "theme": {}, } `); }); }); describe('StyleguideConfig.extendTypes', () => { let oas3 = jest.fn(); let oas2 = jest.fn(); let testRawConfigStyleguide = { plugins: [ { id: 'test-types-plugin', typeExtension: { oas3, oas2, }, }, ], }; it('should call only oas3 types extension', () => { const styleguideConfig = new StyleguideConfig(testRawConfigStyleguide); styleguideConfig.extendTypes({}, SpecVersion.OAS3_0); expect(oas3).toHaveBeenCalledTimes(1); expect(oas2).toHaveBeenCalledTimes(0); }); it('should call only oas2 types extension', () => { const styleguideConfig = new StyleguideConfig(testRawConfigStyleguide); styleguideConfig.extendTypes({}, SpecVersion.OAS2); expect(oas3).toHaveBeenCalledTimes(0); expect(oas2).toHaveBeenCalledTimes(1); }); it('should throw error if for oas version different from 2 and 3', () => { const styleguideConfig = new StyleguideConfig(testRawConfigStyleguide); expect(() => styleguideConfig.extendTypes({}, 'something else' as SpecVersion)).toThrowError( 'Not implemented' ); }); }); describe('generation ignore object', () => { it('should generate config with absoluteUri for ignore', () => { (readFileSync as jest.Mock<any, any>).mockImplementationOnce(() => ''); (parseYaml as jest.Mock<any, any>).mockImplementationOnce(() => ignoredFileStub); (doesYamlFileExist as jest.Mock<any, any>).mockImplementationOnce(() => true); jest.spyOn(path, 'resolve').mockImplementationOnce((_, filename) => `some-path/${filename}`); const styleguideConfig = new StyleguideConfig(testConfig.styleguide); expect(styleguideConfig).toMatchSnapshot(); }); });