import * as fs from 'fs'; import { JSONSchema4 } from 'json-schema'; import * as path from 'path'; import * as React from 'react'; import { JsonSchemaViewer } from '../components'; import { dumpDom } from './utils/dumpDom'; describe('HTML Output', () => { test.each([ 'ref/original.json', 'allof-with-type.json', 'array-of-allofs.json', 'array-of-objects.json', 'array-of-refs.json', 'combiner-schema.json', 'complex-allOf-model.json', 'default-schema.json', 'formats-schema.json', 'nullish-ref.schema.json', 'oneof-with-array-type.json', 'todo-allof.schema.json', 'tickets.schema.json', ])('should match %s', filename => { const schema = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../__fixtures__/', filename), 'utf8')); expect(dumpDom()).toMatchSnapshot(); }); describe.each(['anyOf', 'oneOf'])('given %s combiner placed next to allOf', combiner => { let schema: JSONSchema4; beforeEach(() => { schema = { type: 'object', title: 'Account', allOf: [ { type: 'object', properties: { type: { type: 'string', enum: ['admin', 'editor'], }, enabled: { type: 'boolean', description: 'Is this account enabled', }, }, required: ['type'], }, ], [combiner]: [ { type: 'object', title: 'Admin', properties: { root: { type: 'boolean', }, group: { type: 'string', }, expirationDate: { type: 'string', }, }, }, { type: 'object', title: 'Editor', properties: { supervisor: { type: 'string', }, key: { type: 'string', }, }, }, ], }; }); test('given allOf merging disabled, should still merge', () => { expect(dumpDom()).toMatchSnapshot(); }); test('given allOf merging enabled, should merge contents of allOf combiners', () => { expect(dumpDom()).toMatchSnapshot(); }); }); test('given array with oneOf containing items, should merge it correctly', () => { const schema: JSONSchema4 = { oneOf: [ { items: { type: 'string', }, }, { items: { type: 'number', }, }, ], type: 'array', }; expect(dumpDom()).toMatchSnapshot(); }); test.each(['standalone', 'read', 'write'])('given %s mode, should populate proper nodes', mode => { const schema: JSONSchema4 = { type: ['string', 'object'], properties: { id: { type: 'string', readOnly: true, }, description: { type: 'string', writeOnly: true, }, }, }; expect(dumpDom()).toMatchSnapshot(); }); test('given multiple object and string type, should process properties', () => { const schema: JSONSchema4 = { type: ['string', 'object'], properties: { ids: { type: 'array', items: { type: 'integer', }, }, }, }; expect(dumpDom()).toMatchSnapshot(); }); test('given complex type that includes array and complex array subtype, should not ignore subtype', () => { const schema: JSONSchema4 = { type: 'object', properties: { items: { type: ['null', 'array'], items: { type: ['string', 'number'], }, description: "This description can be long and should truncate once it reaches the end of the row. If it's not truncating then theres and issue that needs to be fixed. Help!", }, }, }; expect(dumpDom()).toMatchSnapshot(); }); test('given visible $ref node, should try to inject the title immediately', () => { const schema: JSONSchema4 = { type: 'object', properties: { foo: { $ref: '#/properties/user', }, user: { title: 'User', type: 'object', properties: { name: { type: 'string', }, }, }, }, }; expect(dumpDom()).toMatchSnapshot(); }); });