/** * Standalone integration test runner for the webdav-sync plugin. * * Starts both a FastAPI server (with WebDAV config) and a WebDAV test server, * runs sync.test.js, then cleans up both servers. * * Usage: * WEBDAV_BASE_URL=http://localhost:8081 node fastapi_app/plugins/webdav_sync/tests/run-integration-tests.js * * Environment variables (read from .env.test or process env): * WEBDAV_BASE_URL - WebDAV server base URL (required) * WEBDAV_USERNAME - WebDAV username (default: admin) * WEBDAV_PASSWORD - WebDAV password (default: admin) * WEBDAV_REMOTE_ROOT - Remote root path (default: /dav) */ import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import { run } from 'node:test'; import { spec } from 'node:test/reporters'; import { pipeline } from 'node:stream/promises'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const projectRoot = join(__dirname, '..', '..', '..', '..'); // Load .env.test if it exists try { const { config } = await import('dotenv'); const envFile = join(projectRoot, '.env.test'); config({ path: envFile, override: false }); } catch (e) { // dotenv not required } const { LocalServerManager } = await import(join(projectRoot, 'tests/lib/local-server-manager.js')); const { WebdavServerManager } = await import(join(projectRoot, 'tests/lib/webdav-server-manager.js')); const serverManager = new LocalServerManager({ dbDir: 'tests/api/runtime/db', dataRoot: 'tests/api/runtime', logDir: 'log', }); let webdavManager = null; let exitCode = 0; // Prevent SIGTERM (e.g. propagated from server shutdown) from killing the // process before the finally block can run cleanup and call process.exit(). process.on('SIGTERM', () => process.exit(exitCode)); try { // Start WebDAV server webdavManager = new WebdavServerManager(); await webdavManager.start({ verbose: false }); const webdavConfig = webdavManager.getConfig(); // Start FastAPI server with WebDAV config injected const baseUrl = await serverManager.start({ cleanDb: true, verbose: false, env: { WEBDAV_ENABLED: webdavConfig.WEBDAV_ENABLED, WEBDAV_BASE_URL: webdavConfig.WEBDAV_BASE_URL, WEBDAV_USERNAME: webdavConfig.WEBDAV_USERNAME, WEBDAV_PASSWORD: webdavConfig.WEBDAV_PASSWORD, WEBDAV_REMOTE_ROOT: webdavConfig.WEBDAV_REMOTE_ROOT, }, }); process.env.E2E_BASE_URL = baseUrl; // Run tests const testFile = join(__dirname, 'sync.test.js'); const stream = run({ files: [testFile] }).compose(spec); await pipeline(stream, process.stdout); } catch (err) { console.error('Integration test run failed:', err); exitCode = 1; } finally { if (webdavManager) { await webdavManager.stop({ keepRunning: false }).catch(console.error); } await serverManager.stop({ keepRunning: false }).catch(console.error); process.exit(exitCode); }