UNPKG

@agentdb/sdk

Version:

JavaScript SDK for AgentDB database service

332 lines (270 loc) 10.1 kB
/** * Test Connection Example * * This example tests the basic connectivity and functionality of the SDK * without requiring actual database operations. It validates the SDK * structure and error handling. */ import { DatabaseService, DatabaseConnection, AgentDBError, AuthenticationError, ValidationError, DatabaseError } from '../index.js'; function testSDKStructure() { console.log('=== Testing SDK Structure ===\n'); // Test 1: Class constructors console.log('1. Testing class constructors...'); try { // Should throw validation error for missing parameters new DatabaseService(); } catch (error) { if (error instanceof ValidationError) { console.log('✓ DatabaseService validation works'); } else { console.log('✗ Unexpected error:', error.message); } } try { // Should create successfully const service = new DatabaseService('https://example.com', 'test-key'); console.log('✓ DatabaseService created successfully'); // Test connection creation const connection = service.connect('test-token', 'test-db', 'sqlite'); console.log('✓ DatabaseConnection created successfully'); } catch (error) { console.log('✗ Error creating service/connection:', error.message); } // Test 2: Error class hierarchy console.log('\n2. Testing error class hierarchy...'); const errors = [ new AgentDBError('Test error'), new AuthenticationError('Auth error'), new ValidationError('Validation error'), new DatabaseError('Database error') ]; errors.forEach(error => { console.log(`✓ ${error.constructor.name}: ${error instanceof AgentDBError ? 'extends AgentDBError' : 'standalone'}`); }); // Test 3: Parameter validation console.log('\n3. Testing parameter validation...'); try { const service = new DatabaseService('https://example.com', 'test-key'); const connection = service.connect('', 'test-db', 'sqlite'); // Empty token } catch (error) { if (error instanceof ValidationError) { console.log('✓ Token validation works'); } } try { const service = new DatabaseService('https://example.com', 'test-key'); const connection = service.connect('test-token', '', 'sqlite'); // Empty dbName } catch (error) { if (error instanceof ValidationError) { console.log('✓ Database name validation works'); } } try { const service = new DatabaseService('https://example.com', 'test-key'); const connection = service.connect('test-token', 'test-db', 'invalid'); // Invalid dbType } catch (error) { if (error instanceof ValidationError) { console.log('✓ Database type validation works'); } } console.log('\n=== SDK Structure Tests Complete ===\n'); } async function testMockRequests() { console.log('=== Testing Mock Requests ===\n'); const service = new DatabaseService('https://httpbin.org', 'test-key'); // Test 1: Test request structure (using httpbin.org for testing) console.log('1. Testing request structure...'); try { // This will fail but we can check the request structure await service.listDatabases('test-token'); } catch (error) { if (error instanceof AgentDBError) { console.log('✓ Request properly structured (expected to fail with httpbin)'); } } // Test 2: Test statement validation console.log('\n2. Testing statement validation...'); const connection = service.connect('test-token', 'test-db', 'sqlite'); try { await connection.execute(null); } catch (error) { if (error instanceof ValidationError && error.message.includes('statements is required')) { console.log('✓ Null statements validation works'); } } try { await connection.execute([{ params: [] }]); // Missing sql } catch (error) { if (error instanceof ValidationError && error.message.includes('sql')) { console.log('✓ Missing SQL validation works'); } } try { await connection.execute([{ sql: 'SELECT 1', params: 'invalid' }]); // Invalid params } catch (error) { if (error instanceof ValidationError && error.message.includes('params')) { console.log('✓ Invalid params validation works'); } } console.log('\n=== Mock Request Tests Complete ===\n'); } function testUsagePatterns() { console.log('=== Testing Usage Patterns ===\n'); const service = new DatabaseService('https://api.agentdb.dev', 'test-key'); // Test 1: Single statement format console.log('1. Testing statement formats...'); const connection = service.connect('test-token', 'test-db', 'sqlite'); // These should not throw validation errors try { // Single statement object const singleStmt = { sql: 'SELECT 1', params: [] }; console.log('✓ Single statement format valid'); // Array of statements const multiStmt = [ { sql: 'SELECT 1', params: [] }, { sql: 'SELECT 2', params: [1, 2] } ]; console.log('✓ Multiple statements format valid'); // Statement without params const noParams = { sql: 'SELECT 1' }; console.log('✓ Statement without params valid'); } catch (error) { console.log('✗ Statement format error:', error.message); } // Test 2: URL handling console.log('\n2. Testing URL handling...'); const urlTests = [ 'https://api.agentdb.dev', 'https://api.agentdb.dev/', 'http://localhost:3000', 'http://localhost:3000/' ]; urlTests.forEach(url => { try { const testService = new DatabaseService(url, 'test-key'); console.log(`✓ URL "${url}" handled correctly -> "${testService.baseUrl}"`); } catch (error) { console.log(`✗ URL "${url}" failed:`, error.message); } }); console.log('\n=== Usage Pattern Tests Complete ===\n'); } function testNewMethods() { console.log('=== Testing New Database Management Methods ===\n'); const service = new DatabaseService('https://api.agentdb.dev', 'test-key'); // Test 1: Delete database parameter validation console.log('1. Testing delete database validation...'); try { // Should not throw - just testing parameter validation service.deleteDatabase('', 'test-db', 'sqlite'); // Empty token } catch (error) { if (error instanceof ValidationError && error.message.includes('token')) { console.log('✓ Delete database token validation works'); } } try { service.deleteDatabase('test-token', '', 'sqlite'); // Empty dbName } catch (error) { if (error instanceof ValidationError && error.message.includes('dbName')) { console.log('✓ Delete database name validation works'); } } // Test 2: Rename database parameter validation console.log('\n2. Testing rename database validation...'); try { service.renameDatabase('test-token', '', 'new-name', 'sqlite'); // Empty oldDbName } catch (error) { if (error instanceof ValidationError && error.message.includes('oldDbName')) { console.log('✓ Rename database old name validation works'); } } try { service.renameDatabase('test-token', 'old-name', '', 'sqlite'); // Empty newDbName } catch (error) { if (error instanceof ValidationError && error.message.includes('newDbName')) { console.log('✓ Rename database new name validation works'); } } // Test 3: Copy database parameter validation console.log('\n3. Testing copy database validation...'); try { service.copyDatabase('', 'source-db', 'sqlite', 'dest-token', 'dest-db'); // Empty sourceToken } catch (error) { if (error instanceof ValidationError && error.message.includes('sourceToken')) { console.log('✓ Copy database source token validation works'); } } try { service.copyDatabase('source-token', 'source-db', 'invalid-type', 'dest-token', 'dest-db'); // Invalid type } catch (error) { if (error instanceof ValidationError && error.message.includes('sourceDbType')) { console.log('✓ Copy database type validation works'); } } // Test 4: Upload URL parameter validation console.log('\n4. Testing upload URL validation...'); try { service.getUploadUrl('test-token', '', 'sqlite'); // Empty dbName } catch (error) { if (error instanceof ValidationError && error.message.includes('dbName')) { console.log('✓ Upload URL database name validation works'); } } try { service.getUploadUrl('test-token', 'test-db', 'invalid'); // Invalid dbType } catch (error) { if (error instanceof ValidationError && error.message.includes('dbType')) { console.log('✓ Upload URL database type validation works'); } } // Test 5: Download URL parameter validation console.log('\n5. Testing download URL validation...'); try { service.getDownloadUrl('', 'test-db', 'sqlite'); // Empty token } catch (error) { if (error instanceof ValidationError && error.message.includes('token')) { console.log('✓ Download URL token validation works'); } } // Test 6: Method existence console.log('\n6. Testing method existence...'); const expectedMethods = [ 'listDatabases', 'connect', 'deleteDatabase', 'renameDatabase', 'copyDatabase', 'getUploadUrl', 'getDownloadUrl' ]; expectedMethods.forEach(method => { if (typeof service[method] === 'function') { console.log(`✓ Method ${method} exists`); } else { console.log(`✗ Method ${method} missing`); } }); console.log('\n=== New Methods Tests Complete ===\n'); } // Run all tests async function runAllTests() { console.log('🧪 AgentDB SDK Test Suite\n'); testSDKStructure(); await testMockRequests(); testUsagePatterns(); testNewMethods(); console.log('✅ All tests completed!\n'); console.log('📝 Next steps:'); console.log(' 1. Replace test credentials with real ones'); console.log(' 2. Run basic-usage.js example'); console.log(' 3. Try database-management.js for full management features'); console.log(' 4. Try analytics-duckdb.js for advanced features'); } runAllTests().catch(console.error);