import { createModel } from '../create-model' import Ajv from 'ajv' import addFormats from 'ajv-formats' const ajv = new Ajv() addFormats(ajv) describe('create-model', () => { it('should create basic model', () => { const Model = createModel({ id: { type: 'string', default: '123', isArray: false, }, }) expect(new Model()).toEqual({ id: '123' }) expect(ajv.validateSchema(Model.getSchema())).toBe(true) expect(ajv.validateSchema(Model.getSchema({ returnFullSchema: true }))).toBe(true) expect(Model.getSchema()).toEqual({ additionalProperties: false, $id: 'm1', type: 'object', properties: { id: { default: '123', type: 'string', }, }, required: [], }) expect({ model: Model.model, schema: Model.getSchema() }).toMatchSnapshot() }) it('should create model with children - parent array relation', () => { const Model1 = createModel({ children: { type: 'string', default: '123', isArray: false, }, }) const Model2 = createModel({ parent: { type: Model1, }, }) expect(ajv.validateSchema(Model2.getSchema({ returnFullSchema: true }))).toBe(true) expect(ajv.validateSchema(Model2.getSchema())).toBe(true) expect(Model2.getSchema()).toEqual({ additionalProperties: false, $id: 'm3', type: 'object', properties: { parent: { type: 'object', $ref: 'm2' } }, required: [], }) expect(Model2.getSchema({ returnFullSchema: true })).toEqual({ additionalProperties: false, $id: 'm3', type: 'object', properties: { parent: { type: 'object', $ref: 'm2', }, }, required: [], definitions: { m2: { additionalProperties: false, $id: 'm2', type: 'object', properties: { children: { default: '123', type: 'string', }, }, required: [], }, }, }) expect(new Model2()).toEqual({ parent: { children: '123' } }) }) it('should create model with children - parent normal relation 1', () => { const Model1 = createModel({ children: { type: 'string', default: '123', isArray: false, }, }) const Model2 = createModel({ parent: { type: Model1, isArray: true, }, }) expect(ajv.validateSchema(Model2.getSchema({ returnFullSchema: true }))).toBe(true) expect(ajv.validateSchema(Model2.getSchema())).toBe(true) expect(new Model2({ parent: [new Model1()] })).toEqual({ parent: [{ children: '123' }] }) }) it('should create model with children - parent normal relation 2', () => { const Model1 = createModel({ children: { type: 'string', default: '123', isArray: false, }, }) const Model2 = createModel({ parent: { type: Model1, isArray: false, }, }) const Model3 = createModel({ parentParent: { type: Model2, isArray: false, }, }) expect(ajv.validateSchema(Model3.getSchema({ returnFullSchema: true }))).toBe(true) expect(ajv.validateSchema(Model3.getSchema())).toBe(true) expect(new Model3()).toEqual({ parentParent: { parent: { children: '123' } } }) }) it('should create model with children - parent normal relation 3', () => { const Model0 = createModel({ user_id: { type: 'string' }, username: { type: 'string' }, }) const Model1 = createModel({ users: { type: Model0, isArray: true }, }) expect(new Model1({ users: [{ user_id: '123', username: '12' }] })).toEqual({ users: [{ user_id: '123', username: '12' }], }) }) })