Files
novalon-manage-system/novalon-manage-web/e2e/role-based-tests/shared/test-data-manager.ts
T
张翔 bf2ebab9aa feat: 实现测试数据管理器
- 创建 TestDataManager 单例类
- 支持创建用户、角色等测试数据
- 实现测试数据跟踪机制
- 支持自动清理测试数据
- 添加完整的单元测试(6个测试用例全部通过)
2026-04-04 20:55:20 +08:00

147 lines
3.5 KiB
TypeScript

import { Page } from '@playwright/test';
export interface TestData {
id: string;
type: string;
data: Record<string, any>;
createdAt: Date;
}
export class TestDataManager {
private static instance: TestDataManager;
private createdData: Map<string, TestData[]> = new Map();
private page: Page | null = null;
private static readonly API_BASE_URL = process.env.VITE_API_BASE_URL || 'http://localhost:8084';
static getInstance(): TestDataManager {
if (!TestDataManager.instance) {
TestDataManager.instance = new TestDataManager();
}
return TestDataManager.instance;
}
setPage(page: Page): void {
this.page = page;
}
async createUser(userData: {
username: string;
password: string;
email: string;
phone?: string;
nickname?: string;
}): Promise<TestData> {
const response = await fetch(`${TestDataManager.API_BASE_URL}/api/users`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
...userData,
status: 1,
}),
});
if (!response.ok) {
throw new Error(`Failed to create user: ${response.statusText}`);
}
const result = await response.json();
const testData: TestData = {
id: result.data?.id || result.id,
type: 'user',
data: userData,
createdAt: new Date(),
};
this.trackData('user', testData);
return testData;
}
async createRole(roleData: {
roleName: string;
roleKey: string;
roleSort?: number;
}): Promise<TestData> {
const response = await fetch(`${TestDataManager.API_BASE_URL}/api/roles`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
...roleData,
status: 1,
}),
});
if (!response.ok) {
throw new Error(`Failed to create role: ${response.statusText}`);
}
const result = await response.json();
const testData: TestData = {
id: result.data?.id || result.id,
type: 'role',
data: roleData,
createdAt: new Date(),
};
this.trackData('role', testData);
return testData;
}
async cleanup(type?: string): Promise<void> {
const typesToClean = type ? [type] : Array.from(this.createdData.keys());
for (const dataType of typesToClean) {
const items = this.createdData.get(dataType) || [];
for (const item of items.reverse()) {
try {
await this.deleteData(item);
} catch (error) {
console.error(`Failed to cleanup ${dataType} ${item.id}:`, error);
}
}
this.createdData.delete(dataType);
}
}
private async deleteData(data: TestData): Promise<void> {
const endpoint = this.getEndpoint(data.type);
await fetch(`${TestDataManager.API_BASE_URL}${endpoint}/${data.id}`, {
method: 'DELETE',
});
}
private getEndpoint(type: string): string {
const endpoints: Record<string, string> = {
user: '/api/users',
role: '/api/roles',
menu: '/api/menus',
config: '/api/configs',
};
return endpoints[type] || `/api/${type}s`;
}
private trackData(type: string, data: TestData): void {
if (!this.createdData.has(type)) {
this.createdData.set(type, []);
}
this.createdData.get(type)!.push(data);
}
getCreatedData(type: string): TestData[] {
return this.createdData.get(type) || [];
}
clearTracking(): void {
this.createdData.clear();
}
}
export function getTestDataManager(): TestDataManager {
return TestDataManager.getInstance();
}