Files
3x-ui/docs/lib/xray/install.test.ts
T
MHSanaei 9b91f0f42e docs: vendor the documentation site into the monorepo
Fold the standalone 3x-ui-docs project (Next.js 16 + Fumadocs, deployed to
docs.sanaei.dev) into docs/ so the panel and its documentation share a single
source of truth, the way sing-box keeps its docs in-tree. The old repo becomes
redundant and can be retired.

- Import the full site under docs/ (app, components, content, lib, public,
  scripts, config). The self-contained pnpm project sits alongside the existing
  engineering notes with no filename collisions.
- Re-point "Edit on GitHub" links from MHSanaei/3x-ui-docs to this repo's
  docs/content/docs path (docs/lib/shared.ts, docs/app/.../page.tsx).
- Add docs-ci.yml and docs-deploy.yml under .github/workflows/, scoped to
  docs/** and run with working-directory: docs, since GitHub only runs
  workflows from the repo-root .github/. deploy-static.yml's GitHub Pages
  publish (CNAME docs.sanaei.dev) carries over unchanged.

Follow-up (outside this commit): attach the docs.sanaei.dev custom domain to
this repository's Pages (or set the Vercel project's root directory to docs),
confirm the site is live from the monorepo, then delete MHSanaei/3x-ui-docs.
2026-07-07 23:07:14 +02:00

70 lines
2.2 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import {
buildScriptCommand,
buildDockerRun,
buildDockerCompose,
type InstallOptions,
} from './install';
const base: InstallOptions = {
method: 'script',
version: '',
enableFail2ban: true,
panelPort: '',
webBasePath: '',
};
describe('buildScriptCommand', () => {
it('uses the master install.sh for the latest version', () => {
expect(buildScriptCommand(base)).toBe(
'bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)',
);
});
it('pins a specific version by passing the tag to master install.sh', () => {
const cmd = buildScriptCommand({ ...base, version: 'v3.4.1' });
expect(cmd).toBe(
'bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v3.4.1',
);
});
it('supports the rolling dev-latest build', () => {
const cmd = buildScriptCommand({ ...base, version: 'dev-latest' });
expect(cmd).toBe(
'bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) dev-latest',
);
});
});
describe('buildDockerRun', () => {
it('reflects fail2ban, port, and base path options', () => {
const cmd = buildDockerRun({
...base,
enableFail2ban: false,
panelPort: '8443',
webBasePath: '/panel',
});
expect(cmd).toContain('XUI_ENABLE_FAIL2BAN=false');
expect(cmd).toContain('XUI_PORT=8443');
expect(cmd).toContain('XUI_INIT_WEB_BASE_PATH=/panel');
expect(cmd).toContain('ghcr.io/mhsanaei/3x-ui:latest');
expect(cmd).toContain('-v $PWD/db/:/etc/x-ui/');
});
it('omits unset port and path', () => {
const cmd = buildDockerRun(base);
expect(cmd).not.toContain('XUI_PORT');
expect(cmd).not.toContain('XUI_INIT_WEB_BASE_PATH');
});
});
describe('buildDockerCompose', () => {
it('produces valid-looking compose with the image and volumes', () => {
const yaml = buildDockerCompose({ ...base, panelPort: '2096' });
expect(yaml).toContain('image: ghcr.io/mhsanaei/3x-ui:latest');
expect(yaml).toContain('network_mode: host');
expect(yaml).toContain("XUI_PORT: '2096'");
expect(yaml).toContain('- ./db/:/etc/x-ui/');
});
});