From b7a63af1b90bf194ac999860e42da4784925cd71 Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Sat, 5 Sep 2026 14:44:18 +0300 Subject: [PATCH] test(providers): cover legacy alias migration with several entries The legacy `providers` block is deleted whole when its last entry migrates to `provider`. Nothing covered the case where other legacy entries remain, so a regression there would silently drop unrelated providers. Adds the case to both the web server and VS Code parity suites. --- .../src/opencodeConfig.providers.test.ts | 22 +++++++++++++++++++ .../web/server/lib/opencode/providers.test.js | 22 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/packages/vscode/src/opencodeConfig.providers.test.ts b/packages/vscode/src/opencodeConfig.providers.test.ts index 8a4ac246..4e616a19 100644 --- a/packages/vscode/src/opencodeConfig.providers.test.ts +++ b/packages/vscode/src/opencodeConfig.providers.test.ts @@ -284,6 +284,28 @@ describe('custom provider config persistence (VS Code parity)', () => { }); }); + test('migrating one legacy providers entry keeps the other legacy entries', () => { + const configPath = path.join(projectDir, 'opencode.json'); + writeJson(configPath, { + providers: { + legacy: { name: 'Legacy provider', options: { baseURL: 'https://old.example.com/v1' }, models: { model: { name: 'Old model' } } }, + untouched: { name: 'Untouched', options: { baseURL: 'https://other.example.com/v1' }, models: { model: { name: 'Other model' } } }, + }, + }); + + upsertProviderConfig('legacy', { + name: 'Updated provider', + options: { baseURL: 'https://new.example.com/v1' }, + models: { model: { name: 'Updated model' } }, + }, projectDir, 'project', { hasStoredAuth: true }); + + const written = readJson(configPath); + assert.deepEqual(written.providers, { + untouched: { name: 'Untouched', options: { baseURL: 'https://other.example.com/v1' }, models: { model: { name: 'Other model' } } }, + }); + assert.equal(written.provider.legacy.name, 'Updated provider'); + }); + test('upsert then remove restores absence', () => { upsertProviderConfig('temp-provider', { name: 'Temp', diff --git a/packages/web/server/lib/opencode/providers.test.js b/packages/web/server/lib/opencode/providers.test.js index ea53f501..8d56327a 100644 --- a/packages/web/server/lib/opencode/providers.test.js +++ b/packages/web/server/lib/opencode/providers.test.js @@ -267,6 +267,28 @@ describe('custom provider config persistence', () => { }); }); + test('migrating one legacy providers entry keeps the other legacy entries', () => { + const configPath = path.join(projectDir, 'opencode.json'); + writeJson(configPath, { + providers: { + legacy: { name: 'Legacy provider', options: { baseURL: 'https://old.example.com/v1' }, models: { model: { name: 'Old model' } } }, + untouched: { name: 'Untouched', options: { baseURL: 'https://other.example.com/v1' }, models: { model: { name: 'Other model' } } }, + }, + }); + + upsertProviderConfig('legacy', { + name: 'Updated provider', + options: { baseURL: 'https://new.example.com/v1' }, + models: { model: { name: 'Updated model' } }, + }, projectDir, 'project', { hasStoredAuth: true }); + + const written = readJson(configPath); + expect(written.providers).toEqual({ + untouched: { name: 'Untouched', options: { baseURL: 'https://other.example.com/v1' }, models: { model: { name: 'Other model' } } }, + }); + expect(written.provider.legacy.name).toBe('Updated provider'); + }); + test('upsert then remove restores absence', () => { upsertProviderConfig('temp-provider', { name: 'Temp',