diff --git a/frontend/e2e/mocks/cassettes/settings-providers.ts b/frontend/e2e/mocks/cassettes/settings-providers.ts index ed0f4b5b..6ad39910 100644 --- a/frontend/e2e/mocks/cassettes/settings-providers.ts +++ b/frontend/e2e/mocks/cassettes/settings-providers.ts @@ -115,3 +115,69 @@ export const settingsProvidersCassette = (override: Cassette = {}): Cassette => }, override, ); + +const populatedProviders: ResultOf = { + settingsProviders: entity('ProvidersConfig', { + default: entity('DefaultProvidersConfig', { + anthropic: defaultConfig('default-anthropic', ProviderType.Anthropic), + bedrock: null, + custom: null, + deepseek: null, + gemini: null, + glm: null, + kimi: null, + minimax: null, + ollama: null, + openai: defaultConfig('default-openai', ProviderType.Openai), + qwen: null, + }), + enabled: entity('ProvidersReadinessStatus', { + anthropic: true, + bedrock: false, + custom: false, + deepseek: false, + gemini: false, + glm: false, + kimi: false, + minimax: false, + ollama: false, + openai: true, + qwen: false, + }), + models: entity('ProvidersModelsList', { + anthropic: [], + bedrock: [], + custom: [], + deepseek: [], + gemini: [], + glm: [], + kimi: [], + minimax: [], + ollama: [], + openai: [], + qwen: [], + }), + userDefined: [ + entity('ProviderConfig', { + agents: agentsConfig(), + createdAt: T, + id: 'custom-1', + name: 'My Custom Endpoint', + type: ProviderType.Custom, + updatedAt: T, + }), + ], + }), +}; + +export const populatedSettingsProvidersCassette = (override: Cassette = {}): Cassette => + mergeCassettes( + { + queries: { + ...baseQueries(), + settingsProviders: [{ data: populatedProviders }], + }, + rest: baseRest(), + }, + override, + ); diff --git a/frontend/e2e/specs/visual/settings-providers-populated.spec.ts b/frontend/e2e/specs/visual/settings-providers-populated.spec.ts new file mode 100644 index 00000000..f067e260 --- /dev/null +++ b/frontend/e2e/specs/visual/settings-providers-populated.spec.ts @@ -0,0 +1,26 @@ +import { expect, test } from '../../fixtures/test.ts'; +import { populatedSettingsProvidersCassette } from '../../mocks/cassettes/settings-providers.ts'; + +// The route-manifest visual sweep only captures the empty providers state. This +// pins the populated layout (enabled defaults + a user-defined provider row). +const THEMES = ['light', 'dark'] as const; + +test.describe('visual: settings providers (populated)', { tag: '@visual' }, () => { + for (const theme of THEMES) { + test.describe(theme, () => { + test.use({ cassette: populatedSettingsProvidersCassette() }); + + test('matches the baseline', async ({ page }) => { + await page.addInitScript((value) => window.localStorage.setItem('theme', String(value)), theme); + await page.goto('/settings/providers'); + await expect(page.getByText('My Custom Endpoint')).toBeVisible(); + await page.evaluate(() => document.fonts.ready); + + await expect(page).toHaveScreenshot(`settings-providers-populated-${theme}.png`, { + fullPage: true, + mask: [page.locator('.xterm')], + }); + }); + }); + } +}); diff --git a/frontend/e2e/specs/visual/settings-providers-populated.spec.ts-snapshots/settings-providers-populated-dark-visual-linux.png b/frontend/e2e/specs/visual/settings-providers-populated.spec.ts-snapshots/settings-providers-populated-dark-visual-linux.png new file mode 100644 index 00000000..d858fd02 Binary files /dev/null and b/frontend/e2e/specs/visual/settings-providers-populated.spec.ts-snapshots/settings-providers-populated-dark-visual-linux.png differ diff --git a/frontend/e2e/specs/visual/settings-providers-populated.spec.ts-snapshots/settings-providers-populated-light-visual-linux.png b/frontend/e2e/specs/visual/settings-providers-populated.spec.ts-snapshots/settings-providers-populated-light-visual-linux.png new file mode 100644 index 00000000..12de0b90 Binary files /dev/null and b/frontend/e2e/specs/visual/settings-providers-populated.spec.ts-snapshots/settings-providers-populated-light-visual-linux.png differ diff --git a/frontend/e2e/tools/run-visual.sh b/frontend/e2e/tools/run-visual.sh index a1006e75..ed1aabca 100755 --- a/frontend/e2e/tools/run-visual.sh +++ b/frontend/e2e/tools/run-visual.sh @@ -17,7 +17,9 @@ fi UPDATE_ARGS=() if [[ "${1:-}" == "--update" ]]; then - UPDATE_ARGS=(--update-snapshots) + # `=all` binds the mode so a trailing spec-file filter isn't swallowed as the + # option's optional [mode] argument (`--update-snapshots ` fails to parse). + UPDATE_ARGS=(--update-snapshots=all) shift fi