twenty / packages /twenty-shared /src /logic-function /__tests__ /json-schema-to-input-schema.test.ts
Jules
Initial clean CRM deployment with prebuilt assets
d9494a5
Raw
History Blame Contribute Delete
5.65 kB
import { jsonSchemaToInputSchema } from '@/logic-function/json-schema-to-input-schema';
describe('jsonSchemaToInputSchema', () => {
it('wraps a JSON Schema object into a single-element InputSchema array', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: {
name: { type: 'string', description: 'A name' },
age: { type: 'number' },
},
required: ['name'],
});
expect(result).toEqual([
{
type: 'object',
properties: {
name: { type: 'string' },
age: { type: 'number' },
},
},
]);
});
it('maps integer to number', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: { count: { type: 'integer' } },
});
expect(result[0].properties).toEqual({ count: { type: 'number' } });
});
it('maps null to unknown', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: { value: { type: 'null' } },
});
expect(result[0].properties).toEqual({ value: { type: 'unknown' } });
});
it('preserves array items', () => {
const result = jsonSchemaToInputSchema({
type: 'array',
items: { type: 'string' },
});
expect(result).toEqual([
{
type: 'array',
items: { type: 'string' },
},
]);
});
it('preserves enum on string properties', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: {
color: { type: 'string', enum: ['red', 'green', 'blue'] },
},
});
expect(result[0].properties?.color).toEqual({
type: 'string',
enum: ['red', 'green', 'blue'],
});
});
it('drops non-string enum values silently', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: {
mixed: { type: 'string', enum: ['a', 1, true, 'b'] },
},
});
expect(result[0].properties?.mixed).toEqual({
type: 'string',
enum: ['a', 'b'],
});
});
it('preserves multiline on string properties when true', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: {
body: { type: 'string', multiline: true },
},
});
expect(result[0].properties?.body).toEqual({
type: 'string',
multiline: true,
});
});
it('does not set multiline when false or omitted', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: {
title: { type: 'string', multiline: false },
other: { type: 'string' },
},
});
expect(result[0].properties?.title).toEqual({ type: 'string' });
expect(result[0].properties?.other).toEqual({ type: 'string' });
});
it('preserves label on top-level and nested properties', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
label: 'Slack Message',
properties: {
slackChannelId: { type: 'string', label: 'Channel' },
messageText: { type: 'string', label: 'Message text' },
meta: {
type: 'object',
properties: {
count: { type: 'integer', label: 'Count' },
},
},
},
});
expect(result[0].label).toBe('Slack Message');
expect(result[0].properties?.slackChannelId).toEqual({
type: 'string',
label: 'Channel',
});
expect(result[0].properties?.messageText).toEqual({
type: 'string',
label: 'Message text',
});
expect(result[0].properties?.meta?.properties?.count).toEqual({
type: 'number',
label: 'Count',
});
});
it('preserves objectUniversalIdentifier on object properties and array items', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: {
company: {
type: 'object',
objectUniversalIdentifier: 'company-universal-identifier',
},
people: {
type: 'array',
items: {
type: 'object',
objectUniversalIdentifier: 'person-universal-identifier',
},
},
},
});
expect(result[0].properties?.company).toEqual({
type: 'object',
objectUniversalIdentifier: 'company-universal-identifier',
});
expect(result[0].properties?.people).toEqual({
type: 'array',
items: {
type: 'object',
objectUniversalIdentifier: 'person-universal-identifier',
},
});
});
it('passes record/records types through with objectUniversalIdentifier', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: {
company: {
type: 'record',
objectUniversalIdentifier: 'company-universal-identifier',
},
people: {
type: 'records',
objectUniversalIdentifier: 'person-universal-identifier',
},
},
});
expect(result[0].properties?.company).toEqual({
type: 'record',
objectUniversalIdentifier: 'company-universal-identifier',
});
expect(result[0].properties?.people).toEqual({
type: 'records',
objectUniversalIdentifier: 'person-universal-identifier',
});
});
it('does not set label when empty or omitted', () => {
const result = jsonSchemaToInputSchema({
type: 'object',
properties: {
empty: { type: 'string', label: '' },
missing: { type: 'string' },
},
});
expect(result[0].properties?.empty).toEqual({ type: 'string' });
expect(result[0].properties?.missing).toEqual({ type: 'string' });
});
});