79 lines
2.3 KiB
JavaScript
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 };
|