Readur/frontend/e2e/auth-system.spec.ts

113 lines
4.7 KiB
TypeScript

import { test, expect } from './fixtures/auth';
import { E2ETestAuthHelper } from './utils/test-auth-helper';
test.describe('E2E Auth System', () => {
test('should create and login dynamic test user', async ({ page, testUser }) => {
// The testUser fixture should have created a user and logged them in via dynamicUserPage
expect(testUser.credentials.username).toMatch(/^e2e_user_\d+_\d+_[a-z0-9]+$/);
expect(testUser.userResponse.role).toBe('User');
console.log(`Test user created: ${testUser.credentials.username} (${testUser.userResponse.id})`);
});
test('should create and login dynamic admin user', async ({ page, testAdmin }) => {
// The testAdmin fixture should have created an admin user
expect(testAdmin.credentials.username).toMatch(/^e2e_admin_\d+_\d+_[a-z0-9]+$/);
expect(testAdmin.userResponse.role).toBe('Admin');
console.log(`Test admin created: ${testAdmin.credentials.username} (${testAdmin.userResponse.id})`);
});
test('should login dynamic user via browser UI', async ({ page, testUser }) => {
const authHelper = new E2ETestAuthHelper(page);
// Ensure we're logged out first
await authHelper.ensureLoggedOut();
// Login with the dynamic user
const loginSuccess = await authHelper.loginUser(testUser.credentials);
expect(loginSuccess).toBe(true);
// Verify we're on the dashboard
await expect(page).toHaveURL(/.*\/dashboard.*/);
await expect(page.locator('h4:has-text("Welcome back,")')).toBeVisible();
console.log(`Successfully logged in dynamic user: ${testUser.credentials.username}`);
});
test('should login dynamic admin via browser UI', async ({ page, testAdmin }) => {
const authHelper = new E2ETestAuthHelper(page);
// Ensure we're logged out first
await authHelper.ensureLoggedOut();
// Login with the dynamic admin
const loginSuccess = await authHelper.loginUser(testAdmin.credentials);
expect(loginSuccess).toBe(true);
// Verify we're on the dashboard
await expect(page).toHaveURL(/.*\/dashboard.*/);
await expect(page.locator('h4:has-text("Welcome back,")')).toBeVisible();
console.log(`Successfully logged in dynamic admin: ${testAdmin.credentials.username}`);
});
test('should support API login for dynamic users', async ({ page, testUser }) => {
const authHelper = new E2ETestAuthHelper(page);
// Login via API
const token = await authHelper.loginUserAPI(testUser.credentials);
expect(token).toBeTruthy();
expect(typeof token).toBe('string');
console.log(`Successfully got API token for: ${testUser.credentials.username}`);
});
test('should create unique users for each test', async ({ page }) => {
const authHelper = new E2ETestAuthHelper(page);
// Create multiple users to ensure uniqueness
const user1 = await authHelper.createTestUser();
const user2 = await authHelper.createTestUser();
// Should have different usernames and IDs
expect(user1.credentials.username).not.toBe(user2.credentials.username);
expect(user1.userResponse.id).not.toBe(user2.userResponse.id);
console.log(`Created unique users: ${user1.credentials.username} and ${user2.credentials.username}`);
});
test('dynamic admin should have admin permissions', async ({ dynamicAdminPage }) => {
// The dynamicAdminPage fixture should have created and logged in an admin user
// Navigate to a page that requires admin access (users management)
await dynamicAdminPage.goto('/users');
// Should not be redirected to dashboard (would happen for non-admin users)
await expect(dynamicAdminPage).toHaveURL(/.*\/users.*/);
// Should see admin-only content
await expect(dynamicAdminPage.locator('h1, h2, h3, h4, h5, h6')).toContainText(['Users', 'User Management'], { timeout: 10000 });
console.log('✅ Dynamic admin user has admin permissions');
});
test('dynamic user should have user permissions', async ({ dynamicUserPage }) => {
// The dynamicUserPage fixture should have created and logged in a regular user
// Try to navigate to an admin-only page
await dynamicUserPage.goto('/users');
// Should be redirected to dashboard or get access denied
await dynamicUserPage.waitForLoadState('networkidle');
// Should either be redirected to dashboard or see access denied
const currentUrl = dynamicUserPage.url();
const isDashboard = currentUrl.includes('/dashboard');
const isAccessDenied = await dynamicUserPage.locator(':has-text("Access denied"), :has-text("Unauthorized"), :has-text("403")').isVisible().catch(() => false);
expect(isDashboard || isAccessDenied).toBe(true);
console.log('✅ Dynamic user has restricted permissions');
});
});