upskill-event-manager/wordpress-dev/tests/e2e/test-data/environment/testEnvironmentManager.ts
bengizmo d6211ee364 feat(testing): Implement HVAC_Test_User_Factory and update .gitignore
- Add HVAC_Test_User_Factory class with:
  * User creation with specific roles
  * Multiple role support
  * Persona management system
  * Account cleanup integration
- Create comprehensive test suite in HVAC_Test_User_Factory_Test.php
- Update testing improvement plan documentation
- Add implementation decisions to project memory bank
- Restructure .gitignore with:
  * Whitelist approach for better file management
  * Explicit backup exclusions
  * Specific bin directory inclusions

Part of the Account Management component from the testing framework improvement plan.
2025-04-14 17:41:36 -03:00

153 lines
No EOL
6.1 KiB
TypeScript

import { chromium, Page, Browser } from '@playwright/test';
import { testEnvironment, API_ENDPOINTS, SETUP_TIMEOUT } from './config';
import { testPersonas } from '../personas/userPersonas';
import { testEvents } from '../events/eventDefinitions';
export class TestEnvironmentManager {
private browser: Browser | null = null;
private page: Page | null = null;
private authToken: string | null = null;
async setup() {
console.log('Setting up test environment...');
this.browser = await chromium.launch();
this.page = await this.browser.newPage();
await this.authenticate();
await this.createTestUsers();
await this.createTestEvents();
console.log('Test environment setup complete.');
}
async authenticate() {
const response = await this.page!.request.post(`${testEnvironment.baseUrl}${API_ENDPOINTS.auth}`, {
data: {
username: testEnvironment.adminUser.username,
password: testEnvironment.adminUser.password
}
});
const data = await response.json();
this.authToken = data.token;
}
async createTestUsers() {
console.log('Creating test users...');
for (const [key, persona] of Object.entries(testPersonas)) {
try {
await this.page!.request.post(`${testEnvironment.baseUrl}${API_ENDPOINTS.users}`, {
headers: {
'Authorization': `Bearer ${this.authToken}`
},
data: {
username: persona.username,
email: persona.email,
password: persona.password,
first_name: persona.firstName,
last_name: persona.lastName,
roles: [persona.role],
meta: {
business_name: persona.businessName,
business_type: persona.businessType,
location: persona.location,
special_attributes: persona.specialAttributes
}
}
});
console.log(`Created user: ${persona.username}`);
} catch (error) {
console.error(`Failed to create user ${persona.username}:`, error);
}
}
}
async createTestEvents() {
console.log('Creating test events...');
for (const event of testEvents) {
try {
await this.page!.request.post(`${testEnvironment.baseUrl}${API_ENDPOINTS.events}`, {
headers: {
'Authorization': `Bearer ${this.authToken}`
},
data: {
title: event.title,
description: event.description,
start_date: event.startDate,
end_date: event.endDate,
capacity: event.capacity,
cost: event.price,
venue: event.location,
categories: [event.category],
tags: event.tags
}
});
console.log(`Created event: ${event.title}`);
} catch (error) {
console.error(`Failed to create event ${event.title}:`, error);
}
}
}
async verify() {
console.log('Verifying test environment...');
const usersResponse = await this.page!.request.get(`${testEnvironment.baseUrl}${API_ENDPOINTS.users}`, {
headers: { 'Authorization': `Bearer ${this.authToken}` }
});
const users = await usersResponse.json();
const eventsResponse = await this.page!.request.get(`${testEnvironment.baseUrl}${API_ENDPOINTS.events}`, {
headers: { 'Authorization': `Bearer ${this.authToken}` }
});
const events = await eventsResponse.json();
const expectedUserCount = Object.keys(testPersonas).length;
const expectedEventCount = testEvents.length;
if (users.length < expectedUserCount || events.length < expectedEventCount) {
throw new Error('Test environment verification failed: Missing users or events');
}
console.log('Test environment verified successfully.');
}
async teardown(force = false) {
console.log('Tearing down test environment...');
if (force) {
await this.deleteAllTestData();
}
if (this.browser) {
await this.browser.close();
}
this.browser = null;
this.page = null;
this.authToken = null;
console.log('Test environment teardown complete.');
}
private async deleteAllTestData() {
console.log('Force deleting all test data...');
// Delete test events
const eventsResponse = await this.page!.request.get(`${testEnvironment.baseUrl}${API_ENDPOINTS.events}`, {
headers: { 'Authorization': `Bearer ${this.authToken}` }
});
const events = await eventsResponse.json();
for (const event of events) {
await this.page!.request.delete(`${testEnvironment.baseUrl}${API_ENDPOINTS.events}/${event.id}`, {
headers: { 'Authorization': `Bearer ${this.authToken}` }
});
}
// Delete test users
const usersResponse = await this.page!.request.get(`${testEnvironment.baseUrl}${API_ENDPOINTS.users}`, {
headers: { 'Authorization': `Bearer ${this.authToken}` }
});
const users = await usersResponse.json();
for (const user of users) {
if (user.username !== testEnvironment.adminUser.username) {
await this.page!.request.delete(`${testEnvironment.baseUrl}${API_ENDPOINTS.users}/${user.id}`, {
headers: { 'Authorization': `Bearer ${this.authToken}` }
});
}
}
console.log('All test data deleted.');
}
}
export const testEnv = new TestEnvironmentManager();