Skip to main content
Glama
UniversalCreateService-core-resources.test.tsβ€’7.64 kB
/** * Split: UniversalCreateService core resources (companies, people, lists) */ import { describe, it, expect, beforeEach, vi } from 'vitest'; vi.mock('../../src/services/ValidationService.js', () => ({ ValidationService: { truncateSuggestions: vi.fn((s: string[]) => s), validateEmailAddresses: vi.fn(), }, })); vi.mock('../../src/services/UniversalUtilityService.js', () => ({ UniversalUtilityService: { convertTaskToRecord: vi.fn() }, })); vi.mock('../../src/handlers/tool-configs/universal/field-mapper.js', () => ({ mapRecordFields: vi.fn(), validateResourceType: vi.fn(), getFieldSuggestions: vi.fn(), validateFields: vi.fn(), getValidResourceTypes: vi.fn( () => 'companies, people, lists, records, deals, tasks' ), FIELD_MAPPINGS: { companies: { validFields: ['name', 'domain', 'employees'] }, people: { validFields: ['name', 'email_addresses'] }, lists: { validFields: ['name', 'description'] }, }, })); vi.mock('../../src/utils/validation-utils.js', () => ({ validateRecordFields: vi.fn(), })); vi.mock('../../src/utils/attribute-format-helpers.js', () => ({ convertAttributeFormats: vi.fn((type: string, data: any) => data), getFormatErrorHelp: vi.fn( (type: string, field: string, message: string) => `Enhanced: ${message}` ), validatePeopleAttributesPrePost: vi.fn(), })); vi.mock('../../src/config/deal-defaults.js', () => ({ applyDealDefaultsWithValidation: vi.fn(), getDealDefaults: vi.fn(() => ({ stage: 'default-stage' })), validateDealInput: vi.fn(() => ({ isValid: true, suggestions: [], warnings: [], })), })); vi.mock('../../src/utils/normalization/people-normalization.js', () => ({ PeopleDataNormalizer: { normalizePeopleData: vi.fn((d: any) => d) }, })); vi.mock('../../src/errors/enhanced-api-errors.js', () => ({ EnhancedApiError: vi .fn() .mockImplementation( ( message: string, statusCode: number, endpoint: string, method: string ) => { const error: any = new Error(message); error.statusCode = statusCode; error.endpoint = endpoint; error.method = method; error.name = 'EnhancedApiError'; return error; } ), ErrorTemplates: { TASK_FIELD_MAPPING: vi.fn( (tried: string, correct: string) => new Error(`Use ${correct} instead of ${tried}`) ), }, ErrorEnhancer: { autoEnhance: vi.fn((e: any) => e) }, })); vi.mock('../../src/utils/logger.js', () => ({ debug: vi.fn(), createScopedLogger: vi.fn(() => ({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), })), OperationType: { API_CALL: 'api_call' }, })); vi.mock('../../src/objects/companies/index.js', () => ({ createCompany: vi.fn(), })); vi.mock('../../src/objects/lists.js', () => ({ createList: vi.fn() })); vi.mock('../../src/objects/people/index.js', () => ({ createPerson: vi.fn() })); vi.mock('../../src/objects/records/index.js', () => ({ createObjectRecord: vi.fn(), })); // Mock the create service factory to return a mock service const mockCreateService = { createCompany: vi.fn(), createPerson: vi.fn(), createTask: vi.fn(), createList: vi.fn(), createNote: vi.fn(), createDeal: vi.fn(), updateTask: vi.fn(), }; vi.mock('../../src/services/create/index.js', () => ({ getCreateService: vi.fn(() => mockCreateService), shouldUseMockData: vi.fn(() => true), })); import { UniversalCreateService } from '../../src/services/UniversalCreateService.js'; import { UniversalResourceType } from '../../src/handlers/tool-configs/universal/types.js'; import { AttioRecord } from '../../src/types/attio.js'; import { ValidationService } from '../../src/services/ValidationService.js'; import { PeopleDataNormalizer } from '../../src/utils/normalization/people-normalization.js'; import { convertAttributeFormats } from '../../src/utils/attribute-format-helpers.js'; import { createList } from '../../src/objects/lists.js'; import { getCreateService } from '../../src/services/create/index.js'; import { validateFields, mapRecordFields, } from '../../src/handlers/tool-configs/universal/field-mapper.js'; describe('UniversalCreateService', () => { beforeEach(() => { vi.clearAllMocks(); delete process.env.E2E_MODE; delete process.env.USE_MOCK_DATA; delete process.env.OFFLINE_MODE; delete process.env.PERFORMANCE_TEST; delete process.env.ENABLE_ENHANCED_VALIDATION; // Setup default mock returns vi.mocked(validateFields).mockReturnValue({ valid: true, warnings: [], suggestions: [], errors: [], } as any); vi.mocked(mapRecordFields).mockImplementation( (resourceType: string, data: any) => ({ mapped: data, warnings: [], errors: [], }) as any ); }); describe('createRecord', () => { it('should create a company record', async () => { const mockCompany: AttioRecord = { id: { record_id: 'comp_123' }, values: { name: 'Test Company' }, } as any; mockCreateService.createCompany.mockResolvedValue(mockCompany); const result = await UniversalCreateService.createRecord({ resource_type: UniversalResourceType.COMPANIES, record_data: { values: { name: 'Test Company' } }, }); expect(convertAttributeFormats).toHaveBeenCalledWith('companies', { name: 'Test Company', }); expect(mockCreateService.createCompany).toHaveBeenCalled(); expect(result).toEqual(mockCompany); }); it('should create a person record with email validation', async () => { const mockPerson: AttioRecord = { id: { record_id: 'person_456' }, values: { name: 'John Doe' }, } as any; mockCreateService.createPerson.mockResolvedValue(mockPerson); const result = await UniversalCreateService.createRecord({ resource_type: UniversalResourceType.PEOPLE, record_data: { values: { name: 'John Doe' } }, }); expect(ValidationService.validateEmailAddresses).toHaveBeenCalledWith({ name: 'John Doe', }); expect(PeopleDataNormalizer.normalizePeopleData).toHaveBeenCalled(); expect(convertAttributeFormats).toHaveBeenCalledWith('people', { name: 'John Doe', }); expect(mockCreateService.createPerson).toHaveBeenCalled(); expect(result).toEqual(mockPerson); }); it('should create a list record and convert format', async () => { const mockList = { id: { list_id: 'list_789' }, title: 'Test List', name: 'Test List', description: 'Test description', object_slug: 'companies', api_slug: 'test-list', workspace_id: 'ws_123', workspace_member_access: 'read', created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z', } as any; vi.mocked(createList).mockResolvedValue(mockList); const result = await UniversalCreateService.createRecord({ resource_type: UniversalResourceType.LISTS, record_data: { values: { name: 'Test List' } }, }); expect(createList).toHaveBeenCalledWith({ name: 'Test List' }); expect(result).toEqual({ id: { record_id: 'list_789', list_id: 'list_789' }, values: { name: 'Test List', description: 'Test description', parent_object: 'companies', api_slug: 'test-list', workspace_id: 'ws_123', workspace_member_access: 'read', created_at: '2024-01-01T00:00:00Z', }, }); }); }); });

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