From 9296f5105040a9e9560ebff864db7a5a92302745 Mon Sep 17 00:00:00 2001 From: Jonas Lagoni Date: Wed, 16 Jun 2021 15:57:07 +0200 Subject: [PATCH] feat: split enums and use them as values (#231) --- src/generators/java/presets/JacksonPreset.ts | 2 +- src/generators/java/renderers/EnumRenderer.ts | 2 +- .../InterpretAdditionalProperties.ts | 2 +- src/interpreter/InterpretAllOf.ts | 2 +- src/interpreter/Interpreter.ts | 19 ++++---- src/interpreter/PostInterpreter.ts | 4 +- src/interpreter/Utils.ts | 15 ++++++- test/blackbox/Dummy.spec.ts | 15 ++++--- .../java/jackson-annotations-2.12.3.jar | Bin 0 -> 75703 bytes test/generators/java/JavaGenerator.spec.ts | 8 ++-- .../java/presets/DescriptionPreset.spec.ts | 2 +- .../java/presets/JacksonPreset.spec.ts | 2 +- .../typescript/TypeScriptGenerator.spec.ts | 32 -------------- test/interpreter/PostInterpreter.spec.ts | 41 +++++++++++++++++- test/interpreter/unit/Intepreter.spec.ts | 14 +++++- .../InterpretAdditionalProperties.spec.ts | 2 +- test/interpreter/unit/InterpretAllOf.spec.ts | 2 +- test/interpreter/unit/InterpretConst.spec.ts | 2 +- test/interpreter/unit/InterpretEnum.spec.ts | 2 +- test/interpreter/unit/InterpretItems.spec.ts | 2 +- test/interpreter/unit/InterpretNot.spec.ts | 2 +- .../unit/InterpretProperties.spec.ts | 2 +- test/interpreter/unit/Utils.spec.ts | 15 ++++++- .../unit/patternProperties.spec.ts | 2 +- 24 files changed, 116 insertions(+), 75 deletions(-) create mode 100644 test/blackbox/dependencies/java/jackson-annotations-2.12.3.jar diff --git a/src/generators/java/presets/JacksonPreset.ts b/src/generators/java/presets/JacksonPreset.ts index dddbc316bc..6895a162a0 100644 --- a/src/generators/java/presets/JacksonPreset.ts +++ b/src/generators/java/presets/JacksonPreset.ts @@ -8,7 +8,7 @@ import { JavaPreset } from '../JavaPreset'; export const JAVA_JACKSON_PRESET: JavaPreset = { class: { self({renderer, content}) { - renderer.addDependency('import com.fasterxml.jackson.annotations.*;'); + renderer.addDependency('import com.fasterxml.jackson.annotation.*;'); return content; }, getter({ renderer, propertyName, content }) { diff --git a/src/generators/java/renderers/EnumRenderer.ts b/src/generators/java/renderers/EnumRenderer.ts index 6321006d0f..b20a0a3881 100644 --- a/src/generators/java/renderers/EnumRenderer.ts +++ b/src/generators/java/renderers/EnumRenderer.ts @@ -60,7 +60,7 @@ ${this.indent(this.renderBlock(content, 2))} export const JAVA_DEFAULT_ENUM_PRESET: EnumPreset = { self({ renderer }) { - renderer.addDependency('import com.fasterxml.jackson.annotations.*;'); + renderer.addDependency('import com.fasterxml.jackson.annotation.*;'); return renderer.defaultSelf(); }, item({ renderer, item }) { diff --git a/src/interpreter/InterpretAdditionalProperties.ts b/src/interpreter/InterpretAdditionalProperties.ts index 528d124b9d..6eefadc39c 100644 --- a/src/interpreter/InterpretAdditionalProperties.ts +++ b/src/interpreter/InterpretAdditionalProperties.ts @@ -12,7 +12,7 @@ import { isModelObject } from './Utils'; * @param interpreterOptions to control the interpret process */ export default function interpretAdditionalProperties(schema: Schema, model: CommonModel, interpreter : Interpreter, interpreterOptions: InterpreterOptions = Interpreter.defaultInterpreterOptions): void { - if (!isModelObject(model)) {return;} + if (isModelObject(model) === false) {return;} const additionalPropertiesModel = interpreter.interpret(schema.additionalProperties || true, interpreterOptions); if (additionalPropertiesModel !== undefined) { model.addAdditionalProperty(additionalPropertiesModel, schema); diff --git a/src/interpreter/InterpretAllOf.ts b/src/interpreter/InterpretAllOf.ts index b6e0b02b2c..c6190b99b2 100644 --- a/src/interpreter/InterpretAllOf.ts +++ b/src/interpreter/InterpretAllOf.ts @@ -19,7 +19,7 @@ export default function interpretAllOf(schema: Schema, model: CommonModel, inter for (const allOfSchema of schema.allOf) { const allOfModel = interpreter.interpret(allOfSchema, interpreterOptions); if (allOfModel === undefined) {continue;} - if (isModelObject(allOfModel) && interpreterOptions.allowInheritance === true) { + if (isModelObject(allOfModel) === true && interpreterOptions.allowInheritance === true) { Logger.info(`Processing allOf, inheritance is enabled, ${model.$id} inherits from ${allOfModel.$id}`, model, allOfModel); model.addExtendedModel(allOfModel); } else { diff --git a/src/interpreter/Interpreter.ts b/src/interpreter/Interpreter.ts index caf8a308da..47ca24f55c 100644 --- a/src/interpreter/Interpreter.ts +++ b/src/interpreter/Interpreter.ts @@ -1,5 +1,5 @@ import { CommonModel, Schema } from '../models'; -import { interpretName } from './Utils'; +import { interpretName, isEnum, isModelObject } from './Utils'; import interpretProperties from './InterpretProperties'; import interpretAllOf from './InterpretAllOf'; import interpretConst from './InterpretConst'; @@ -59,16 +59,8 @@ export class Interpreter { if (schema.type !== undefined) { model.addTypes(schema.type); } - - //All schemas of type object MUST have ids - if (model.type !== undefined && model.type.includes('object')) { - model.$id = interpretName(schema) || `anonymSchema${this.anonymCounter++}`; - } else if (schema.$id !== undefined) { - model.$id = interpretName(schema); - } - model.required = schema.required || model.required; - + interpretPatternProperties(schema, model, this, interpreterOptions); interpretAdditionalProperties(schema, model, this, interpreterOptions); interpretItems(schema, model, this, interpreterOptions); @@ -84,6 +76,13 @@ export class Interpreter { this.interpretAndCombineSchema(schema.else, model, schema, interpreterOptions); interpretNot(schema, model, this, interpreterOptions); + + //All schemas of type model object or enum MUST have ids + if (isModelObject(model) === true || isEnum(model) === true) { + model.$id = interpretName(schema) || `anonymSchema${this.anonymCounter++}`; + } else if (schema.$id !== undefined) { + model.$id = interpretName(schema); + } } } diff --git a/src/interpreter/PostInterpreter.ts b/src/interpreter/PostInterpreter.ts index 12c1ad7afc..81965394c9 100644 --- a/src/interpreter/PostInterpreter.ts +++ b/src/interpreter/PostInterpreter.ts @@ -1,6 +1,6 @@ import { CommonModel } from '../models'; import { Logger } from '../utils'; -import { isModelObject } from './Utils'; +import { isEnum, isModelObject } from './Utils'; /** * Post process the interpreted model. By applying the following: * - Ensure models are split as required @@ -21,7 +21,7 @@ export function postInterpretModel(model: CommonModel): CommonModel[] { */ function trySplitModels(model: CommonModel, splitModels: CommonModel[], iteratedModels: CommonModel[]): CommonModel { let modelToReturn: CommonModel = model; - if (isModelObject(model)) { + if (isModelObject(model) === true || isEnum(model) === true) { Logger.info(`Splitting model ${model.$id || 'any'} since it should be on its own`); const switchRootModel = new CommonModel(); switchRootModel.$ref = model.$id; diff --git a/src/interpreter/Utils.ts b/src/interpreter/Utils.ts index c493dbffe9..46084f2056 100644 --- a/src/interpreter/Utils.ts +++ b/src/interpreter/Utils.ts @@ -1,7 +1,20 @@ import { CommonModel } from '../models/CommonModel'; /** - * check if CommonModel is a separate model or a simple model. + * Check if CommonModel is an enum + * + * @param model + */ +export function isEnum(model: CommonModel) : boolean { + if (model.enum !== undefined) { + return true; + } + return false; +} + +/** + * Check if CommonModel is a separate model or a simple model. + * @param model */ export function isModelObject(model: CommonModel) : boolean { if (model.type !== undefined) { diff --git a/test/blackbox/Dummy.spec.ts b/test/blackbox/Dummy.spec.ts index fe527d78f6..22236828cd 100644 --- a/test/blackbox/Dummy.spec.ts +++ b/test/blackbox/Dummy.spec.ts @@ -10,9 +10,10 @@ describe('Dummy JSON Schema file', () => { const generator = new JavaGenerator(); const generatedModels = await generateModels(fileToGenerate, generator); expect(generatedModels).not.toHaveLength(0); - const renderOutputPath = path.resolve(__dirname, './output/java'); + const renderOutputPath = path.resolve(__dirname, './output/java/class'); + const dependencyPath = path.resolve(__dirname, './dependencies/java/*'); await renderJavaModelsToSeparateFiles(generatedModels, renderOutputPath); - const compileCommand = `javac ${path.resolve(renderOutputPath, '*.java')}`; + const compileCommand = `javac -cp ${dependencyPath} ${path.resolve(renderOutputPath, '*.java')}`; await execCommand(compileCommand); }); }); @@ -22,9 +23,9 @@ describe('Dummy JSON Schema file', () => { const generator = new TypeScriptGenerator(); const generatedModels = await generateModels(fileToGenerate, generator); expect(generatedModels).not.toHaveLength(0); - const renderOutputPath = path.resolve(__dirname, './output/ts/output.ts'); + const renderOutputPath = path.resolve(__dirname, './output/ts/class/output.ts'); await renderModels(generatedModels, renderOutputPath); - const transpiledOutputPath = path.resolve(__dirname, './output/ts/output.js'); + const transpiledOutputPath = path.resolve(__dirname, './output/ts/class/output.js'); const transpileAndRunCommand = `tsc -t es5 ${renderOutputPath} && node ${transpiledOutputPath}`; await execCommand(transpileAndRunCommand); }); @@ -33,9 +34,9 @@ describe('Dummy JSON Schema file', () => { const generator = new TypeScriptGenerator({modelType: 'interface'}); const generatedModels = await generateModels(fileToGenerate, generator); expect(generatedModels).not.toHaveLength(0); - const renderOutputPath = path.resolve(__dirname, './output/ts/output.ts'); + const renderOutputPath = path.resolve(__dirname, './output/ts/interface/output.ts'); await renderModels(generatedModels, renderOutputPath); - const transpiledOutputPath = path.resolve(__dirname, './output/ts/output.js'); + const transpiledOutputPath = path.resolve(__dirname, './output/ts/interface/output.js'); const transpileAndRunCommand = `tsc -t es5 ${renderOutputPath} && node ${transpiledOutputPath}`; await execCommand(transpileAndRunCommand); }); @@ -46,7 +47,7 @@ describe('Dummy JSON Schema file', () => { const generator = new JavaScriptGenerator(); const generatedModels = await generateModels(fileToGenerate, generator); expect(generatedModels).not.toHaveLength(0); - const renderOutputPath = path.resolve(__dirname, './output/js/output.js'); + const renderOutputPath = path.resolve(__dirname, './output/js/class/output.js'); await renderModels(generatedModels, renderOutputPath); const transpileAndRunCommand = `node ${renderOutputPath}`; await execCommand(transpileAndRunCommand); diff --git a/test/blackbox/dependencies/java/jackson-annotations-2.12.3.jar b/test/blackbox/dependencies/java/jackson-annotations-2.12.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..fd71f66d074ec0be274ee44c4d79ac90aa14b01d GIT binary patch literal 75703 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 literal 0 HcmV?d00001 diff --git a/test/generators/java/JavaGenerator.spec.ts b/test/generators/java/JavaGenerator.spec.ts index 39d065567f..35b0698352 100644 --- a/test/generators/java/JavaGenerator.spec.ts +++ b/test/generators/java/JavaGenerator.spec.ts @@ -153,7 +153,7 @@ describe('JavaGenerator', () => { const model = inputModel.models['States']; let enumModel = await generator.renderEnum(model, inputModel); - const expectedDependencies = ['import com.fasterxml.jackson.annotations.*;']; + const expectedDependencies = ['import com.fasterxml.jackson.annotation.*;']; expect(enumModel.result).toEqual(expected); expect(enumModel.dependencies).toEqual(expectedDependencies); @@ -202,7 +202,7 @@ describe('JavaGenerator', () => { const model = inputModel.models['Numbers']; let enumModel = await generator.renderEnum(model, inputModel); - const expectedDependencies = ['import com.fasterxml.jackson.annotations.*;']; + const expectedDependencies = ['import com.fasterxml.jackson.annotation.*;']; expect(enumModel.result).toEqual(expected); expect(enumModel.dependencies).toEqual(expectedDependencies); @@ -251,7 +251,7 @@ describe('JavaGenerator', () => { const model = inputModel.models['Union']; let enumModel = await generator.renderEnum(model, inputModel); - const expectedDependencies = ['import com.fasterxml.jackson.annotations.*;']; + const expectedDependencies = ['import com.fasterxml.jackson.annotation.*;']; expect(enumModel.result).toEqual(expected); expect(enumModel.dependencies).toEqual(expectedDependencies); @@ -312,7 +312,7 @@ public enum CustomEnum { const model = inputModel.models['CustomEnum']; let enumModel = await generator.render(model, inputModel); - const expectedDependencies = ['import com.fasterxml.jackson.annotations.*;']; + const expectedDependencies = ['import com.fasterxml.jackson.annotation.*;']; expect(enumModel.result).toEqual(expected); expect(enumModel.dependencies).toEqual(expectedDependencies); diff --git a/test/generators/java/presets/DescriptionPreset.spec.ts b/test/generators/java/presets/DescriptionPreset.spec.ts index fd8289640a..8945058659 100644 --- a/test/generators/java/presets/DescriptionPreset.spec.ts +++ b/test/generators/java/presets/DescriptionPreset.spec.ts @@ -89,6 +89,6 @@ public enum Enum { const enumModel = await generator.renderEnum(model, inputModel); expect(enumModel.result).toEqual(expected); - expect(enumModel.dependencies).toEqual(['import com.fasterxml.jackson.annotations.*;']); + expect(enumModel.dependencies).toEqual(['import com.fasterxml.jackson.annotation.*;']); }); }); diff --git a/test/generators/java/presets/JacksonPreset.spec.ts b/test/generators/java/presets/JacksonPreset.spec.ts index c4d4718448..9cd828099f 100644 --- a/test/generators/java/presets/JacksonPreset.spec.ts +++ b/test/generators/java/presets/JacksonPreset.spec.ts @@ -33,6 +33,6 @@ describe('JAVA_DESCRIPTION_PRESET', () => { const classModel = await generator.renderClass(model, inputModel); expect(classModel.result).toEqual(expected); - expect(classModel.dependencies).toEqual(['import com.fasterxml.jackson.annotations.*;']); + expect(classModel.dependencies).toEqual(['import com.fasterxml.jackson.annotation.*;']); }); }); diff --git a/test/generators/typescript/TypeScriptGenerator.spec.ts b/test/generators/typescript/TypeScriptGenerator.spec.ts index 6dc280511a..d24ed09161 100644 --- a/test/generators/typescript/TypeScriptGenerator.spec.ts +++ b/test/generators/typescript/TypeScriptGenerator.spec.ts @@ -5,38 +5,6 @@ describe('TypeScriptGenerator', () => { beforeEach(() => { generator = new TypeScriptGenerator(); }); - test('should render union property type', async () => { - const doc = { - $id: '_address', - type: 'object', - properties: { - state: { type: 'string', enum: ['Texas', 'Alabama', 'California', 'other'] } - } - }; - const expected = `export class Address { - private _state?: "Texas" | "Alabama" | "California" | "other"; - - constructor(input: { - state?: "Texas" | "Alabama" | "California" | "other", - }) { - this._state = input.state; - } - - get state(): "Texas" | "Alabama" | "California" | "other" | undefined { return this._state; } - set state(state: "Texas" | "Alabama" | "California" | "other" | undefined) { this._state = state; } -}`; - - const inputModel = await generator.process(doc); - const model = inputModel.models['_address']; - - let classModel = await generator.renderClass(model, inputModel); - expect(classModel.result).toEqual(expected); - expect(classModel.dependencies).toEqual([]); - - classModel = await generator.render(model, inputModel); - expect(classModel.result).toEqual(expected); - expect(classModel.dependencies).toEqual([]); - }); test('should render `class` type', async () => { const doc = { $id: '_address', diff --git a/test/interpreter/PostInterpreter.spec.ts b/test/interpreter/PostInterpreter.spec.ts index b48ad12e9d..f6e5f6762b 100644 --- a/test/interpreter/PostInterpreter.spec.ts +++ b/test/interpreter/PostInterpreter.spec.ts @@ -1,10 +1,10 @@ import { CommonModel } from '../../src'; import { postInterpretModel } from '../../src/interpreter/PostInterpreter'; -import { isModelObject } from '../../src/interpreter/Utils'; +import { isEnum, isModelObject } from '../../src/interpreter/Utils'; jest.mock('../../src/interpreter/Utils'); describe('PostInterpreter', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { jest.restoreAllMocks(); @@ -30,6 +30,43 @@ describe('PostInterpreter', () => { expect(postProcessedModels).toHaveLength(1); expect(postProcessedModels[0]).toMatchObject(expectedSchema1Model); }); + test('should split models on enums', () => { + const rawModel = { + $id: 'schema1', + properties: { + testProp: { + $id: 'schema2', + enum: [ + 'test' + ] + } + } + }; + const model = CommonModel.toCommonModel(rawModel); + (isEnum as jest.Mock).mockReturnValue(true); + + const postProcessedModels = postInterpretModel(model); + + const expectedSchema1Model = CommonModel.toCommonModel({ + $id: 'schema1', + properties: { + testProp: { + $ref: 'schema2' + } + } + }); + const expectedSchema2Model = CommonModel.toCommonModel({ + $id: 'schema2', + enum: [ + 'test' + ] + }); + + expect(postProcessedModels).toHaveLength(2); + expect(isEnum).toHaveBeenNthCalledWith(1, expectedSchema2Model); + expect(postProcessedModels[0]).toMatchObject(expectedSchema1Model); + expect(postProcessedModels[1]).toMatchObject(expectedSchema2Model); + }); test('should split models when nested models occur', () => { const rawModel = { $id: 'schema1', diff --git a/test/interpreter/unit/Intepreter.spec.ts b/test/interpreter/unit/Intepreter.spec.ts index 50d1f7b56e..e09bee7202 100644 --- a/test/interpreter/unit/Intepreter.spec.ts +++ b/test/interpreter/unit/Intepreter.spec.ts @@ -1,5 +1,5 @@ import {Interpreter} from '../../../src/interpreter/Interpreter'; -import {interpretName} from '../../../src/interpreter/Utils'; +import {interpretName, isEnum, isModelObject} from '../../../src/interpreter/Utils'; import interpretProperties from '../../../src/interpreter/InterpretProperties'; import interpretConst from '../../../src/interpreter/InterpretConst'; import interpretEnum from '../../../src/interpreter/InterpretEnum'; @@ -26,7 +26,7 @@ CommonModel.mergeCommonModels = jest.fn(); */ describe('Interpreter', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { jest.restoreAllMocks(); @@ -62,9 +62,19 @@ describe('Interpreter', () => { expect(model).not.toBeUndefined(); expect(model?.type).toEqual(['object', 'string', 'number', 'array', 'boolean', 'null', 'integer']); }); + test('should set id of model if enum', () => { + const schema = { enum: ['value'] }; + const interpreter = new Interpreter(); + (isEnum as jest.Mock).mockReturnValue(true); + const model = interpreter.interpret(schema); + expect(model).not.toBeUndefined(); + expect(interpretName).toHaveBeenNthCalledWith(1, schema); + expect(model?.$id).toEqual('anonymSchema1'); + }); test('should set id of model if object', () => { const schema = { type: 'object' }; const interpreter = new Interpreter(); + (isModelObject as jest.Mock).mockReturnValue(true); const model = interpreter.interpret(schema); expect(model).not.toBeUndefined(); expect(interpretName).toHaveBeenNthCalledWith(1, schema); diff --git a/test/interpreter/unit/InterpretAdditionalProperties.spec.ts b/test/interpreter/unit/InterpretAdditionalProperties.spec.ts index 9e812a9439..3abcc03cbb 100644 --- a/test/interpreter/unit/InterpretAdditionalProperties.spec.ts +++ b/test/interpreter/unit/InterpretAdditionalProperties.spec.ts @@ -6,7 +6,7 @@ jest.mock('../../../src/interpreter/Interpreter'); jest.mock('../../../src/models/CommonModel'); describe('Interpretation of additionalProperties', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { jest.restoreAllMocks(); diff --git a/test/interpreter/unit/InterpretAllOf.spec.ts b/test/interpreter/unit/InterpretAllOf.spec.ts index 8a592f7e11..b1867e927d 100644 --- a/test/interpreter/unit/InterpretAllOf.spec.ts +++ b/test/interpreter/unit/InterpretAllOf.spec.ts @@ -14,7 +14,7 @@ CommonModel.mergeCommonModels = jest.fn(); */ describe('Interpretation of allOf', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { jest.restoreAllMocks(); diff --git a/test/interpreter/unit/InterpretConst.spec.ts b/test/interpreter/unit/InterpretConst.spec.ts index 7531922d47..1dd1066119 100644 --- a/test/interpreter/unit/InterpretConst.spec.ts +++ b/test/interpreter/unit/InterpretConst.spec.ts @@ -6,7 +6,7 @@ jest.mock('../../../src/interpreter/Utils'); jest.mock('../../../src/models/CommonModel'); describe('Interpretation of const', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { jest.restoreAllMocks(); diff --git a/test/interpreter/unit/InterpretEnum.spec.ts b/test/interpreter/unit/InterpretEnum.spec.ts index 1af1c3ea07..f12f62edbd 100644 --- a/test/interpreter/unit/InterpretEnum.spec.ts +++ b/test/interpreter/unit/InterpretEnum.spec.ts @@ -6,7 +6,7 @@ jest.mock('../../../src/models/CommonModel'); describe('Interpretation of enum', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { jest.restoreAllMocks(); diff --git a/test/interpreter/unit/InterpretItems.spec.ts b/test/interpreter/unit/InterpretItems.spec.ts index ecd4e5f438..ed0ef1fee5 100644 --- a/test/interpreter/unit/InterpretItems.spec.ts +++ b/test/interpreter/unit/InterpretItems.spec.ts @@ -6,7 +6,7 @@ jest.mock('../../../src/interpreter/Interpreter'); jest.mock('../../../src/models/CommonModel'); describe('Interpretation of', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { jest.restoreAllMocks(); diff --git a/test/interpreter/unit/InterpretNot.spec.ts b/test/interpreter/unit/InterpretNot.spec.ts index 5ebb005767..7201f8b8c7 100644 --- a/test/interpreter/unit/InterpretNot.spec.ts +++ b/test/interpreter/unit/InterpretNot.spec.ts @@ -10,7 +10,7 @@ jest.mock('../../../src/utils'); jest.mock('../../../src/interpreter/Interpreter'); describe('Interpretation of not', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); (inferTypeFromValue as jest.Mock).mockImplementation(() => {return;}); interpreterOptions = Interpreter.defaultInterpreterOptions; }); diff --git a/test/interpreter/unit/InterpretProperties.spec.ts b/test/interpreter/unit/InterpretProperties.spec.ts index 78b440a417..a23787c4ed 100644 --- a/test/interpreter/unit/InterpretProperties.spec.ts +++ b/test/interpreter/unit/InterpretProperties.spec.ts @@ -11,7 +11,7 @@ CommonModel.mergeCommonModels = jest.fn(); */ describe('Interpretation of properties', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { jest.restoreAllMocks(); diff --git a/test/interpreter/unit/Utils.spec.ts b/test/interpreter/unit/Utils.spec.ts index 411323d388..f7aadeee11 100644 --- a/test/interpreter/unit/Utils.spec.ts +++ b/test/interpreter/unit/Utils.spec.ts @@ -1,8 +1,21 @@ import { CommonModel } from '../../../src/models/CommonModel'; -import { interpretName, inferTypeFromValue, isModelObject } from '../../../src/interpreter/Utils'; +import { interpretName, inferTypeFromValue, isModelObject, isEnum } from '../../../src/interpreter/Utils'; describe('utils', () => { + describe('isEnum', () => { + test('should return true if model has enum', () => { + const model = new CommonModel(); + model.enum = []; + const isModel = isEnum(model); + expect(isModel).toEqual(true); + }); + test('should return false if model does not have', () => { + const model = new CommonModel(); + const isModel = isEnum(model); + expect(isModel).toEqual(false); + }); + }); describe('isModelObject', () => { test('should return true if model type is object', () => { const model = new CommonModel(); diff --git a/test/interpreter/unit/patternProperties.spec.ts b/test/interpreter/unit/patternProperties.spec.ts index 1d055e938b..428bb965cd 100644 --- a/test/interpreter/unit/patternProperties.spec.ts +++ b/test/interpreter/unit/patternProperties.spec.ts @@ -8,7 +8,7 @@ jest.mock('../../../src/models/CommonModel'); describe('Interpretation of patternProperties', () => { beforeEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { jest.restoreAllMocks();