memory-hooks.ts
1 /** 2 * MemoryHooks Integration Test 3 * 4 * Tests pre/post hooks for memory operations. 5 * 6 * Run: npx ts-node memory-hooks.ts 7 */ 8 9 import { 10 MemoryHooks, 11 createMemoryHooks, 12 createLoggingHooks, 13 createValidationHooks, 14 Memory, 15 createMemory 16 } from '../../../src/praisonai-ts/dist'; 17 18 async function main() { 19 console.log('=== MemoryHooks Integration Test ===\n'); 20 21 // Test 1: Basic hooks 22 console.log('1. Testing basic MemoryHooks:'); 23 const logs: string[] = []; 24 25 const hooks = new MemoryHooks({ 26 beforeStore: async (key, value) => { 27 logs.push(`beforeStore: ${key}`); 28 return { key, value }; 29 }, 30 afterStore: async (key) => { 31 logs.push(`afterStore: ${key}`); 32 }, 33 beforeRetrieve: async (key) => { 34 logs.push(`beforeRetrieve: ${key}`); 35 return key; 36 }, 37 afterRetrieve: async (key, value) => { 38 logs.push(`afterRetrieve: ${key}`); 39 return value; 40 } 41 }); 42 43 await hooks.beforeStore('key1', { data: 'value1' }); 44 await hooks.afterStore('key1', { data: 'value1' }); 45 await hooks.beforeRetrieve('key1'); 46 await hooks.afterRetrieve('key1', { data: 'value1' }); 47 48 console.log(' Triggered hooks:', logs); 49 console.log(' Success: ✅'); 50 51 // Test 2: Logging hooks 52 console.log('\n2. Testing createLoggingHooks:'); 53 const logMessages: string[] = []; 54 const loggingHooks = createLoggingHooks((msg) => logMessages.push(msg)); 55 56 await loggingHooks.beforeStore('test', 'data'); 57 await loggingHooks.afterStore('test', 'data'); 58 await loggingHooks.beforeRetrieve('test'); 59 await loggingHooks.afterRetrieve('test', 'data'); 60 61 console.log(' Log messages:', logMessages.length); 62 logMessages.forEach(m => console.log(' -', m)); 63 console.log(' Success: ✅'); 64 65 // Test 3: Validation hooks 66 console.log('\n3. Testing createValidationHooks:'); 67 const validationHooks = createValidationHooks((key, value) => { 68 // Only allow non-empty strings 69 if (typeof value !== 'string' || value.length === 0) { 70 return { valid: false, reason: 'Value must be non-empty string' }; 71 } 72 return { valid: true }; 73 }); 74 75 const validResult = await validationHooks.beforeStore('good', 'valid string'); 76 console.log(' Valid data allowed:', validResult !== null); 77 78 const invalidResult = await validationHooks.beforeStore('bad', ''); 79 console.log(' Invalid data blocked:', invalidResult === null); 80 console.log(' Success: ✅'); 81 82 // Test 4: Delete hooks 83 console.log('\n4. Testing delete hooks:'); 84 const deleteHooks = new MemoryHooks({ 85 beforeDelete: async (key) => { 86 console.log(` [Hook] About to delete: ${key}`); 87 return true; // Allow deletion 88 }, 89 afterDelete: async (key, success) => { 90 console.log(` [Hook] Delete ${key}: ${success ? 'succeeded' : 'failed'}`); 91 } 92 }); 93 94 const canDelete = await deleteHooks.beforeDelete('item-to-delete'); 95 console.log(' Deletion allowed:', canDelete); 96 await deleteHooks.afterDelete('item-to-delete', true); 97 console.log(' Success: ✅'); 98 99 // Test 5: Search hooks 100 console.log('\n5. Testing search hooks:'); 101 const searchHooks = new MemoryHooks({ 102 beforeSearch: async (query, options) => { 103 console.log(` [Hook] Searching: "${query}"`); 104 // Could modify query here 105 return { query: query.toLowerCase(), options }; 106 }, 107 afterSearch: async (query, results) => { 108 console.log(` [Hook] Found ${results.length} results for "${query}"`); 109 return results; 110 } 111 }); 112 113 const searchParams = await searchHooks.beforeSearch('UPPERCASE QUERY'); 114 console.log(' Modified query:', searchParams?.query); 115 116 await searchHooks.afterSearch('query', [{ id: '1' }, { id: '2' }]); 117 console.log(' Success: ✅'); 118 119 // Test 6: Dynamic hook management 120 console.log('\n6. Testing dynamic hook management:'); 121 const dynamicHooks = new MemoryHooks({}); 122 123 console.log(' Initial config:', Object.keys(dynamicHooks.getConfig()).length === 0 ? 'empty' : 'has hooks'); 124 125 dynamicHooks.addHook('logging', true); 126 dynamicHooks.setLogging(true); 127 128 console.log(' After adding logging:', dynamicHooks.getConfig().logging); 129 130 dynamicHooks.removeHook('logging'); 131 console.log(' After removing:', dynamicHooks.getConfig().logging ?? 'undefined'); 132 console.log(' Success: ✅'); 133 134 console.log('\n=== MemoryHooks Tests Complete ==='); 135 } 136 137 main().catch(console.error);