chore: add E2E registration tests and helper scripts
This commit is contained in:
parent
caa658cabb
commit
ed21770e19
10
run-api-test.sh
Executable file
10
run-api-test.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
# run-api-test.sh
|
||||
# Placeholder for API tests - as requested by user pattern.
|
||||
# Currently assumes API tests might be located similarly or future expansion.
|
||||
# If no API tests defined yet, this is a stub.
|
||||
|
||||
echo "Running API tests..."
|
||||
# Example: npm run test:api
|
||||
# or vitest specific path
|
||||
echo "No specific API test command configured yet. Please update this script."
|
||||
8
run-ui-test.sh
Executable file
8
run-ui-test.sh
Executable file
@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
# run-ui-test.sh
|
||||
# Usage: ./run-ui-test.sh [test-file]
|
||||
|
||||
TEST_FILE=${1:-"tests/e2e/ui/registration/register.spec.ts"}
|
||||
|
||||
echo "Running UI tests: $TEST_FILE"
|
||||
npx playwright test "$TEST_FILE"
|
||||
93
tests/e2e/ui/registration/register.spec.ts
Normal file
93
tests/e2e/ui/registration/register.spec.ts
Normal file
@ -0,0 +1,93 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test.describe('Registration Flow', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
// Mock the send email API to always succeed
|
||||
await page.route('/api/auth/register/send', async (route) => {
|
||||
await route.fulfill({ status: 200, body: JSON.stringify({ success: true }) });
|
||||
});
|
||||
|
||||
// Mock the verification/register API to always succeed
|
||||
await page.route('/api/auth/register', async (route) => {
|
||||
await route.fulfill({ status: 200, body: JSON.stringify({ success: true, redirectTo: '/' }) });
|
||||
});
|
||||
|
||||
// Mock the login API that is called after registration
|
||||
await page.route('/api/auth/login', async (route) => {
|
||||
await route.fulfill({ status: 200, body: JSON.stringify({ success: true, redirectTo: '/' }) });
|
||||
});
|
||||
|
||||
await page.goto('/register');
|
||||
});
|
||||
|
||||
test('should validate username rules', async ({ page }) => {
|
||||
const usernameInput = page.getByLabel(/Username|用户名/);
|
||||
const emailInput = page.getByLabel(/Email|邮箱/);
|
||||
const passwordInput = page.getByLabel(/^Password|密码$/);
|
||||
const confirmPasswordInput = page.getByLabel(/Confirm Password|确认密码/);
|
||||
const nextButton = page.getByRole('button', { name: /Next|下一步|获取验证码/ });
|
||||
|
||||
// Helper to fill form and check for error
|
||||
const attemptRegistration = async (username: string) => {
|
||||
await usernameInput.fill(username);
|
||||
await nextButton.click();
|
||||
};
|
||||
|
||||
// 1. Starts with digit
|
||||
await attemptRegistration('1abc');
|
||||
await expect(page.getByText(/Invalid Name|用户名格式不正确/)).toBeVisible();
|
||||
|
||||
// 2. Too short
|
||||
await attemptRegistration('abc');
|
||||
await expect(page.getByText(/Invalid Name|用户名格式不正确/)).toBeVisible();
|
||||
|
||||
// 3. Special characters
|
||||
await attemptRegistration('user@name');
|
||||
await expect(page.getByText(/Invalid Name|用户名格式不正确/)).toBeVisible();
|
||||
|
||||
// 4. Valid username - should NOT show error (but will fail on other fields if empty, so we just check user field validation logic primarily)
|
||||
// To strictly check if it proceeds, we need to fill other fields
|
||||
await usernameInput.fill('ValidUser1');
|
||||
await emailInput.fill('test@example.com');
|
||||
await passwordInput.fill('Password123!');
|
||||
await confirmPasswordInput.fill('Password123!');
|
||||
await page.getByRole('checkbox').check();
|
||||
|
||||
// Clear any previous errors
|
||||
// Click Next
|
||||
await nextButton.click();
|
||||
|
||||
// Expect transition to Step 2 (Verification code input should appear)
|
||||
await expect(page.locator('input[inputmode="numeric"]')).toHaveCount(6);
|
||||
});
|
||||
|
||||
test('should auto-submit after entering 6-digit code', async ({ page }) => {
|
||||
// Fill Step 1
|
||||
await page.getByLabel(/Username|用户名/).fill('AutoSubmitUser');
|
||||
await page.getByLabel(/Email|邮箱/).fill('test@example.com');
|
||||
await page.getByLabel(/^Password|密码$/).fill('Password123!');
|
||||
await page.getByLabel(/Confirm Password|确认密码/).fill('Password123!');
|
||||
await page.getByRole('checkbox').check();
|
||||
await page.getByRole('button', { name: /Next|下一步|获取验证码/ }).click();
|
||||
|
||||
// Wait for Step 2
|
||||
const codeInputs = page.locator('input[inputmode="numeric"]');
|
||||
await expect(codeInputs).toHaveCount(6);
|
||||
|
||||
// Enter code digits 1-6 slowly
|
||||
const code = '123456';
|
||||
for (let i = 0; i < code.length; i++) {
|
||||
await codeInputs.nth(i).type(code[i], { delay: 100 });
|
||||
}
|
||||
|
||||
// Verify auto-submit triggered
|
||||
// The button should show loading state or we should be redirected
|
||||
// Since we mocked success, we expect redirect or success message
|
||||
// Updating checking logic based on UI behavior
|
||||
await expect(page.getByRole('button', { name: /Completing|完成中/ })).toBeVisible();
|
||||
|
||||
// Eventually should redirect or show success
|
||||
// If redirection happens within the test context, page URL should change or success alert appears
|
||||
// await expect(page).toHaveURL('/'); // Uncomment if verification of redirect is strictly needed and works with the mock
|
||||
});
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user