import { expect, tap } from '../ts/plugins.js'; import type { ClamAVLogEvent } from '../ts/classes.clamav.manager.js'; import { setupClamAV, cleanupClamAV, getManager } from './helpers/clamav.helper.js'; type ClamAVManager = Awaited>; let manager: ClamAVManager; tap.test('setup', async () => { manager = await setupClamAV(); expect(manager).toBeTruthy(); }); tap.test('should have initialized container and receive logs', async () => { // Create a promise that resolves when we receive a log const logPromise = new Promise((resolve) => { // First check if we already have logs const existingLogs = manager.getLogs(); if (existingLogs.length > 0) { console.log('[Test] Found existing logs:', existingLogs.map(log => `${log.type}: ${log.message}`).join('\n')); resolve(); return; } // If no existing logs, wait for new ones const handler = (event: ClamAVLogEvent) => { console.log(`[Test] Received log event: ${event.type} - ${event.message}`); manager.removeListener('log', handler); resolve(); }; manager.on('log', handler); }); // Wait for logs with timeout const timeoutPromise = new Promise((_, reject) => { setTimeout(() => reject(new Error('Timeout waiting for logs')), 30000); }); try { await Promise.race([logPromise, timeoutPromise]); } catch (error) { console.error('Error waiting for logs:', error); throw error; } console.log('Log received check passed'); // Verify container is running by checking if we can get database info try { const dbInfo = await manager.getDatabaseInfo(); expect(dbInfo).toBeTruthy(); console.log('Database info check passed'); } catch (error) { console.error('Error getting database info:', error); throw new Error('Failed to get database info - container may not be fully initialized'); } }); tap.test('should get database info', async () => { const dbInfo = await manager.getDatabaseInfo(); console.log('Database Info:', dbInfo); expect(dbInfo).toBeTruthy(); }); tap.test('should update database', async () => { await manager.updateDatabase(); }); tap.test('cleanup', async () => { await cleanupClamAV(); }); tap.start();