59 lines
2.3 KiB
TypeScript
59 lines
2.3 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
import { LoginPage } from './pages/login.page'
|
|
|
|
// Login tests must run WITHOUT stored auth state
|
|
test.use({ storageState: { cookies: [], origins: [] } })
|
|
|
|
test.describe('Login Flow', () => {
|
|
test('should show login page with email and password fields', async ({ page }) => {
|
|
const loginPage = new LoginPage(page)
|
|
await loginPage.goto()
|
|
await expect(loginPage.emailInput).toBeVisible()
|
|
await expect(loginPage.passwordInput).toBeVisible()
|
|
await expect(loginPage.submitButton).toBeVisible()
|
|
})
|
|
|
|
test('should show error on invalid credentials', async ({ page }) => {
|
|
const loginPage = new LoginPage(page)
|
|
await loginPage.goto()
|
|
await loginPage.login('wrong@example.com', 'wrongpassword')
|
|
// Should stay on login page or show error
|
|
await page.waitForTimeout(3000)
|
|
const onLogin = page.url().includes('/login')
|
|
const hasError = (await page.locator('[data-testid="login-error"]').count()) > 0
|
|
expect(onLogin || hasError).toBe(true)
|
|
})
|
|
|
|
test('should redirect to dashboard on valid login', async ({ page }) => {
|
|
const loginPage = new LoginPage(page)
|
|
await loginPage.goto()
|
|
await loginPage.login(
|
|
process.env.TEST_ADMIN_EMAIL || 'e2e-test@the-other-dude.dev',
|
|
process.env.TEST_ADMIN_PASSWORD || 'admin123'
|
|
)
|
|
// Legacy auth user may trigger SRP upgrade dialog -- handle it
|
|
const upgradeDialog = page.getByRole('dialog')
|
|
if (await upgradeDialog.isVisible({ timeout: 3000 }).catch(() => false)) {
|
|
const skipButton = page.getByRole('button', { name: /skip|cancel|later|close/i })
|
|
if (await skipButton.isVisible({ timeout: 1000 }).catch(() => false)) {
|
|
await skipButton.click()
|
|
}
|
|
}
|
|
// Should redirect away from login after successful auth
|
|
await expect(page).not.toHaveURL(/login/, { timeout: 15000 })
|
|
})
|
|
|
|
test('should display TOD branding', async ({ page }) => {
|
|
const loginPage = new LoginPage(page)
|
|
await loginPage.goto()
|
|
await expect(page.getByText('TOD - The Other Dude')).toBeVisible()
|
|
await expect(page.getByText('MSP Fleet Management')).toBeVisible()
|
|
})
|
|
|
|
test('should disable submit button when fields are empty', async ({ page }) => {
|
|
const loginPage = new LoginPage(page)
|
|
await loginPage.goto()
|
|
await expect(loginPage.submitButton).toBeDisabled()
|
|
})
|
|
})
|