schyma
Version:
JSON Schemas Visualizer React component
105 lines • 4.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("../../types");
const compositions_1 = require("../compositions");
describe('getCompositionType', () => {
it('detects known composition keywords', () => {
expect((0, compositions_1.getCompositionType)({ oneOf: [] })).toBe(types_1.CompositionType.OneOf);
expect((0, compositions_1.getCompositionType)({ anyOf: [] })).toBe(types_1.CompositionType.AnyOf);
expect((0, compositions_1.getCompositionType)({ allOf: [] })).toBe(types_1.CompositionType.AllOf);
expect((0, compositions_1.getCompositionType)({ not: {} })).toBe(types_1.CompositionType.Not);
});
it('returns null when schema is not a composition', () => {
expect((0, compositions_1.getCompositionType)({ type: 'object', properties: {} })).toBe(null);
});
});
// describe('arrayToProps', () => {
// it('uses schema names derived from title, ref, const, type, and fallback label', () => {
// const result = arrayToProps(
// [
// { title: 'Queue' },
// { $ref: '#/components/schemas/User' },
// { properties: { kind: { const: 'topic' } } },
// { type: 'string' },
// { type: 'object' },
// ],
// 'newProps',
// )
// console.log(result)
// expect(Object.keys(result)).toEqual(['Queue', 'User', 'topic', 'string', 'item 5'])
// })
// })
describe('handleCompositions', () => {
it('merges allOf properties, patternProperties, additionalProperties ref, and primitive fallback', () => {
const mergedProps = {};
const schema = {
allOf: [
{ properties: { id: { type: 'string' } } },
{ patternProperties: { '^x-': { type: 'string' } } },
{ additionalProperties: { $ref: '#/definitions/Metadata' } },
{ type: 'number' },
],
};
(0, compositions_1.handleCompositions)(schema, mergedProps, 'value');
expect(mergedProps).toHaveProperty('id');
expect(mergedProps).toHaveProperty('^x-');
expect(mergedProps).toHaveProperty('Metadata');
expect(mergedProps).toHaveProperty('number');
});
it('flattens allOf conditional branches via handleConditions', () => {
const mergedProps = {};
const schema = {
allOf: [
{
if: { properties: { mode: { const: 'async' } } },
then: { properties: { timeout: { type: 'number' } } },
else: { properties: { retries: { type: 'number' } } },
},
],
};
(0, compositions_1.handleCompositions)(schema, mergedProps, 'mode');
expect(mergedProps).toHaveProperty('if mode = async');
expect(mergedProps).toHaveProperty('else (mode)');
});
it('adds oneOf entries with composition tags and flattens condition-only entries', () => {
const mergedProps = {};
//TODO: Rethink flatten approach for compositions with conditions
const schema = {
oneOf: [
{ title: 'Queue', type: 'object' },
{
if: { properties: { protocol: { const: 'http' } } },
then: { properties: { keepAlive: { type: 'boolean' } } },
else: { properties: { keepAlive: { type: 'number' } } },
},
],
};
(0, compositions_1.handleCompositions)(schema, mergedProps, 'destination');
expect(mergedProps).toHaveProperty('Queue');
expect(mergedProps.Queue._compositionSource).toBe(types_1.CompositionType.OneOf);
expect(mergedProps).toHaveProperty('if protocol = http');
expect(mergedProps).toHaveProperty('else (protocol)');
});
it('adds anyOf and not entries with the correct composition tags', () => {
const mergedProps = {};
const schema = {
anyOf: [{ $ref: '#/components/schemas/Email' }],
not: { type: 'null' },
};
(0, compositions_1.handleCompositions)(schema, mergedProps, 'channel');
expect(mergedProps).toHaveProperty('Email');
expect(mergedProps.Email._compositionSource).toBe(types_1.CompositionType.AnyOf);
expect(mergedProps).toHaveProperty('null');
expect(mergedProps.null._compositionSource).toBe(types_1.CompositionType.Not);
});
it('uses ref name for not schemas that reference another schema', () => {
const mergedProps = {};
const schema = {
not: { $ref: '#/definitions/DeprecatedPayload' },
};
(0, compositions_1.handleCompositions)(schema, mergedProps, 'payload');
expect(mergedProps).toHaveProperty('DeprecatedPayload');
expect(mergedProps.DeprecatedPayload._compositionSource).toBe(types_1.CompositionType.Not);
});
});
//# sourceMappingURL=compositions.test.js.map