ECC/tests/hooks/pre-bash-tmux-reminder.test.js

79 lines
2.3 KiB
JavaScript

const assert = require('assert');
const path = require('path');
const { spawnSync } = require('child_process');
const script = path.join(__dirname, '..', '..', 'scripts', 'hooks', 'pre-bash-tmux-reminder.js');
function run(command, extraEnv = {}) {
const { TMUX: _tmux, ...envWithoutTmux } = process.env;
const result = spawnSync(process.execPath, [script], {
encoding: 'utf8',
input: JSON.stringify({ tool_input: { command } }),
timeout: 10000,
env: { ...envWithoutTmux, ...extraEnv }
});
if (result.error) throw result.error;
if (result.signal) throw new Error(`hook terminated by ${result.signal}`);
assert.strictEqual(result.status, 0, `unexpected exit for ${command}: ${result.stderr || ''}`);
return result.stdout || '';
}
function hasReminder(command, extraEnv) {
return run(command, extraEnv).includes('Consider running in tmux');
}
function runTests() {
console.log('\n=== Testing pre-bash-tmux-reminder.js ===\n');
if (process.platform === 'win32') {
console.log(' SKIP: hook is a no-op on win32');
return true;
}
const cases = [
['fires for yarn install and yarn test', () => {
assert.ok(hasReminder('yarn install'));
assert.ok(hasReminder('yarn test'));
}],
['does not fire for ordinary yarn commands', () => {
assert.ok(!hasReminder('yarn add react'));
assert.ok(!hasReminder('yarn build'));
assert.ok(!hasReminder('yarn dev'));
assert.ok(!hasReminder('yarn --version'));
assert.ok(!hasReminder('yarn'));
}],
['keeps sibling package-manager behavior', () => {
assert.ok(hasReminder('npm install'));
assert.ok(hasReminder('pnpm test'));
assert.ok(hasReminder('bun install'));
assert.ok(!hasReminder('npm run dev'));
}],
['suppresses reminders inside tmux', () => {
assert.ok(!hasReminder('yarn install', { TMUX: '/tmp/tmux-1000/default,1,0' }));
}]
];
let failed = 0;
for (const [name, fn] of cases) {
try {
fn();
console.log(` PASS ${name}`);
} catch (error) {
failed++;
console.log(` FAIL ${name}`);
console.log(` ${error.message}`);
}
}
console.log(`\nResults: ${cases.length - failed} passed, ${failed} failed\n`);
return failed === 0;
}
if (require.main === module) {
process.exit(runTests() ? 0 : 1);
}
module.exports = { runTests };