diff --git a/frontend/e2e/fixtures/auth.ts b/frontend/e2e/fixtures/auth.ts index 01d8117c..ae74c3c9 100644 --- a/frontend/e2e/fixtures/auth.ts +++ b/frontend/e2e/fixtures/auth.ts @@ -22,9 +22,116 @@ export const SEEDED_USER = { type: 'local', } satisfies User; +// The admin role's privilege set as /api/v1/info returns it. An empty list is a state the +// backend never returns — it renders every privilege-gated control in its denied variant. +const ADMIN_PRIVILEGES = [ + 'users.create', + 'users.delete', + 'users.edit', + 'users.view', + 'roles.view', + 'providers.view', + 'usage.admin', + 'usage.view', + 'screenshots.admin', + 'screenshots.view', + 'screenshots.download', + 'screenshots.subscribe', + 'msglogs.admin', + 'msglogs.view', + 'msglogs.subscribe', + 'termlogs.admin', + 'termlogs.view', + 'termlogs.subscribe', + 'flows.admin', + 'flows.create', + 'flows.delete', + 'flows.edit', + 'flows.view', + 'flows.subscribe', + 'tasks.admin', + 'tasks.view', + 'tasks.subscribe', + 'subtasks.admin', + 'subtasks.view', + 'containers.admin', + 'containers.view', + 'agentlogs.admin', + 'agentlogs.view', + 'agentlogs.subscribe', + 'vecstorelogs.admin', + 'vecstorelogs.view', + 'vecstorelogs.subscribe', + 'searchlogs.admin', + 'searchlogs.view', + 'searchlogs.subscribe', + 'assistants.admin', + 'assistants.create', + 'assistants.delete', + 'assistants.edit', + 'assistants.view', + 'assistants.subscribe', + 'assistantlogs.admin', + 'assistantlogs.view', + 'assistantlogs.subscribe', + 'settings.admin', + 'settings.view', + 'settings.providers.admin', + 'settings.providers.view', + 'settings.providers.edit', + 'settings.providers.subscribe', + 'settings.prompts.admin', + 'settings.prompts.view', + 'settings.prompts.edit', + 'settings.tokens.admin', + 'settings.tokens.create', + 'settings.tokens.view', + 'settings.tokens.edit', + 'settings.tokens.delete', + 'settings.tokens.subscribe', + 'settings.user.admin', + 'settings.user.view', + 'settings.user.edit', + 'settings.user.subscribe', + 'templates.admin', + 'templates.create', + 'templates.view', + 'templates.edit', + 'templates.delete', + 'templates.subscribe', + 'flow_files.admin', + 'flow_files.view', + 'flow_files.upload', + 'flow_files.edit', + 'flow_files.delete', + 'flow_files.download', + 'flow_files.subscribe', + 'resources.admin', + 'resources.view', + 'resources.upload', + 'resources.edit', + 'resources.delete', + 'resources.download', + 'resources.subscribe', + 'knowledge.admin', + 'knowledge.view', + 'knowledge.create', + 'knowledge.edit', + 'knowledge.delete', + 'knowledge.search', + 'knowledge.subscribe', + 'anonymize.call', + 'toolcalls.admin', + 'toolcalls.view', +]; + +const OAUTH_PROVIDERS = ['google', 'github']; + export const seededAuthInfo = (): AuthInfo => ({ expires_at: new Date(CASSETTE_EPOCH.getTime() + 12 * 60 * 60 * 1000).toISOString(), - privileges: [], + oauth: false, + privileges: ADMIN_PRIVILEGES, + providers: OAUTH_PROVIDERS, role: { id: 1, name: 'admin' }, type: 'user', user: SEEDED_USER, @@ -35,7 +142,7 @@ export const authenticatedInfoEntry = (): RestCassetteEntry => ({ }); export const guestInfoEntry = (): RestCassetteEntry => ({ - body: { data: { type: 'guest' }, status: 'success' }, + body: { data: { providers: OAUTH_PROVIDERS, type: 'guest' }, status: 'success' }, }); export const seedAuthenticated = async (page: Page): Promise => { diff --git a/frontend/e2e/specs/smoke.spec.ts b/frontend/e2e/specs/smoke.spec.ts index e6fd4cca..9d5520d1 100644 --- a/frontend/e2e/specs/smoke.spec.ts +++ b/frontend/e2e/specs/smoke.spec.ts @@ -12,6 +12,8 @@ test.describe('smoke', { tag: '@smoke' }, () => { await expect(page).toHaveURL(/\/login\?returnUrl=%2Fflows/); await expect(page.getByRole('button', { name: 'Sign in' })).toBeVisible(); + // The guest /info carries OAuth providers, so the login page renders its OAuth buttons. + await expect(page.getByRole('button', { name: 'Continue with Google' })).toBeVisible(); }); test('logs in through the form and lands on the flows list', async ({ page, pageErrorLog }) => { diff --git a/frontend/e2e/specs/visual/routes.spec.ts-snapshots/flows-5-dark-visual-linux.png b/frontend/e2e/specs/visual/routes.spec.ts-snapshots/flows-5-dark-visual-linux.png index 756e3323..d5e1490e 100644 Binary files a/frontend/e2e/specs/visual/routes.spec.ts-snapshots/flows-5-dark-visual-linux.png and b/frontend/e2e/specs/visual/routes.spec.ts-snapshots/flows-5-dark-visual-linux.png differ diff --git a/frontend/e2e/specs/visual/routes.spec.ts-snapshots/flows-5-light-visual-linux.png b/frontend/e2e/specs/visual/routes.spec.ts-snapshots/flows-5-light-visual-linux.png index 1aff3402..2cc2f159 100644 Binary files a/frontend/e2e/specs/visual/routes.spec.ts-snapshots/flows-5-light-visual-linux.png and b/frontend/e2e/specs/visual/routes.spec.ts-snapshots/flows-5-light-visual-linux.png differ