import { uploadMedia } from '../../src/actions/media'; import { db } from '../../src/db/index'; import { media } from '../../src/db/schema/media'; import minioClient from '../../src/lib/minio'; import { startMediaWorker } from '../../src/workers/media-processor'; import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; async function runTest() { console.log('๐Ÿงช Starting Media Pipeline Integration Test...'); // 1. Setup: Create a dummy video file (mp4) const testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'test-media-')); const testFilePath = path.join(testDir, 'test_video.mp4'); // Note: In a real environment, we'd use a real small mp4. // For this test, we'll assume a file exists or create a dummy one if possible. if (!fs.existsSync('test_sample.mp4')) { console.error('โŒ Error: Please place a small "test_sample.mp4" file in the project root for testing.'); process.exit(1); } fs.copyFileSync('test_sample.mp4', testFilePath); try { // 2. Start Worker const worker = await startMediaWorker(); console.log('โœ… Worker started'); // 3. Simulate Upload (Producer) console.log('๐Ÿ“ค Simulating upload...'); const fileMock = { name: 'test_sample.mp4', type: 'video/mp4', size: fs.statSync(testFilePath).size, arrayBuffer: async () => fs.readFileSync(testFilePath).buffer, }; const record = await uploadMedia(fileMock as any); console.log(`โœ… Uploaded. Media ID: ${record.id}, Status: ${record.status}`); // 4. Wait for Worker to process (Polling) console.log('โณ Waiting for worker to complete processing...'); let attempts = 0; const maxAttempts = 60; // ~60 seconds let completed = false; while (attempts < maxAttempts) { await new Promise(r => setTimeout(r, 1000)); const updatedRecord = await db.query.media.findFirst({ where: (m, { eq }) => eq(m.id, record.id), }); if (updatedRecord?.status === 'completed') { console.log('๐ŸŽ‰ Success! Media status is COMPLETED'); console.log('Metadata:', updatedRecord.metadata); completed = true; break; } else if (updatedRecord?.status === 'failed') { console.error('โŒ Processing failed according to DB status'); break; } attempts++; process.stdout.write('.'); } if (!completed) { console.error('\nโŒ Timeout: Worker did not complete processing in time.'); } else { console.log('\nโœจ Integration Test Passed!'); } } catch (err) { console.error('โŒ Test failed with error:', err); } finally { // Cleanup fs.rmSync(testDir, { recursive: true, force: true }); process.exit(0); } } runTest();