Files
gstack/test/gstack-artifacts-url.test.ts
Garry Tan a4cadb42d8 feat: gstack-artifacts-init + gstack-artifacts-url helpers
artifacts-init replaces brain-init with provider choice (gh / glab /
manual), per-user gstack-artifacts-$USER repo, HTTPS-canonical storage in
~/.gstack-artifacts-remote.txt, and a "send this to your brain admin"
hookup printout. Always prints the command, never auto-executes — gbrain
v0.26.x has no admin-scope MCP probe (codex Finding #3).

artifacts-url centralizes HTTPS↔SSH/host/owner-repo conversion so callers
don't each string-mangle (codex Finding #10). The remote-conflict check in
artifacts-init compares at the canonical level so re-running with HTTPS
input doesn't trip on a stored SSH URL for the same logical repo.

The "URL form not supported" branch prints a two-line clone-then-path
form for gbrain v0.26.x; the supported branch is a one-liner with --url
ready for when gbrain ships URL ingest.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:17:49 -07:00

88 lines
3.4 KiB
TypeScript

/**
* gstack-artifacts-url — URL canonicalization helper.
*
* Centralizes HTTPS↔SSH conversion so callers don't each string-mangle. Per
* codex Finding #10: store one canonical form (HTTPS) and derive all others.
*/
import { describe, test, expect } from 'bun:test';
import * as path from 'path';
import { spawnSync } from 'child_process';
const ROOT = path.resolve(import.meta.dir, '..');
const URL_BIN = path.join(ROOT, 'bin', 'gstack-artifacts-url');
function run(args: string[]): { code: number; stdout: string; stderr: string } {
const r = spawnSync(URL_BIN, args, { encoding: 'utf-8' });
return {
code: r.status ?? -1,
stdout: (r.stdout || '').trim(),
stderr: (r.stderr || '').trim(),
};
}
describe('gstack-artifacts-url', () => {
test('--to ssh from canonical https', () => {
const r = run(['--to', 'ssh', 'https://github.com/garrytan/gstack-artifacts-garrytan']);
expect(r.code).toBe(0);
expect(r.stdout).toBe('git@github.com:garrytan/gstack-artifacts-garrytan.git');
});
test('--to ssh from https-with-.git', () => {
const r = run(['--to', 'ssh', 'https://github.com/garrytan/gstack-artifacts-garrytan.git']);
expect(r.stdout).toBe('git@github.com:garrytan/gstack-artifacts-garrytan.git');
});
test('--to https is idempotent on https input', () => {
const r = run(['--to', 'https', 'https://github.com/garrytan/gstack-artifacts-garrytan']);
expect(r.stdout).toBe('https://github.com/garrytan/gstack-artifacts-garrytan');
});
test('--to https from git@host:owner/repo.git', () => {
const r = run(['--to', 'https', 'git@github.com:garrytan/gstack-artifacts-garrytan.git']);
expect(r.stdout).toBe('https://github.com/garrytan/gstack-artifacts-garrytan');
});
test('--to https from ssh:// scheme (gitlab self-hosted style)', () => {
const r = run(['--to', 'https', 'ssh://git@gitlab.example.org/team/gstack-artifacts-team.git']);
expect(r.stdout).toBe('https://gitlab.example.org/team/gstack-artifacts-team');
});
test('--host extracts hostname from any form', () => {
expect(run(['--host', 'https://github.com/x/y']).stdout).toBe('github.com');
expect(run(['--host', 'git@gitlab.com:x/y.git']).stdout).toBe('gitlab.com');
expect(run(['--host', 'ssh://git@gitlab.example.org/x/y.git']).stdout).toBe('gitlab.example.org');
});
test('--owner-repo extracts the path segment', () => {
expect(run(['--owner-repo', 'https://github.com/garrytan/gstack-artifacts-garrytan']).stdout)
.toBe('garrytan/gstack-artifacts-garrytan');
expect(run(['--owner-repo', 'git@github.com:team/gstack-artifacts-team.git']).stdout)
.toBe('team/gstack-artifacts-team');
});
test('rejects unrecognized URL form with exit 3', () => {
const r = run(['--to', 'ssh', 'not a url']);
expect(r.code).toBe(3);
expect(r.stderr).toContain('unrecognized URL form');
});
test('rejects missing args with exit 2', () => {
expect(run([]).code).toBe(2);
expect(run(['--to']).code).toBe(2);
expect(run(['--to', 'ssh']).code).toBe(2);
});
test('rejects unknown --to target', () => {
const r = run(['--to', 'svn', 'https://github.com/x/y']);
expect(r.code).toBe(2);
});
test('round-trip: https → ssh → https is identity', () => {
const original = 'https://github.com/garrytan/gstack-artifacts-garrytan';
const ssh = run(['--to', 'ssh', original]).stdout;
const back = run(['--to', 'https', ssh]).stdout;
expect(back).toBe(original);
});
});