Loading...
Loading...
Run e2e tests in the Studio app. Use when asked to run e2e tests, run studio tests, playwright tests, or test the feature.
npx skill4agent add supabase/supabase e2e-studio-testse2e/studiocd e2e/studio && pnpm run e2ecd e2e/studio && pnpm run e2e -- features/cron-jobs.spec.tscd e2e/studio && pnpm run e2e -- --grep "test name pattern"cd e2e/studio && pnpm run e2e -- --uiIS_PLATFORM=falsee2e/studio/features/*.spec.tsimport { test } from '../utils/test.js'pagerefawait expect(locator).toBeVisible({ timeout: 30000 })await expect(locator).toBeVisible({ timeout: 30000 }, 'Element should be visible after page load')test.describe.configure({ mode: 'serial' })getByRolepage.getByRole('button', { name: 'Save' })
page.getByRole('button', { name: 'Configure API privileges' })getByTestIdpage.getByTestId('table-editor-side-panel')getByTextpage.getByText('Data API Access', { exact: true })locatorpage.locator('[data-state="open"]')// BAD
locator('xpath=ancestor::div[contains(@class, "space-y")]')locator('..')// BAD
element.locator('..').getByRole('button')filter({ hasText })// BAD - popover may have more than one combobox
// Could consider scoping down the container or filtering the combobox more specifically
popover.getByRole('combobox')// In the React component
<Button aria-label="Configure API privileges">
<Settings />
</Button>page.getByRole('button', { name: 'Configure API privileges' })// Good - scoped to side panel
const sidePanel = page.getByTestId('table-editor-side-panel')
const toggle = sidePanel.getByRole('switch')
// Good - find unique element, then scope from there
const popover = page.locator('[data-radix-popper-content-wrapper]')
const roleSection = popover.getByText('Anonymous (anon)', { exact: true })waitForTimeoutwaitForTimeout// BAD
await page.waitForTimeout(1000)
// GOOD - wait for UI element
await expect(page.getByText('Success')).toBeVisible()
// GOOD - wait for API response
const apiPromise = waitForApiResponse(page, 'pg-meta', ref, 'query?key=table-create')
await saveButton.click()
await apiPromise
// GOOD - wait for toast indicating operation complete
await expect(page.getByText('Table created successfully')).toBeVisible({ timeout: 15000 })force: true// BAD
await menuButton.click({ force: true })
// GOOD - hover to reveal, then click
await tableRow.hover()
await expect(menuButton).toBeVisible()
await menuButton.click()cd e2e/studio && pnpm exec playwright show-trace <path-to-trace.zip>cd e2e/studio && pnpm exec playwright show-reporttest-results/pnpm dev:studio-localtest.describe.configure({ mode: 'serial' })pnpm run e2epnpm dev:studio-localpnpm run e2e -- features/<file>.spec.tstest-results/pnpm dev:studio-local