diff --git a/src/cliproxy/config/__tests__/backend-selection.test.js b/src/cliproxy/config/__tests__/backend-selection.test.js index 40eb3de0..116b3ddb 100644 --- a/src/cliproxy/config/__tests__/backend-selection.test.js +++ b/src/cliproxy/config/__tests__/backend-selection.test.js @@ -142,18 +142,32 @@ describe('Backend Selection', () => { ); }); - // Plus fallback / pre-rename (< 6.10.0-0) uses arm64 - withMockedProcessPlatform('darwin', 'arm64', () => { - const info = platformDetector.detectPlatform('6.9.45-0', 'plus'); - assert.strictEqual(info.arch, 'arm64'); - assert.strictEqual(info.binaryName, 'CLIProxyAPIPlus_6.9.45-0_darwin_arm64.tar.gz'); - }); + // Plus fallback (undefined) and explicit pre-rename (< 6.10.0-0) use arm64 + for (const version of [undefined, '6.9.45-0']) { + const effectiveVersion = version || platformDetector.BACKEND_CONFIG.plus.fallbackVersion; + withMockedProcessPlatform('darwin', 'arm64', () => { + const info = platformDetector.detectPlatform(version, 'plus'); + assert.strictEqual(info.arch, 'arm64'); + assert.strictEqual( + info.binaryName, + `CLIProxyAPIPlus_${effectiveVersion}_darwin_arm64.tar.gz` + ); + assert.strictEqual( + platformDetector.getDownloadUrl(version, 'plus'), + `https://github.com/kaitranntt/CLIProxyAPIPlus/releases/download/v${effectiveVersion}/CLIProxyAPIPlus_${effectiveVersion}_darwin_arm64.tar.gz` + ); + }); + } // Plus post-rename (>= 6.10.0-0) uses aarch64 withMockedProcessPlatform('darwin', 'arm64', () => { const info = platformDetector.detectPlatform('6.10.0-0', 'plus'); assert.strictEqual(info.arch, 'arm64'); assert.strictEqual(info.binaryName, 'CLIProxyAPIPlus_6.10.0-0_darwin_aarch64.tar.gz'); + assert.strictEqual( + platformDetector.getDownloadUrl('6.10.0-0', 'plus'), + 'https://github.com/kaitranntt/CLIProxyAPIPlus/releases/download/v6.10.0-0/CLIProxyAPIPlus_6.10.0-0_darwin_aarch64.tar.gz' + ); }); // x64 remains amd64 for both backends diff --git a/src/commands/cliproxy/__tests__/order-subcommand.test.ts b/src/commands/cliproxy/__tests__/order-subcommand.test.ts index 90727b07..4ce07eb0 100644 --- a/src/commands/cliproxy/__tests__/order-subcommand.test.ts +++ b/src/commands/cliproxy/__tests__/order-subcommand.test.ts @@ -122,9 +122,8 @@ describe('handleOrderSubcommand', () => { describe('file-mode show with residual priorities', () => { it('renders selector pick order (priority desc) and flags drift instead of alphabetical order', async () => { - // Residual on-disk priorities, no stored config -> file mode + drift. - // claude-a sorts first alphabetically, but b has the higher priority, so - // the selector drains b first. The display must follow the selector. + // Explicit below-minimum version to prove show is ungated on old binaries. + await configureBackend('original', '6.6.105'); writeAuthFile('claude-a.json', { email: 'a@x.com', priority: 1 }); writeAuthFile('claude-b.json', { email: 'b@x.com', priority: 5 }); @@ -133,6 +132,7 @@ describe('handleOrderSubcommand', () => { registerAccount('claude', 'claude-b.json', 'b@x.com'); await runOrderSubcommand(['claude']); + expect(process.exitCode).toBe(0); const output = lines.join('\n'); // b@x.com (priority 5) must appear before a@x.com (priority 1). @@ -142,7 +142,6 @@ describe('handleOrderSubcommand', () => { expect(idxA).toBeGreaterThan(idxB); // Drift surfaced (same as the manual/tier branch), and the mode label no - // longer falsely claims "no priority set" under residual priorities. expect(output).toContain('Drift detected'); expect(output).toContain('residual priorities present'); expect(output).not.toContain('no priority set'); @@ -152,6 +151,8 @@ describe('handleOrderSubcommand', () => { }); it('keeps the plain "no priority set" label and no drift when there are no residuals', async () => { + // Explicit below-minimum version on Plus to prove show is ungated on old binaries. + await configureBackend('plus', '6.6.105-0'); writeAuthFile('claude-a.json', { email: 'a@x.com' }); writeAuthFile('claude-b.json', { email: 'b@x.com' }); @@ -160,6 +161,7 @@ describe('handleOrderSubcommand', () => { registerAccount('claude', 'claude-b.json', 'b@x.com'); await runOrderSubcommand(['claude']); + expect(process.exitCode).toBe(0); const output = lines.join('\n'); expect(output).toContain('no priority set'); @@ -169,6 +171,8 @@ describe('handleOrderSubcommand', () => { describe('--reset clears residual priorities (proxy stopped -> direct write)', () => { it('removes the priority field from auth files and reports per-file results', async () => { + // Explicit below-minimum version to prove reset is ungated on old binaries. + await configureBackend('original', '6.6.105'); writeAuthFile('claude-a.json', { email: 'a@x.com', priority: 4 }); writeAuthFile('claude-b.json', { email: 'b@x.com' }); // already clear @@ -178,6 +182,7 @@ describe('handleOrderSubcommand', () => { saveDrainOrderConfig('claude', { mode: 'manual', orderedIds: ['a@x.com', 'b@x.com'] }); await runOrderSubcommand(['claude', '--reset']); + expect(process.exitCode).toBe(0); // Residual priority is actually gone from disk (not just config deleted). expect('priority' in readAuthFile('claude-a.json')).toBe(false); @@ -190,12 +195,15 @@ describe('handleOrderSubcommand', () => { }); it('reports already-clear files and still resets when no priorities exist', async () => { + // Explicit below-minimum version on Plus to prove reset is ungated on old binaries. + await configureBackend('plus', '6.6.105-0'); writeAuthFile('claude-a.json', { email: 'a@x.com' }); const { registerAccount } = await registerClaude(); registerAccount('claude', 'claude-a.json', 'a@x.com'); await runOrderSubcommand(['claude', '--reset']); + expect(process.exitCode).toBe(0); const output = lines.join('\n'); expect(output).toContain('reset to file order');