mirror of
https://github.com/supabase/supabase.git
synced 2026-10-08 10:55:06 +03:00
* add new e2e folder * add local supabase and confitional storage * fix e2e selfhosted * update actions * add correct e2e folder * fix e2e actions * fix action project ids * fix permissions * fix script * fix playwright install * playwright root * pnpm i * fix api rul * add env docs * update run script * only install deps for e2e * use same dep * only install deps for tests * upd lockfile * use official vercel integration * use vercel cli * remove old folder * fix script * rm filter * rename e2e studio package * fix install browsers * add polling for vercel build * use vercel-preview-url package * undo actions * rename ci env to ci * chore:add rls check and make playwright test less flakey (#35348) * update ci action * fix paths * fix browser install * run ci against staging * try caching builds * fix envs * fix env check * fix sign in * fix sign in url * fix envs and url * fix caching * fix race condition in sign in page * fix race condition in sign in page * add check to see if being redirected * fix caching, check IS_PLATFORM var * log is_platform * try vercel build * fix vercel project id * fix path * add temp vercel.json file * fix paths * undo project id stuff * rm cwd * fix path * fix paths again * fix path * fix base url * try different fix * fix config base url * fix base studio url issues * retain video on fails * Update e2e/studio/README.md Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com> * Update e2e/studio/README.md Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com> * fix env file naming * undo caching * rm old tests folder * fix readme scripts * rm vercel deploy for now, just run build locally * fix url * fix build script * fix is_platform * fix stuck studio start * fix env vars * retain network and logs on fail for better debugging * add apiurl env * back to vercel * disable catpcha * fix test * update environment configuration to remove default URLs for CI and streamline API base URL handling * fix typeerr * fix urls in home.spec * fix urls in logs.spec * fix urls in sqleditor spec * fix table editor spec * add tourl util * use staging api in ci * re add base url env var * fix url in projects page * fix url in sql editor spec * fix sign in not waiting for cookies omfg * fix env var name * fix sql-editor test * simplify table removal * add opt out telemetry step * fix logs tests * fix table editor spec * remove flaky steps from table editor tests * use vercel deployment events instead of build * add studio check * fix condition * debug event * rm if * trigger deploy * undo ac * make opt out button step optional, some envs dont hav eit * use testid for sql run button * use id instaed of timestamp in logs tests * empty * rm retries * up glbal timeout * chore: fix failing sql-editor playwright test (#35767) * chore: fix failing sql-editor playwright test * chore: minor fixes * Chore/update playwright config (#35826) chore: update playwright config * rm supabase project from e2e tests * refactor and simplify environments * fix sql editor test * fix ci env vars * fix * fix on windows * update readme * add playwright install script to readme * rm turbopack trace flag * npm to pnpm for scripts * delete ivan lines --------- Co-authored-by: Michael Ong <minghao_3728@hotmail.com> Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com>
156 lines
4.5 KiB
TypeScript
156 lines
4.5 KiB
TypeScript
import { expect, test as setup } from '@playwright/test'
|
|
import dotenv from 'dotenv'
|
|
import path from 'path'
|
|
import { env, STORAGE_STATE_PATH } from '../env.config'
|
|
|
|
/**
|
|
* Run any setup tasks for the tests.
|
|
* Catch errors and show useful messages.
|
|
*/
|
|
|
|
dotenv.config({
|
|
path: path.resolve(__dirname, '..', '.env.local'),
|
|
override: true,
|
|
})
|
|
|
|
const IS_PLATFORM = process.env.IS_PLATFORM
|
|
|
|
const envHasAuth = env.AUTHENTICATION
|
|
|
|
setup('Global Setup', async ({ page }) => {
|
|
console.log(`\n 🧪 Setting up test environment.
|
|
- Studio URL: ${env.STUDIO_URL}
|
|
- API URL: ${env.API_URL}
|
|
- Auth: ${envHasAuth ? 'enabled' : 'disabled'}
|
|
- Is Platform: ${IS_PLATFORM}
|
|
`)
|
|
|
|
/**
|
|
* Studio Check
|
|
*/
|
|
|
|
const studioUrl = env.STUDIO_URL
|
|
const apiUrl = env.API_URL
|
|
|
|
await page.goto(studioUrl).catch((err) => {
|
|
console.error(
|
|
`\n 🚨 Setup Error
|
|
Studio is not available at: ${studioUrl}
|
|
|
|
Please ensure:
|
|
1. Studio is running in the expected URL
|
|
2. You have proper network access
|
|
`
|
|
)
|
|
throw err
|
|
})
|
|
|
|
console.log(`\n ✅ Studio is running at ${studioUrl}`)
|
|
|
|
/**
|
|
* API Check
|
|
*/
|
|
|
|
await fetch(apiUrl).catch((err) => {
|
|
console.error(`\n 🚨 Setup Error
|
|
API is not available at: ${apiUrl}
|
|
|
|
Please ensure:
|
|
1. API is running in the expected URL
|
|
2. You have proper network access
|
|
|
|
To start API locally, run:
|
|
npm run dev:api`)
|
|
throw new Error('API is not available')
|
|
})
|
|
|
|
console.log(`\n ✅ API is running at ${apiUrl}`)
|
|
|
|
/**
|
|
* Only run authentication if the environment requires it
|
|
*/
|
|
if (!env.AUTHENTICATION) {
|
|
console.log(`\n 🔑 Skipping authentication for ${env.STUDIO_URL}`)
|
|
return
|
|
} else {
|
|
if (!env.EMAIL || !env.PASSWORD || !env.PROJECT_REF) {
|
|
console.error(`Missing environment variables. Check README.md for more information.`)
|
|
throw new Error('Missing environment variables')
|
|
}
|
|
}
|
|
|
|
const signInUrl = `${studioUrl}/sign-in`
|
|
console.log(`\n 🔑 Navigating to sign in page: ${signInUrl}`)
|
|
|
|
await page.goto(signInUrl, { waitUntil: 'networkidle' })
|
|
await page.waitForLoadState('domcontentloaded')
|
|
await page.waitForLoadState('networkidle')
|
|
|
|
// Check if we're still on the sign-in page
|
|
const currentUrl = page.url()
|
|
console.log(`\n 📍 Current URL: ${currentUrl}`)
|
|
|
|
if (!currentUrl.includes('/sign-in')) {
|
|
console.log('\n ⚠️ Redirected away from sign-in page. Checking if already authenticated...')
|
|
|
|
// Check if we're already on the projects page
|
|
if (currentUrl.includes('/projects')) {
|
|
console.log('\n ✅ Already authenticated, proceeding with tests')
|
|
await page.context().storageState({ path: STORAGE_STATE_PATH })
|
|
return
|
|
}
|
|
|
|
// If we're redirected somewhere else, try to navigate back to sign-in
|
|
console.log('\n 🔄 Attempting to navigate back to sign-in page')
|
|
await page.goto(signInUrl, { waitUntil: 'networkidle' })
|
|
await page.waitForLoadState('domcontentloaded')
|
|
await page.waitForLoadState('networkidle')
|
|
|
|
// Check URL again after second attempt
|
|
const secondAttemptUrl = page.url()
|
|
if (!secondAttemptUrl.includes('/sign-in')) {
|
|
throw new Error(`Failed to reach sign-in page. Current URL: ${secondAttemptUrl}`)
|
|
}
|
|
}
|
|
|
|
const auth = {
|
|
email: env.EMAIL,
|
|
password: env.PASSWORD,
|
|
projectRef: env.PROJECT_REF,
|
|
}
|
|
|
|
expect(auth).toBeDefined()
|
|
expect(auth.email).toBeDefined()
|
|
expect(auth.password).toBeDefined()
|
|
expect(auth.projectRef).toBeDefined()
|
|
|
|
// Wait for form elements with increased timeout
|
|
const emailInput = page.getByLabel('Email')
|
|
const passwordInput = page.getByLabel('Password')
|
|
const signInButton = page.getByRole('button', { name: 'Sign In' })
|
|
|
|
// if found click opt out on telemetry
|
|
const optOutButton = page.getByRole('button', { name: 'Opt out' })
|
|
if ((await optOutButton.count()) > 0) {
|
|
await optOutButton.click()
|
|
}
|
|
|
|
// Debug element states
|
|
console.log('\n 🔍 Checking form elements:')
|
|
console.log(`Email input exists: ${(await emailInput.count()) > 0}`)
|
|
console.log(`Password input exists: ${(await passwordInput.count()) > 0}`)
|
|
console.log(`Sign in button exists: ${(await signInButton.count()) > 0}`)
|
|
|
|
await emailInput.waitFor({ state: 'visible', timeout: 15000 })
|
|
await passwordInput.waitFor({ state: 'visible', timeout: 15000 })
|
|
await signInButton.waitFor({ state: 'visible', timeout: 15000 })
|
|
|
|
await emailInput.fill(auth.email ?? '')
|
|
await passwordInput.fill(auth.password ?? '')
|
|
await signInButton.click()
|
|
|
|
await page.waitForURL('**/organizations')
|
|
|
|
await page.context().storageState({ path: STORAGE_STATE_PATH })
|
|
})
|