Skip to main content
Glama
error-handling-data-recovery.e2e.test.ts3.29 kB
/** * Split: Critical Error Handling E2E – Data Consistency & Recovery */ import { describe, beforeAll, afterAll, it, expect, vi } from 'vitest'; import { E2ETestBase } from '../setup.js'; import { E2EAssertions, type McpToolResponse } from '../utils/assertions.js'; import { loadE2EConfig } from '../utils/config-loader.js'; import { callUniversalTool, callNotesTool, validateTestEnvironment, } from '../utils/enhanced-tool-caller.js'; import { testDataGenerator } from '../fixtures/index.js'; import { extractRecordId, hasValidContent, cleanupTestRecords, createTestRecord, } from '../utils/error-handling-utils.js'; describe.skipIf( !process.env.ATTIO_API_KEY || process.env.SKIP_E2E_TESTS === 'true' )('Critical Error Handling E2E – Data Consistency and Recovery', () => { let testCompanyId: string | undefined; beforeAll(async () => { loadE2EConfig(); const validation = await validateTestEnvironment(); if (!validation.valid) console.warn('⚠️ Test environment warnings:', validation.warnings); await E2ETestBase.setup({ requiresRealApi: false, cleanupAfterTests: true, timeout: 120000, }); // Minimal seed data try { const companyData = testDataGenerator.companies.basicCompany(); testCompanyId = await createTestRecord( (resourceType, data) => callUniversalTool('create-record', { resource_type: resourceType as any, record_data: data, }), 'companies', companyData ); } catch (e) { console.warn( '⚠️ Setup failed:', e instanceof Error ? e.message : String(e) ); } }, 60000); afterAll(async () => { if (testCompanyId) await cleanupTestRecords([testCompanyId]); }, 60000); it('should handle incomplete transaction scenarios', async () => { const companyData = testDataGenerator.companies.basicCompany(); const createResponse = (await callUniversalTool('create-record', { resource_type: 'companies', record_data: companyData as any, })) as McpToolResponse; if (hasValidContent(createResponse)) { const companyId = extractRecordId(createResponse); if (companyId) { const noteResponse = (await callNotesTool('create-note', { resource_type: 'companies', record_id: companyId, title: 'Immediate Note', content: 'Testing immediate reference', format: 'markdown', })) as McpToolResponse; expect(noteResponse).toBeDefined(); await callUniversalTool('delete-record', { resource_type: 'companies', record_id: companyId, }).catch(() => {}); } } }, 60000); it('should handle error recovery gracefully', async () => { const invalidResponse = (await callUniversalTool('get-record-details', { resource_type: 'companies', record_id: 'intentionally-invalid-id', })) as McpToolResponse; expect(invalidResponse.isError).toBe(true); if (testCompanyId) { const validResponse = (await callUniversalTool('get-record-details', { resource_type: 'companies', record_id: testCompanyId, })) as McpToolResponse; expect(validResponse).toBeDefined(); } }); });

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