You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.4 KiB
81 lines
2.4 KiB
/**
|
|
* E2E Test: Authentication - Login Flow
|
|
*
|
|
* This is an EXAMPLE test showing how to use test credentials.
|
|
* To run this test:
|
|
*
|
|
* 1. Copy .env.example to .env
|
|
* 2. Set TEST_USER_EMAIL and TEST_USER_PASSWORD
|
|
* 3. Run: pnpm test:e2e
|
|
*
|
|
* @example
|
|
* ```bash
|
|
* # .env
|
|
* TEST_USER_EMAIL=bm@noxware.de
|
|
* TEST_USER_PASSWORD=%654321qQ!
|
|
* ```
|
|
*/
|
|
|
|
import { test, expect } from '@playwright/test'
|
|
|
|
test.describe('Authentication - Login Flow', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
// Navigate to auth page before each test
|
|
await page.goto('/auth')
|
|
})
|
|
|
|
test('should login with test credentials from environment', async ({ page }) => {
|
|
// Fetch test credentials from API endpoint
|
|
const response = await fetch('http://localhost:3000/api/test/credentials')
|
|
|
|
// Skip test if credentials not configured
|
|
if (!response.ok) {
|
|
test.skip()
|
|
return
|
|
}
|
|
|
|
const { email, password } = await response.json()
|
|
|
|
// Fill in login form
|
|
await page.fill('input[type="email"]', email)
|
|
await page.fill('input[type="password"]', password)
|
|
|
|
// Submit form
|
|
await page.click('button[type="submit"]')
|
|
|
|
// Wait for navigation to complete
|
|
await page.waitForURL('/')
|
|
|
|
// Verify we're on homepage
|
|
expect(page.url()).toBe('http://localhost:3000/')
|
|
|
|
// Optional: Verify user is logged in (check for user menu, etc.)
|
|
// await expect(page.locator('[data-testid="user-menu"]')).toBeVisible()
|
|
})
|
|
|
|
test('should show error with invalid credentials', async ({ page }) => {
|
|
// Fill in login form with invalid credentials
|
|
await page.fill('input[type="email"]', 'invalid@example.com')
|
|
await page.fill('input[type="password"]', 'wrongpassword')
|
|
|
|
// Submit form
|
|
await page.click('button[type="submit"]')
|
|
|
|
// Verify error message is shown
|
|
await expect(page.locator('[role="alert"]')).toBeVisible()
|
|
await expect(page.locator('[role="alert"]')).toContainText('Invalid credentials')
|
|
})
|
|
|
|
test('should validate email format', async ({ page }) => {
|
|
// Fill in invalid email
|
|
await page.fill('input[type="email"]', 'not-an-email')
|
|
await page.fill('input[type="password"]', 'somepassword')
|
|
|
|
// Submit form
|
|
await page.click('button[type="submit"]')
|
|
|
|
// Verify validation error
|
|
// Note: Exact selector depends on your validation error display
|
|
await expect(page.locator('text=Invalid email')).toBeVisible()
|
|
})
|
|
})
|
|
|