Skip to main content
Glama
attribute-validator.test.tsβ€’10.4 kB
/** * Tests for the attribute validator */ import { describe, it, expect } from 'vitest'; import { validateAttributeValue, ValidationResult, AttributeType, } from '../../src/validators/attribute-validator.js'; describe('Attribute Validator', () => { describe('validateAttributeValue', () => { describe('Boolean validation', () => { it('should accept boolean values', () => { expect(validateAttributeValue('test', true, 'boolean')).toEqual({ valid: true, convertedValue: true, }); expect(validateAttributeValue('test', false, 'boolean')).toEqual({ valid: true, convertedValue: false, }); }); it('should convert string values to booleans', () => { expect(validateAttributeValue('test', 'true', 'boolean')).toEqual({ valid: true, convertedValue: true, }); expect(validateAttributeValue('test', 'false', 'boolean')).toEqual({ valid: true, convertedValue: false, }); expect(validateAttributeValue('test', 'yes', 'boolean')).toEqual({ valid: true, convertedValue: true, }); expect(validateAttributeValue('test', 'no', 'boolean')).toEqual({ valid: true, convertedValue: false, }); }); it('should convert numeric values to booleans', () => { expect(validateAttributeValue('test', 1, 'boolean')).toEqual({ valid: true, convertedValue: true, }); expect(validateAttributeValue('test', 0, 'boolean')).toEqual({ valid: true, convertedValue: false, }); }); it('should reject invalid boolean values', () => { const result = validateAttributeValue('test', 'invalid', 'boolean'); expect(result.valid).toBe(false); expect(result.error).toBeDefined(); }); }); describe('Number validation', () => { it('should accept number values', () => { expect(validateAttributeValue('test', 123, 'number')).toEqual({ valid: true, convertedValue: 123, }); expect(validateAttributeValue('test', 0, 'number')).toEqual({ valid: true, convertedValue: 0, }); expect(validateAttributeValue('test', -45.67, 'number')).toEqual({ valid: true, convertedValue: -45.67, }); }); it('should convert string values to numbers', () => { expect(validateAttributeValue('test', '123', 'number')).toEqual({ valid: true, convertedValue: 123, }); expect(validateAttributeValue('test', '0', 'number')).toEqual({ valid: true, convertedValue: 0, }); expect(validateAttributeValue('test', '-45.67', 'number')).toEqual({ valid: true, convertedValue: -45.67, }); }); it('should convert boolean values to numbers', () => { expect(validateAttributeValue('test', true, 'number')).toEqual({ valid: true, convertedValue: 1, }); expect(validateAttributeValue('test', false, 'number')).toEqual({ valid: true, convertedValue: 0, }); }); it('should reject invalid number values', () => { const result = validateAttributeValue('test', 'not a number', 'number'); expect(result.valid).toBe(false); expect(result.error).toBeDefined(); }); }); describe('String validation', () => { it('should accept string values', () => { expect(validateAttributeValue('test', 'hello', 'string')).toEqual({ valid: true, convertedValue: 'hello', }); expect(validateAttributeValue('test', '', 'string')).toEqual({ valid: true, convertedValue: '', }); }); it('should convert number values to strings', () => { expect(validateAttributeValue('test', 123, 'string')).toEqual({ valid: true, convertedValue: '123', }); expect(validateAttributeValue('test', 0, 'string')).toEqual({ valid: true, convertedValue: '0', }); }); it('should convert boolean values to strings', () => { expect(validateAttributeValue('test', true, 'string')).toEqual({ valid: true, convertedValue: 'true', }); expect(validateAttributeValue('test', false, 'string')).toEqual({ valid: true, convertedValue: 'false', }); }); it('should convert Date objects to ISO strings', () => { const testDate = new Date('2023-01-01T12:00:00Z'); expect(validateAttributeValue('test', testDate, 'string')).toEqual({ valid: true, convertedValue: testDate.toISOString(), }); }); }); describe('Date validation', () => { it('should accept Date objects', () => { const testDate = new Date('2023-01-01T12:00:00Z'); expect(validateAttributeValue('test', testDate, 'date')).toEqual({ valid: true, convertedValue: testDate.toISOString(), }); }); it('should convert ISO string dates', () => { const dateString = '2023-01-01T12:00:00Z'; const result = validateAttributeValue('test', dateString, 'date'); expect(result.valid).toBe(true); expect(result.convertedValue).toBeDefined(); }); it('should convert timestamp numbers', () => { const timestamp = 1672574400000; // 2023-01-01T12:00:00Z const result = validateAttributeValue('test', timestamp, 'date'); expect(result.valid).toBe(true); expect(result.convertedValue).toBeDefined(); }); it('should reject invalid date values', () => { const result = validateAttributeValue('test', 'not a date', 'date'); expect(result.valid).toBe(false); expect(result.error).toBeDefined(); }); }); describe('Array validation', () => { it('should accept array values', () => { expect(validateAttributeValue('test', [1, 2, 3], 'array')).toEqual({ valid: true, convertedValue: [1, 2, 3], }); expect(validateAttributeValue('test', [], 'array')).toEqual({ valid: true, convertedValue: [], }); }); it('should convert non-array values to arrays', () => { expect(validateAttributeValue('test', 'single', 'array')).toEqual({ valid: true, convertedValue: ['single'], }); expect(validateAttributeValue('test', 123, 'array')).toEqual({ valid: true, convertedValue: [123], }); }); }); describe('Object validation', () => { it('should accept object values', () => { const testObj = { key: 'value' }; expect(validateAttributeValue('test', testObj, 'object')).toEqual({ valid: true, convertedValue: testObj, }); }); it('should reject non-object values', () => { const result = validateAttributeValue( 'test', 'not an object', 'object' ); expect(result.valid).toBe(false); expect(result.error).toBeDefined(); }); }); describe('Select validation', () => { it('should accept string values', () => { expect(validateAttributeValue('test', 'option1', 'select')).toEqual({ valid: true, convertedValue: 'option1', }); }); it('should accept array of strings', () => { expect( validateAttributeValue('test', ['option1', 'option2'], 'select') ).toEqual({ valid: true, convertedValue: ['option1', 'option2'], }); }); it('should convert array of non-strings to array of strings', () => { expect(validateAttributeValue('test', [1, true], 'select')).toEqual({ valid: true, convertedValue: ['1', 'true'], }); }); }); describe('Record reference validation', () => { it('should accept string IDs', () => { expect( validateAttributeValue('test', 'rec_123', 'record-reference') ).toEqual({ valid: true, convertedValue: 'rec_123', }); }); it('should extract record_id from objects', () => { expect( validateAttributeValue( 'test', { record_id: 'rec_123' }, 'record-reference' ) ).toEqual({ valid: true, convertedValue: 'rec_123', }); }); it('should extract id from objects as fallback', () => { expect( validateAttributeValue('test', { id: 'rec_123' }, 'record-reference') ).toEqual({ valid: true, convertedValue: 'rec_123', }); }); it('should process arrays of records', () => { const input = ['rec_123', { record_id: 'rec_456' }, { id: 'rec_789' }]; expect( validateAttributeValue('test', input, 'record-reference') ).toEqual({ valid: true, convertedValue: ['rec_123', 'rec_456', 'rec_789'], }); }); it('should reject invalid record references', () => { const result = validateAttributeValue( 'test', { foo: 'bar' }, 'record-reference' ); expect(result.valid).toBe(false); expect(result.error).toBeDefined(); }); }); describe('Null/undefined handling', () => { it('should always accept null values', () => { expect(validateAttributeValue('test', null, 'string')).toEqual({ valid: true, convertedValue: null, }); expect(validateAttributeValue('test', null, 'number')).toEqual({ valid: true, convertedValue: null, }); expect(validateAttributeValue('test', null, 'boolean')).toEqual({ valid: true, convertedValue: null, }); }); it('should always accept undefined values', () => { expect(validateAttributeValue('test', undefined, 'string')).toEqual({ valid: true, convertedValue: null, }); }); }); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kesslerio/attio-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server