UNPKG

schyma

Version:

JSON Schemas Visualizer React component

105 lines 4.94 kB
"use strict"; 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