- 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.
153 lines
No EOL
6.1 KiB
TypeScript
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(); |