From cdc07980165f0abcc14f95379379d904c8f91565 Mon Sep 17 00:00:00 2001 From: 777genius Date: Wed, 20 May 2026 17:47:52 +0300 Subject: [PATCH] test(opencode): cover empty summary catalog selection --- .../TeamModelSelectorDisabledState.test.ts | 90 +++++++++++++++++++ .../utils/teamModelAvailability.test.ts | 57 ++++++++++++ 2 files changed, 147 insertions(+) diff --git a/test/renderer/components/team/TeamModelSelectorDisabledState.test.ts b/test/renderer/components/team/TeamModelSelectorDisabledState.test.ts index e52ad71b..651a2a91 100644 --- a/test/renderer/components/team/TeamModelSelectorDisabledState.test.ts +++ b/test/renderer/components/team/TeamModelSelectorDisabledState.test.ts @@ -2236,6 +2236,96 @@ describe('TeamModelSelector disabled Codex models', () => { }); }); + it('renders OpenCode model options from a ready catalog when runtime models are empty', async () => { + vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true); + storeState.cliStatus = { + providers: [ + { + providerId: 'opencode', + supported: true, + authenticated: true, + detailMessage: null, + statusMessage: null, + capabilities: { + teamLaunch: true, + }, + models: [], + modelCatalog: { + schemaVersion: 1, + providerId: 'opencode', + source: 'app-server', + status: 'ready', + fetchedAt: '2026-05-13T00:00:00.000Z', + staleAt: '2026-05-13T00:10:00.000Z', + defaultModelId: 'opencode/big-pickle', + defaultLaunchModel: 'opencode/big-pickle', + models: [ + { + id: 'opencode/big-pickle', + launchModel: 'opencode/big-pickle', + displayName: 'big-pickle', + hidden: false, + supportedReasoningEfforts: [], + defaultReasoningEffort: null, + inputModalities: ['text'], + supportsPersonality: false, + isDefault: true, + upgrade: false, + source: 'app-server', + badgeLabel: 'Free', + }, + { + id: 'openai/gpt-5.4', + launchModel: 'openai/gpt-5.4', + displayName: 'openai/gpt-5.4', + hidden: false, + supportedReasoningEfforts: [], + defaultReasoningEffort: null, + inputModalities: ['text'], + supportsPersonality: false, + isDefault: false, + upgrade: false, + source: 'app-server', + badgeLabel: null, + }, + ], + diagnostics: { + configReadState: 'ready', + appServerState: 'healthy', + message: null, + code: null, + }, + }, + }, + ], + }; + + const host = document.createElement('div'); + document.body.appendChild(host); + const root = createRoot(host); + + await act(async () => { + root.render( + React.createElement(TeamModelSelector, { + providerId: 'opencode', + onProviderChange: () => undefined, + value: '', + onValueChange: () => undefined, + }) + ); + await Promise.resolve(); + }); + + expect(host.textContent).toContain('big-pickle'); + expect(host.textContent).toContain('GPT-5.4'); + expect(host.textContent).not.toContain('Loading models'); + + await act(async () => { + root.unmount(); + await Promise.resolve(); + }); + }); + it('filters OpenCode model groups by selected source providers', async () => { vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true); storeState.cliStatus = { diff --git a/test/renderer/utils/teamModelAvailability.test.ts b/test/renderer/utils/teamModelAvailability.test.ts index fdbee879..f3f6c418 100644 --- a/test/renderer/utils/teamModelAvailability.test.ts +++ b/test/renderer/utils/teamModelAvailability.test.ts @@ -334,6 +334,63 @@ describe('teamModelAvailability', () => { expect(getTeamModelSelectionError('opencode', 'openai/gpt-5.4', providerStatus)).toBeNull(); }); + it('uses the OpenCode model catalog when runtime models are empty', () => { + const providerStatus = createOpenCodeProviderStatus([], { + modelCatalog: { + schemaVersion: 1, + providerId: 'opencode', + source: 'app-server', + status: 'ready', + fetchedAt: '2026-05-12T00:00:00.000Z', + staleAt: '2026-05-12T00:10:00.000Z', + defaultModelId: 'opencode/big-pickle', + defaultLaunchModel: 'opencode/big-pickle', + models: [ + { + id: 'opencode/big-pickle', + launchModel: 'opencode/big-pickle', + displayName: 'opencode/big-pickle', + hidden: false, + supportedReasoningEfforts: [], + defaultReasoningEffort: null, + inputModalities: ['text'], + supportsPersonality: true, + isDefault: true, + upgrade: false, + source: 'app-server', + badgeLabel: 'Free', + }, + { + id: 'openai/gpt-5.4', + launchModel: 'openai/gpt-5.4', + displayName: 'openai/gpt-5.4', + hidden: false, + supportedReasoningEfforts: [], + defaultReasoningEffort: null, + inputModalities: ['text'], + supportsPersonality: true, + isDefault: false, + upgrade: false, + source: 'app-server', + badgeLabel: null, + }, + ], + diagnostics: { + configReadState: 'ready', + appServerState: 'healthy', + }, + }, + }); + + expect(getAvailableTeamProviderModels('opencode', providerStatus)).toEqual([ + 'opencode/big-pickle', + 'openai/gpt-5.4', + ]); + expect( + getAvailableTeamProviderModelOptions('opencode', providerStatus).map((option) => option.value) + ).toEqual(['', 'opencode/big-pickle', 'openai/gpt-5.4']); + }); + it('reports OpenCode openai routes unavailable when OpenAI auth is invalid', () => { const providerStatus = createOpenCodeProviderStatus(['openai/gpt-5.4', 'opencode/big-pickle'], { statusMessage: 'OpenAI token invalid',