|
|
@@ -0,0 +1,142 @@
|
|
|
+import { test, expect } from '@playwright/test'
|
|
|
+
|
|
|
+test.describe('Auth Module E2E Tests', () => {
|
|
|
+ test.describe('Login Page', () => {
|
|
|
+ test.beforeEach(async ({ page }) => {
|
|
|
+ await page.goto('/login')
|
|
|
+ })
|
|
|
+
|
|
|
+ test('should display login form correctly', async ({ page }) => {
|
|
|
+ await expect(page).toHaveTitle(/摄像头管理系统/)
|
|
|
+ await expect(page.getByPlaceholder('请输入用户名')).toBeVisible()
|
|
|
+ await expect(page.getByPlaceholder('请输入密码')).toBeVisible()
|
|
|
+ await expect(page.getByRole('button', { name: '登 录' })).toBeVisible()
|
|
|
+ await expect(page.getByText('记住我')).toBeVisible()
|
|
|
+ })
|
|
|
+
|
|
|
+ test('should show validation error when submitting empty form', async ({ page }) => {
|
|
|
+ await page.getByRole('button', { name: '登 录' }).click()
|
|
|
+ await expect(page.getByText('请输入用户名')).toBeVisible()
|
|
|
+ await expect(page.getByText('请输入密码')).toBeVisible()
|
|
|
+ })
|
|
|
+
|
|
|
+ test('should show error with invalid credentials', async ({ page }) => {
|
|
|
+ await page.getByPlaceholder('请输入用户名').fill('invalid_user')
|
|
|
+ await page.getByPlaceholder('请输入密码').fill('wrong_password')
|
|
|
+ await page.getByRole('button', { name: '登 录' }).click()
|
|
|
+ await expect(page.locator('.el-message--error').first()).toBeVisible({ timeout: 10000 })
|
|
|
+ })
|
|
|
+
|
|
|
+ test('should show help message when clicking forgot password', async ({ page }) => {
|
|
|
+ await page.getByText('忘记密码?').click()
|
|
|
+ await expect(page.locator('.el-message--info')).toBeVisible()
|
|
|
+ await expect(page.getByText('请联系管理员重置密码')).toBeVisible()
|
|
|
+ })
|
|
|
+
|
|
|
+ test('should have remember me checkbox checked by default', async ({ page }) => {
|
|
|
+ const rememberCheckbox = page.locator('.el-checkbox').filter({ hasText: '记住我' })
|
|
|
+ await expect(rememberCheckbox).toBeVisible()
|
|
|
+ await expect(rememberCheckbox).toHaveClass(/is-checked/)
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ test.describe('Authenticated Features', () => {
|
|
|
+ // These tests require valid credentials
|
|
|
+ // Skip if no test credentials are configured
|
|
|
+ const username = process.env.TEST_USERNAME || 'admin'
|
|
|
+ const password = process.env.TEST_PASSWORD || 'admin123'
|
|
|
+
|
|
|
+ test.skip('should login and see user dropdown', async ({ page }) => {
|
|
|
+ await page.goto('/login')
|
|
|
+ await page.getByPlaceholder('请输入用户名').fill(username)
|
|
|
+ await page.getByPlaceholder('请输入密码').fill(password)
|
|
|
+ await page.getByRole('button', { name: '登 录' }).click()
|
|
|
+
|
|
|
+ // Wait for redirect and check user dropdown exists
|
|
|
+ await expect(page).not.toHaveURL(/\/login/, { timeout: 10000 })
|
|
|
+ await expect(page.locator('.user-info')).toBeVisible()
|
|
|
+ })
|
|
|
+
|
|
|
+ test.skip('should show change password dialog from dropdown', async ({ page }) => {
|
|
|
+ // Login first
|
|
|
+ await page.goto('/login')
|
|
|
+ await page.getByPlaceholder('请输入用户名').fill(username)
|
|
|
+ await page.getByPlaceholder('请输入密码').fill(password)
|
|
|
+ await page.getByRole('button', { name: '登 录' }).click()
|
|
|
+ await expect(page).not.toHaveURL(/\/login/, { timeout: 10000 })
|
|
|
+
|
|
|
+ // Open user dropdown
|
|
|
+ await page.locator('.user-info').click()
|
|
|
+ await expect(page.getByText('修改密码')).toBeVisible()
|
|
|
+
|
|
|
+ // Click change password
|
|
|
+ await page.getByText('修改密码').click()
|
|
|
+
|
|
|
+ // Verify dialog opens
|
|
|
+ await expect(page.getByRole('dialog')).toBeVisible()
|
|
|
+ await expect(page.getByText('修改密码').first()).toBeVisible()
|
|
|
+ await expect(page.getByPlaceholder('请输入原密码')).toBeVisible()
|
|
|
+ await expect(page.getByPlaceholder('请输入新密码')).toBeVisible()
|
|
|
+ await expect(page.getByPlaceholder('请再次输入新密码')).toBeVisible()
|
|
|
+ })
|
|
|
+
|
|
|
+ test.skip('should validate change password form', async ({ page }) => {
|
|
|
+ // Login first
|
|
|
+ await page.goto('/login')
|
|
|
+ await page.getByPlaceholder('请输入用户名').fill(username)
|
|
|
+ await page.getByPlaceholder('请输入密码').fill(password)
|
|
|
+ await page.getByRole('button', { name: '登 录' }).click()
|
|
|
+ await expect(page).not.toHaveURL(/\/login/, { timeout: 10000 })
|
|
|
+
|
|
|
+ // Open change password dialog
|
|
|
+ await page.locator('.user-info').click()
|
|
|
+ await page.getByText('修改密码').click()
|
|
|
+
|
|
|
+ // Try to submit empty form
|
|
|
+ await page.getByRole('dialog').getByRole('button', { name: '确定' }).click()
|
|
|
+
|
|
|
+ // Check validation errors
|
|
|
+ await expect(page.getByText('请输入原密码')).toBeVisible()
|
|
|
+ await expect(page.getByText('请输入新密码')).toBeVisible()
|
|
|
+ await expect(page.getByText('请再次输入新密码')).toBeVisible()
|
|
|
+ })
|
|
|
+
|
|
|
+ test.skip('should validate password confirmation match', async ({ page }) => {
|
|
|
+ // Login first
|
|
|
+ await page.goto('/login')
|
|
|
+ await page.getByPlaceholder('请输入用户名').fill(username)
|
|
|
+ await page.getByPlaceholder('请输入密码').fill(password)
|
|
|
+ await page.getByRole('button', { name: '登 录' }).click()
|
|
|
+ await expect(page).not.toHaveURL(/\/login/, { timeout: 10000 })
|
|
|
+
|
|
|
+ // Open change password dialog
|
|
|
+ await page.locator('.user-info').click()
|
|
|
+ await page.getByText('修改密码').click()
|
|
|
+
|
|
|
+ // Fill mismatched passwords
|
|
|
+ await page.getByPlaceholder('请输入原密码').fill('oldpass')
|
|
|
+ await page.getByPlaceholder('请输入新密码').fill('newpass123')
|
|
|
+ await page.getByPlaceholder('请再次输入新密码').fill('differentpass')
|
|
|
+ await page.getByPlaceholder('请再次输入新密码').blur()
|
|
|
+
|
|
|
+ // Check validation error
|
|
|
+ await expect(page.getByText('两次输入的密码不一致')).toBeVisible()
|
|
|
+ })
|
|
|
+
|
|
|
+ test.skip('should logout successfully', async ({ page }) => {
|
|
|
+ // Login first
|
|
|
+ await page.goto('/login')
|
|
|
+ await page.getByPlaceholder('请输入用户名').fill(username)
|
|
|
+ await page.getByPlaceholder('请输入密码').fill(password)
|
|
|
+ await page.getByRole('button', { name: '登 录' }).click()
|
|
|
+ await expect(page).not.toHaveURL(/\/login/, { timeout: 10000 })
|
|
|
+
|
|
|
+ // Open user dropdown and logout
|
|
|
+ await page.locator('.user-info').click()
|
|
|
+ await page.getByText('退出登录').click()
|
|
|
+
|
|
|
+ // Should redirect to login page
|
|
|
+ await expect(page).toHaveURL(/\/login/, { timeout: 10000 })
|
|
|
+ })
|
|
|
+ })
|
|
|
+})
|