nextjs-rewrite (#5)
Reviewed-on: #5 Co-authored-by: David Gwilliam <dhgwilliam@gmail.com> Co-committed-by: David Gwilliam <dhgwilliam@gmail.com>
This commit was merged in pull request #5.
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
/**
|
||||
* Global setup for Playwright tests
|
||||
* Creates test users and saves authentication state
|
||||
*/
|
||||
|
||||
import { chromium, type FullConfig } from '@playwright/test';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
const authFile = 'playwright/.auth/user.json';
|
||||
const adminAuthFile = 'playwright/.auth/admin.json';
|
||||
|
||||
export default async function globalSetup(config: FullConfig) {
|
||||
const baseURL = config.projects[0]?.use?.baseURL || 'http://localhost:3000';
|
||||
|
||||
const browser = await chromium.launch();
|
||||
const context = await browser.newContext();
|
||||
const page = await context.newPage();
|
||||
|
||||
// Log all responses for debugging
|
||||
page.on('response', response => {
|
||||
if (response.url().includes('/api/auth')) {
|
||||
console.log('API Response:', response.status(), response.url());
|
||||
}
|
||||
});
|
||||
|
||||
// Generate unique test credentials
|
||||
const timestamp = Date.now();
|
||||
const testEmail = `setup-user-${timestamp}@example.com`;
|
||||
const testPassword = 'TestPassword123!';
|
||||
const testName = 'Setup User';
|
||||
|
||||
try {
|
||||
// Navigate to registration page
|
||||
console.log('Navigating to registration page...');
|
||||
await page.goto(`${baseURL}/auth/register`);
|
||||
|
||||
// Fill in registration form
|
||||
await page.fill('input[name="name"]', testName);
|
||||
await page.fill('input[name="email"]', testEmail);
|
||||
await page.fill('input[name="password"]', testPassword);
|
||||
|
||||
// Submit the form
|
||||
console.log('Submitting registration form...');
|
||||
await page.click('button[type="submit"]');
|
||||
|
||||
// Wait for the sign-up API call to complete
|
||||
console.log('Waiting for sign-up API call...');
|
||||
try {
|
||||
await page.waitForResponse(response =>
|
||||
response.url().includes('/api/auth/sign-up/email') && response.status() === 200,
|
||||
{ timeout: 10000 }
|
||||
);
|
||||
console.log('Sign-up API call successful');
|
||||
} catch (e) {
|
||||
console.log('Sign-up API call failed or timed out');
|
||||
}
|
||||
|
||||
// Wait a bit for session to be established
|
||||
console.log('Waiting for session establishment...');
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Check if we're already authenticated
|
||||
const currentUrl = page.url();
|
||||
console.log('Current URL after registration:', currentUrl);
|
||||
|
||||
// Save the authentication state
|
||||
await context.storageState({ path: authFile });
|
||||
|
||||
console.log(`Created and authenticated test user: ${testEmail}`);
|
||||
|
||||
// Now create admin user
|
||||
const adminTimestamp = timestamp + 1;
|
||||
const adminEmail = `setup-admin-${adminTimestamp}@example.com`;
|
||||
const adminPassword = 'AdminPassword123!';
|
||||
const adminName = 'Setup Admin';
|
||||
|
||||
// Navigate to registration page again
|
||||
console.log('Navigating to registration page for admin...');
|
||||
await page.goto(`${baseURL}/auth/register`);
|
||||
|
||||
// Fill in registration form
|
||||
await page.fill('input[name="name"]', adminName);
|
||||
await page.fill('input[name="email"]', adminEmail);
|
||||
await page.fill('input[name="password"]', adminPassword);
|
||||
|
||||
// Submit the form
|
||||
console.log('Submitting admin registration form...');
|
||||
await page.click('button[type="submit"]');
|
||||
|
||||
// Wait for the sign-up API call to complete
|
||||
console.log('Waiting for admin sign-up API call...');
|
||||
try {
|
||||
await page.waitForResponse(response =>
|
||||
response.url().includes('/api/auth/sign-up/email') && response.status() === 200,
|
||||
{ timeout: 10000 }
|
||||
);
|
||||
console.log('Admin sign-up API call successful');
|
||||
} catch (e) {
|
||||
console.log('Admin sign-up API call failed or timed out');
|
||||
}
|
||||
|
||||
// Wait a bit for session to be established
|
||||
console.log('Waiting for admin session establishment...');
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Update user role to admin via database
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { email: adminEmail }
|
||||
});
|
||||
|
||||
if (user) {
|
||||
await prisma.user.update({
|
||||
where: { id: user.id },
|
||||
data: { role: 'club_admin' }
|
||||
});
|
||||
console.log('Updated user role to club_admin');
|
||||
}
|
||||
|
||||
// Navigate to admin page to refresh session
|
||||
console.log('Navigating to admin page for admin user...');
|
||||
await page.goto(`${baseURL}/admin`);
|
||||
await page.waitForLoadState('networkidle');
|
||||
console.log('Admin page loaded:', page.url());
|
||||
|
||||
// Wait a bit to ensure session is refreshed
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Refresh the page to force session reload
|
||||
await page.reload();
|
||||
await page.waitForLoadState('networkidle');
|
||||
console.log('Page reloaded');
|
||||
|
||||
// Save the authentication state
|
||||
await context.storageState({ path: adminAuthFile });
|
||||
|
||||
console.log(`Created and authenticated admin user: ${adminEmail}`);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Global setup error:', error);
|
||||
throw error;
|
||||
} finally {
|
||||
await browser.close();
|
||||
}
|
||||
|
||||
// Return teardown function
|
||||
return async () => {
|
||||
// Clean up test users
|
||||
try {
|
||||
await prisma.user.deleteMany({
|
||||
where: {
|
||||
email: {
|
||||
startsWith: 'setup-'
|
||||
}
|
||||
}
|
||||
});
|
||||
console.log('Cleaned up test users');
|
||||
} catch (error) {
|
||||
console.error('Error cleaning up test users:', error);
|
||||
} finally {
|
||||
await prisma.$disconnect();
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user