mirror of
https://github.com/mempool/mempool.git
synced 2026-08-13 12:33:11 +02:00
72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
// Setup that runs BEFORE setupFiles
|
|
// This ensures MEMPOOL_CONFIG_FILE is set before any modules are loaded
|
|
import * as path from 'path';
|
|
import { execSync } from 'child_process';
|
|
|
|
// Set the config file path if not already set
|
|
if (!process.env.MEMPOOL_CONFIG_FILE) {
|
|
process.env.MEMPOOL_CONFIG_FILE = path.join(__dirname, 'mempool-config.test.json');
|
|
}
|
|
|
|
// Helper to get docker compose command (v1 or v2)
|
|
function getDockerComposeCmd(): string {
|
|
try {
|
|
execSync('docker compose version', { stdio: 'pipe' });
|
|
return 'docker compose';
|
|
} catch {
|
|
try {
|
|
execSync('docker-compose version', { stdio: 'pipe' });
|
|
return 'docker-compose';
|
|
} catch {
|
|
throw new Error('Neither "docker compose" nor "docker-compose" is available');
|
|
}
|
|
}
|
|
}
|
|
|
|
// Start the Docker test database container
|
|
module.exports = async () => {
|
|
// Skip if SKIP_DB_SETUP is set (e.g., when test-with-db.sh manages the database)
|
|
if (process.env.SKIP_DB_SETUP) {
|
|
console.log('Skipping database setup (managed externally)');
|
|
return;
|
|
}
|
|
|
|
console.log('Starting test database container...');
|
|
try {
|
|
const composeFile = path.join(__dirname, 'docker-compose.test.yml');
|
|
const dockerComposeCmd = getDockerComposeCmd();
|
|
|
|
// Start the container
|
|
execSync(`${dockerComposeCmd} -f "${composeFile}" up -d`, {
|
|
stdio: 'inherit',
|
|
cwd: __dirname
|
|
});
|
|
|
|
// Wait for database to be ready
|
|
console.log('Waiting for database to be ready...');
|
|
let attempts = 0;
|
|
const maxAttempts = 30;
|
|
|
|
while (attempts < maxAttempts) {
|
|
try {
|
|
execSync(`${dockerComposeCmd} -f "${composeFile}" exec -T db-test mysqladmin ping -h localhost -u mempool_test -pmempool_test --silent`, {
|
|
cwd: __dirname,
|
|
stdio: 'pipe'
|
|
});
|
|
console.log('Database is ready!');
|
|
break;
|
|
} catch (e) {
|
|
attempts++;
|
|
if (attempts >= maxAttempts) {
|
|
throw new Error('Database did not start in time');
|
|
}
|
|
// Wait 1 second before retrying
|
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to start test database:', error instanceof Error ? error.message : error);
|
|
throw error;
|
|
}
|
|
};
|
|
|