fix(cli): improve cliproxy target parsing edge cases

- support POSIX -- terminator so dash-prefixed variant names remain positional

- export variant parser for direct unit tests

- add --target parsing coverage for API and cliproxy arg parsers
This commit is contained in:
Tam Nhu Tran committed 2026-02-25 17:01:32 +07:00
1 parent ac1c744239
commit 8d95de9fd3
3 files changed
+98 -10

No files matched your search

@@ -44,10 +44,40 @@ describe('api-command arg parser', () => {
expect(parsed.errors).toEqual([]);
});
test('parses --target=value for default profile target', () => {
const parsed = parseApiCommandArgs(['my-api', '--target=droid']);
expect(parsed.name).toBe('my-api');
expect(parsed.target).toBe('droid');
expect(parsed.errors).toEqual([]);
});
test('validates invalid --target values', () => {
const parsed = parseApiCommandArgs(['my-api', '--target', 'invalid-target']);
expect(parsed.target).toBeUndefined();
expect(parsed.errors).toEqual(['Invalid --target value "invalid-target". Use: claude or droid']);
});
test('collects missing-value error for --target with no value', () => {
const parsed = parseApiCommandArgs(['my-api', '--target']);
expect(parsed.target).toBeUndefined();
expect(parsed.errors).toEqual(['Missing value for --target']);
});
test('treats empty --target=value as missing value', () => {
const parsed = parseApiCommandArgs(['my-api', '--target=']);
expect(parsed.target).toBeUndefined();
expect(parsed.errors).toEqual(['Missing value for --target']);
});
test('uses last --target value when repeated', () => {
const parsed = parseApiCommandArgs(['my-api', '--target', 'claude', '--target=droid']);
expect(parsed.name).toBe('my-api');
expect(parsed.target).toBe('droid');
expect(parsed.errors).toEqual([]);
});
});
@@ -0,0 +1,51 @@
import { describe, expect, test } from 'bun:test';
import { parseProfileArgs } from '../../../src/commands/cliproxy/variant-subcommand';
describe('cliproxy variant arg parser', () => {
test('parses --target value form', () => {
const parsed = parseProfileArgs(['variant-a', '--target', 'droid']);
expect(parsed.name).toBe('variant-a');
expect(parsed.target).toBe('droid');
expect(parsed.errors).toEqual([]);
});
test('parses --target=value form', () => {
const parsed = parseProfileArgs(['variant-a', '--target=droid']);
expect(parsed.name).toBe('variant-a');
expect(parsed.target).toBe('droid');
expect(parsed.errors).toEqual([]);
});
test('collects missing value error for --target with no value', () => {
const parsed = parseProfileArgs(['variant-a', '--target']);
expect(parsed.target).toBeUndefined();
expect(parsed.errors).toEqual(['Missing value for --target']);
});
test('uses last --target value when repeated', () => {
const parsed = parseProfileArgs(['variant-a', '--target', 'claude', '--target=droid']);
expect(parsed.target).toBe('droid');
expect(parsed.errors).toEqual([]);
});
test('supports option terminator for variant names that start with dash', () => {
const parsed = parseProfileArgs(['--yes', '--', '-variant-a']);
expect(parsed.yes).toBe(true);
expect(parsed.name).toBe('-variant-a');
expect(parsed.errors).toEqual([]);
});
test('does not parse flags after option terminator', () => {
const parsed = parseProfileArgs(['--', '--target', 'droid']);
expect(parsed.target).toBeUndefined();
expect(parsed.name).toBe('--target');
expect(parsed.errors).toEqual([]);
});
});