import Ajv from 'ajv' import addFormats from 'ajv-formats' import { ModelProperty } from 'src/types' import { createEnum } from '../create-enum' import { createModel } from '../create-model' import { createProperty } from '../create-property' const ajv = new Ajv() addFormats(ajv) describe('create-property', () => { it('should create string property', () => { const property: ModelProperty = { type: 'string', default: '123', isArray: false, format: 'email', maxLength: 10, minLength: 5, } const result = createProperty('id', property) const expectedResult = { schema: { default: '123', format: 'email', maxLength: 10, minLength: 5, type: 'string', }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create string array property', () => { const property: ModelProperty = { type: 'string', default: ['123'], isArray: true, format: 'email', maxLength: 10, minLength: 5, } const result = createProperty('id', property) const expectedResult = { schema: { type: 'array', items: { default: ['123'], type: 'string', format: 'email', maxLength: 10, minLength: 5, }, }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create number property', () => { const property: ModelProperty = { type: 'number', default: 123, isArray: false, isRequired: true, maximum: 100, minimum: 10, } const result = createProperty('id', property) const expectedResult = { schema: { default: 123, type: 'number', maximum: 100, minimum: 10 }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create number array property', () => { const property: ModelProperty = { type: 'number', default: [123, 123], isArray: true, isRequired: true, maximum: 100, minimum: 10, } const result = createProperty('id', property) const expectedResult = { schema: { type: 'array', items: { default: [123, 123], type: 'number', maximum: 100, minimum: 10 }, }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create date property', () => { const property: ModelProperty = { type: 'date', default: 'Fri Nov 25 2022', } const result = createProperty('id', property) const expectedResult = { schema: { type: 'string', format: 'date', default: 'Fri Nov 25 2022' }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create datetime property', () => { const property: ModelProperty = { type: 'datetime', default: 'Fri Nov 25 2022', } const result = createProperty('id', property) const expectedResult = { schema: { type: 'string', format: 'date-time', default: 'Fri Nov 25 2022' }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create time property', () => { const property: ModelProperty = { type: 'time', default: 'Fri Nov 25 2022', } const result = createProperty('id', property) const expectedResult = { schema: { type: 'string', format: 'time', default: 'Fri Nov 25 2022' }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create boolean property', () => { const property: ModelProperty = { type: 'boolean', default: true, isArray: false, isRequired: true, } const result = createProperty('id', property) const expectedResult = { schema: { default: true, type: 'boolean' }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create boolean array property', () => { const property: ModelProperty = { type: 'boolean', default: [true, false], isArray: true, isRequired: true, } const result = createProperty('id', property) const expectedResult = { schema: { type: 'array', items: { default: [true, false], type: 'boolean' } }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create enum property', () => { const someEnum = createEnum('a', 'b', 'c') const property: ModelProperty = { type: someEnum, default: 'a', isArray: false, isRequired: true, } const result = createProperty('id', property) const expectedResult = { schema: { enum: ['a', 'b', 'c'], default: 'a' }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create enum array property', () => { const someEnum = createEnum('a', 'b', 'c') const property: ModelProperty = { type: someEnum, default: ['a'], isArray: true, isRequired: true, } const result = createProperty('id', property) const expectedResult = { schema: { type: 'array', items: { enum: ['a', 'b', 'c'], default: ['a'] } }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) }) it('should create model property', () => { const SomeModel = createModel({ user_id: { type: 'string', isArray: true, isRequired: true }, }) const property: ModelProperty = { type: SomeModel, isArray: false, isRequired: false, } const result = createProperty('id', property) const expectedResult = { schema: { type: 'object', $ref: 'm1' }, } expect(ajv.validateSchema(result.schema)).toBe(true) expect({ schema: result.schema }).toEqual(expectedResult) expect(new SomeModel({ user_id: ['123'] })).toEqual({ user_id: ['123'] }) }) })