From 10f17d38ea862e75555afdc17f0bf2d2b085164e Mon Sep 17 00:00:00 2001 From: gnanam1990 Date: Mon, 6 Apr 2026 17:18:50 +0530 Subject: [PATCH] test: stabilize rebased PR 385 checks --- src/ink/termio/osc.test.ts | 19 ++++++++-- src/utils/model/modelOptions.github.test.ts | 40 +++++++++++++++------ src/utils/providerFlag.test.ts | 32 ++++++++++------- src/utils/providerProfiles.test.ts | 20 +++++------ 4 files changed, 75 insertions(+), 36 deletions(-) diff --git a/src/ink/termio/osc.test.ts b/src/ink/termio/osc.test.ts index 46e0375f..7f4f4917 100644 --- a/src/ink/termio/osc.test.ts +++ b/src/ink/termio/osc.test.ts @@ -27,6 +27,21 @@ async function flushClipboardCopy(): Promise { await new Promise(resolve => setTimeout(resolve, 0)) } +async function waitForExecCall( + command: string, + attempts = 20, +): Promise<(typeof execFileNoThrowMock.mock.calls)[number] | undefined> { + for (let attempt = 0; attempt < attempts; attempt++) { + const call = execFileNoThrowMock.mock.calls.find(([cmd]) => cmd === command) + if (call) { + return call + } + await flushClipboardCopy() + } + + return undefined +} + describe('Windows clipboard fallback', () => { beforeEach(() => { execFileNoThrowMock.mockClear() @@ -62,9 +77,7 @@ describe('Windows clipboard fallback', () => { await setClipboard('Привет мир') await flushClipboardCopy() - const windowsCall = execFileNoThrowMock.mock.calls.find( - ([cmd]) => cmd === 'powershell', - ) + const windowsCall = await waitForExecCall('powershell') expect(windowsCall?.[2]).toMatchObject({ stdin: 'ignore', diff --git a/src/utils/model/modelOptions.github.test.ts b/src/utils/model/modelOptions.github.test.ts index 340e99c5..ef9ee48f 100644 --- a/src/utils/model/modelOptions.github.test.ts +++ b/src/utils/model/modelOptions.github.test.ts @@ -1,7 +1,17 @@ -import { afterEach, expect, mock, test } from 'bun:test' +import { afterEach, beforeEach, expect, mock, test } from 'bun:test' +import { resetModelStringsForTestingOnly } from '../../bootstrap/state.js' import { saveGlobalConfig } from '../config.js' +async function importFreshModelOptionsModule() { + mock.restore() + mock.module('./providers.js', () => ({ + getAPIProvider: () => 'github', + })) + const nonce = `${Date.now()}-${Math.random()}` + return import(`./modelOptions.js?ts=${nonce}`) +} + const originalEnv = { CLAUDE_CODE_USE_GITHUB: process.env.CLAUDE_CODE_USE_GITHUB, CLAUDE_CODE_USE_OPENAI: process.env.CLAUDE_CODE_USE_OPENAI, @@ -14,6 +24,20 @@ const originalEnv = { ANTHROPIC_CUSTOM_MODEL_OPTION: process.env.ANTHROPIC_CUSTOM_MODEL_OPTION, } +beforeEach(() => { + mock.restore() + delete process.env.CLAUDE_CODE_USE_GITHUB + delete process.env.CLAUDE_CODE_USE_OPENAI + delete process.env.CLAUDE_CODE_USE_GEMINI + delete process.env.CLAUDE_CODE_USE_BEDROCK + delete process.env.CLAUDE_CODE_USE_VERTEX + delete process.env.CLAUDE_CODE_USE_FOUNDRY + delete process.env.OPENAI_MODEL + delete process.env.OPENAI_BASE_URL + delete process.env.ANTHROPIC_CUSTOM_MODEL_OPTION + resetModelStringsForTestingOnly() +}) + afterEach(() => { process.env.CLAUDE_CODE_USE_GITHUB = originalEnv.CLAUDE_CODE_USE_GITHUB process.env.CLAUDE_CODE_USE_OPENAI = originalEnv.CLAUDE_CODE_USE_OPENAI @@ -34,17 +58,9 @@ afterEach(() => { providerProfiles: [], activeProviderProfileId: undefined, })) + resetModelStringsForTestingOnly() }) -async function importFreshModelOptionsModule() { - mock.restore() - mock.module('./providers.js', () => ({ - getAPIProvider: () => 'github', - })) - const nonce = `${Date.now()}-${Math.random()}` - return import(`./modelOptions.js?ts=${nonce}`) -} - test('GitHub provider exposes only default + GitHub model in /model options', async () => { process.env.CLAUDE_CODE_USE_GITHUB = '1' delete process.env.CLAUDE_CODE_USE_OPENAI @@ -58,7 +74,9 @@ test('GitHub provider exposes only default + GitHub model in /model options', as const { getModelOptions } = await importFreshModelOptionsModule() const options = getModelOptions(false) - const nonDefault = options.filter(option => option.value !== null) + const nonDefault = options.filter( + (option: { value: unknown }) => option.value !== null, + ) expect(nonDefault.length).toBe(1) expect(nonDefault[0]?.value).toBe('github:copilot') diff --git a/src/utils/providerFlag.test.ts b/src/utils/providerFlag.test.ts index ce58fff6..db38fbc2 100644 --- a/src/utils/providerFlag.test.ts +++ b/src/utils/providerFlag.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test, afterEach } from 'bun:test' +import { afterEach, beforeEach, describe, expect, test } from 'bun:test' import { parseProviderFlag, applyProviderFlag, @@ -8,18 +8,26 @@ import { const originalEnv = { ...process.env } +const RESET_KEYS = [ + 'CLAUDE_CODE_USE_OPENAI', + 'CLAUDE_CODE_USE_GEMINI', + 'CLAUDE_CODE_USE_GITHUB', + 'CLAUDE_CODE_USE_BEDROCK', + 'CLAUDE_CODE_USE_VERTEX', + 'OPENAI_BASE_URL', + 'OPENAI_API_KEY', + 'OPENAI_MODEL', + 'GEMINI_MODEL', +] as const + +beforeEach(() => { + for (const key of RESET_KEYS) { + delete process.env[key] + } +}) + afterEach(() => { - for (const key of [ - 'CLAUDE_CODE_USE_OPENAI', - 'CLAUDE_CODE_USE_GEMINI', - 'CLAUDE_CODE_USE_GITHUB', - 'CLAUDE_CODE_USE_BEDROCK', - 'CLAUDE_CODE_USE_VERTEX', - 'OPENAI_BASE_URL', - 'OPENAI_API_KEY', - 'OPENAI_MODEL', - 'GEMINI_MODEL', - ]) { + for (const key of RESET_KEYS) { if (originalEnv[key] === undefined) delete process.env[key] else process.env[key] = originalEnv[key] } diff --git a/src/utils/providerProfiles.test.ts b/src/utils/providerProfiles.test.ts index 40521960..0e02e805 100644 --- a/src/utils/providerProfiles.test.ts +++ b/src/utils/providerProfiles.test.ts @@ -105,7 +105,7 @@ describe('applyProviderProfileToProcessEnv', () => { expect(process.env.CLAUDE_CODE_USE_GEMINI).toBeUndefined() expect(process.env.CLAUDE_CODE_USE_GITHUB).toBeUndefined() - expect(process.env.CLAUDE_CODE_USE_OPENAI).toBe('1') + expect(String(process.env.CLAUDE_CODE_USE_OPENAI)).toBe('1') expect(process.env.CLAUDE_CODE_PROVIDER_PROFILE_ENV_APPLIED_ID).toBe( 'provider_test', ) @@ -177,7 +177,7 @@ describe('applyActiveProviderProfileFromConfig', () => { } as any) expect(applied).toBeUndefined() - expect(process.env.CLAUDE_CODE_USE_OPENAI).toBe('1') + expect(String(process.env.CLAUDE_CODE_USE_OPENAI)).toBe('1') expect(process.env.OPENAI_BASE_URL).toBe('http://localhost:11434/v1') expect(process.env.OPENAI_MODEL).toBe('qwen2.5:3b') }) @@ -267,7 +267,7 @@ describe('applyActiveProviderProfileFromConfig', () => { } as any) expect(applied?.id).toBe('saved_openai') - expect(process.env.CLAUDE_CODE_USE_OPENAI).toBe('1') + expect(String(process.env.CLAUDE_CODE_USE_OPENAI)).toBe('1') expect(process.env.OPENAI_BASE_URL).toBe('https://api.openai.com/v1') expect(process.env.OPENAI_MODEL).toBe('gpt-4o') }) @@ -286,10 +286,10 @@ describe('persistActiveProviderProfileModel', () => { model: 'kimi-k2.5:cloud', }) - saveMockGlobalConfig(current => ({ - ...current, - providerProfiles: [activeProfile], - activeProviderProfileId: activeProfile.id, + saveMockGlobalConfig(current => ({ + ...current, + providerProfiles: [activeProfile], + activeProviderProfileId: activeProfile.id, })) applyProviderProfileToProcessEnv(activeProfile) @@ -303,7 +303,7 @@ describe('persistActiveProviderProfileModel', () => { ) const saved = getProviderProfiles().find( - profile => profile.id === activeProfile.id, + (profile: ProviderProfile) => profile.id === activeProfile.id, ) expect(saved?.model).toBe('minimax-m2.5:cloud') }) @@ -333,7 +333,7 @@ describe('persistActiveProviderProfileModel', () => { expect(process.env.OPENAI_MODEL).toBe('cli-model') const saved = getProviderProfiles().find( - profile => profile.id === activeProfile.id, + (profile: ProviderProfile) => profile.id === activeProfile.id, ) expect(saved?.model).toBe('minimax-m2.5:cloud') }) @@ -414,7 +414,7 @@ describe('deleteProviderProfile', () => { expect(result.activeProfileId).toBeUndefined() expect(process.env.CLAUDE_CODE_PROVIDER_PROFILE_ENV_APPLIED).toBeUndefined() - expect(process.env.CLAUDE_CODE_USE_OPENAI).toBe('1') + expect(String(process.env.CLAUDE_CODE_USE_OPENAI)).toBe('1') expect(process.env.OPENAI_BASE_URL).toBe('http://localhost:11434/v1') expect(process.env.OPENAI_MODEL).toBe('qwen2.5:3b') })