Files
multi-simadmin/test/installer.test.js
T

48 lines
2.1 KiB
JavaScript

import assert from 'node:assert/strict';
import { execFileSync } from 'node:child_process';
import { readFileSync } from 'node:fs';
import { test } from 'node:test';
const installer = new URL('../scripts/install.sh', import.meta.url);
const source = readFileSync(installer, 'utf8');
test('one-click installer has safe lifecycle commands and pinned production defaults', () => {
execFileSync('/bin/sh', ['-n', installer.pathname]);
const help = execFileSync('/bin/sh', [installer.pathname, 'help'], { encoding: 'utf8' });
for (const command of ['install', 'start', 'stop', 'restart', 'status', 'uninstall']) {
assert.match(help, new RegExp(`\\b${command}\\b`));
}
assert.match(source, /PNPM_VERSION="11\.13\.0"/);
assert.match(source, /API_HOST=127\.0\.0\.1/);
assert.match(source, /API_PORT=8790/);
assert.match(source, /MULTI_SIMADMIN_GATEWAY_HOST=0\.0\.0\.0/);
assert.match(source, /CANARY_UPSTREAM_PORT=8790/);
assert.doesNotMatch(source, /CANARY_PORT=8789/);
assert.match(source, /umask 077/);
assert.match(source, /install -m 600/);
assert.match(source, /--frozen-lockfile/);
assert.match(source, /trap 'rollback_start' EXIT HUP INT TERM/);
assert.match(source, /保留 PID 文件/);
assert.match(source, /node --import tsx .*production-cli\.ts/);
assert.match(source, /node --import tsx .*production-gateway-cli\.ts/);
assert.doesNotMatch(source, /nohup corepack pnpm/);
});
test('installer refuses unsupported platforms and preserves data by default on uninstall', () => {
assert.match(source, /Darwin/);
assert.match(source, /当前生产版仅支持 macOS/);
assert.match(source, /默认保留数据/);
assert.doesNotMatch(source, /rm -rf "\$DATA_ROOT"/);
assert.doesNotMatch(source, /git reset --hard|git clean -fdx/);
});
test('README exposes the token-free Gitea one-click command', () => {
const readme = readFileSync(new URL('../README.md', import.meta.url), 'utf8');
assert.match(
readme,
/curl -fsSL https:\/\/gitea\.chickliu\.fun\/Hermes\/multi-simadmin\/raw\/branch\/main\/scripts\/install\.sh \| sh/,
);
assert.doesNotMatch(readme, /https:\/\/[^\s/]+:[^\s@]+@gitea\.chickliu\.fun/);
});