mirror of
https://github.com/AikidoSec/safe-chain.git
synced 2026-05-26 12:10:49 +00:00
Add e2e tests
This commit is contained in:
parent
fdef99931e
commit
c00abfb054
8 changed files with 555 additions and 0 deletions
133
e2e/test-helpers.js
Normal file
133
e2e/test-helpers.js
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
import { spawn } from 'child_process';
|
||||
import { mkdtemp, rm } from 'fs/promises';
|
||||
import { join } from 'path';
|
||||
import { tmpdir } from 'os';
|
||||
|
||||
/**
|
||||
* Creates a temporary directory for testing
|
||||
*/
|
||||
export async function createTempDir() {
|
||||
const { writeFile } = await import('fs/promises');
|
||||
const tempDir = await mkdtemp(join(tmpdir(), 'aikido-e2e-'));
|
||||
|
||||
// Create a basic package.json to avoid yarn/pnpm issues
|
||||
const packageJson = {
|
||||
name: 'test-project',
|
||||
version: '1.0.0',
|
||||
description: 'Test project for e2e tests'
|
||||
};
|
||||
|
||||
await writeFile(join(tempDir, 'package.json'), JSON.stringify(packageJson, null, 2));
|
||||
|
||||
return tempDir;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans up a temporary directory
|
||||
*/
|
||||
export async function cleanupTempDir(tempDir) {
|
||||
try {
|
||||
await rm(tempDir, { recursive: true, force: true });
|
||||
} catch {
|
||||
// Ignore cleanup errors
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a command and captures stdout/stderr
|
||||
*/
|
||||
export function runCommand(command, args, options = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = spawn(command, args, {
|
||||
stdio: 'pipe',
|
||||
...options
|
||||
});
|
||||
|
||||
let stdout = '';
|
||||
let stderr = '';
|
||||
|
||||
child.stdout.on('data', (data) => {
|
||||
stdout += data.toString();
|
||||
});
|
||||
|
||||
child.stderr.on('data', (data) => {
|
||||
stderr += data.toString();
|
||||
});
|
||||
|
||||
child.on('close', (code) => {
|
||||
resolve({
|
||||
code,
|
||||
stdout,
|
||||
stderr
|
||||
});
|
||||
});
|
||||
|
||||
child.on('error', (error) => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs an aikido command with timeout
|
||||
*/
|
||||
export async function runAikidoCommand(binaryName, args, options = {}) {
|
||||
const binaryPath = join(process.cwd(), 'bin', `${binaryName}.js`);
|
||||
const timeout = options.timeout || 10000; // 10 second timeout
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = spawn('node', [binaryPath, ...args], {
|
||||
stdio: 'pipe',
|
||||
cwd: options.cwd || process.cwd(),
|
||||
env: { ...process.env, ...options.env }
|
||||
});
|
||||
|
||||
let stdout = '';
|
||||
let stderr = '';
|
||||
let timeoutId;
|
||||
|
||||
child.stdout.on('data', (data) => {
|
||||
stdout += data.toString();
|
||||
});
|
||||
|
||||
child.stderr.on('data', (data) => {
|
||||
stderr += data.toString();
|
||||
});
|
||||
|
||||
child.on('close', (code) => {
|
||||
clearTimeout(timeoutId);
|
||||
resolve({
|
||||
code,
|
||||
stdout,
|
||||
stderr
|
||||
});
|
||||
});
|
||||
|
||||
child.on('error', (error) => {
|
||||
clearTimeout(timeoutId);
|
||||
reject(error);
|
||||
});
|
||||
|
||||
// Set timeout
|
||||
timeoutId = setTimeout(() => {
|
||||
child.kill('SIGKILL');
|
||||
resolve({
|
||||
code: 1,
|
||||
stdout,
|
||||
stderr: stderr + '\n[Test timeout - process killed]'
|
||||
});
|
||||
}, timeout);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a package manager is available in the system
|
||||
*/
|
||||
export async function isPackageManagerAvailable(packageManager) {
|
||||
try {
|
||||
const result = await runCommand(packageManager, ['--version']);
|
||||
return result.code === 0;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue