e8f51309e5
- 更新 Page Object 模型适配新字段名 - 新增 UAT 测试套件与 journey 测试用例 - 优化测试辅助工具与数据工厂 - 更新 playwright 认证状态
256 lines
6.5 KiB
TypeScript
256 lines
6.5 KiB
TypeScript
export interface UserData {
|
|
username: string;
|
|
nickname: string;
|
|
email: string;
|
|
phone: string;
|
|
password: string;
|
|
confirmPassword: string;
|
|
}
|
|
|
|
export interface RoleData {
|
|
roleName: string;
|
|
roleKey: string;
|
|
roleSort: number;
|
|
status: string;
|
|
}
|
|
|
|
export interface MenuData {
|
|
menuName: string;
|
|
menuType?: string;
|
|
path?: string;
|
|
component?: string;
|
|
permission?: string;
|
|
sort?: number;
|
|
visible?: string;
|
|
status?: string;
|
|
}
|
|
|
|
export interface DictTypeData {
|
|
dictName: string;
|
|
dictType: string;
|
|
status: string;
|
|
remark?: string;
|
|
}
|
|
|
|
export interface DictDataData {
|
|
dictLabel: string;
|
|
dictValue: string;
|
|
dictType: string;
|
|
status: string;
|
|
sort?: number;
|
|
}
|
|
|
|
export class TestDataFactory {
|
|
static generateTimestamp(): string {
|
|
return Date.now().toString();
|
|
}
|
|
|
|
static generateRandomString(length: number = 8): string {
|
|
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
let result = '';
|
|
for (let i = 0; i < length; i++) {
|
|
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static generateValidEmail(username: string): string {
|
|
return `${username}@example.com`;
|
|
}
|
|
|
|
static generateValidPhone(): string {
|
|
const prefix = ['138', '139', '150', '151', '186', '188'];
|
|
const selectedPrefix = prefix[Math.floor(Math.random() * prefix.length)];
|
|
const suffix = Math.floor(Math.random() * 100000000).toString().padStart(8, '0');
|
|
return selectedPrefix + suffix;
|
|
}
|
|
|
|
static generateValidPassword(): string {
|
|
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*';
|
|
let password = '';
|
|
for (let i = 0; i < 12; i++) {
|
|
password += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
}
|
|
return password;
|
|
}
|
|
|
|
static createUser(suffix?: string): UserData {
|
|
const timestamp = this.generateTimestamp();
|
|
const uniqueSuffix = suffix || this.generateRandomString(4);
|
|
|
|
return {
|
|
username: `testuser_${uniqueSuffix}_${timestamp}`,
|
|
nickname: `测试用户_${uniqueSuffix}_${timestamp}`,
|
|
email: this.generateValidEmail(`testuser_${uniqueSuffix}_${timestamp}`),
|
|
phone: this.generateValidPhone(),
|
|
password: this.generateValidPassword(),
|
|
confirmPassword: this.generateValidPassword()
|
|
};
|
|
}
|
|
|
|
static createAdminUser(): UserData {
|
|
return {
|
|
username: 'admin',
|
|
nickname: '管理员',
|
|
email: 'admin@example.com',
|
|
phone: '13800138000',
|
|
password: 'Test@123',
|
|
confirmPassword: 'Test@123'
|
|
};
|
|
}
|
|
|
|
static createRole(suffix?: string): RoleData {
|
|
const timestamp = this.generateTimestamp();
|
|
const uniqueSuffix = suffix || this.generateRandomString(4);
|
|
|
|
return {
|
|
roleName: `testrole_${uniqueSuffix}_${timestamp}`,
|
|
roleKey: `test_role_${uniqueSuffix}_${timestamp}`,
|
|
roleSort: 1,
|
|
status: '1'
|
|
};
|
|
}
|
|
|
|
static createAdminRole(): RoleData {
|
|
return {
|
|
roleName: '管理员',
|
|
roleKey: 'admin',
|
|
roleSort: 1,
|
|
status: '1'
|
|
};
|
|
}
|
|
|
|
static createMenu(suffix?: string, parentId?: string): MenuData {
|
|
const timestamp = this.generateTimestamp();
|
|
const uniqueSuffix = suffix || this.generateRandomString(4);
|
|
|
|
return {
|
|
menuName: `测试菜单_${uniqueSuffix}_${timestamp}`,
|
|
menuType: 'M',
|
|
path: `/testmenu_${uniqueSuffix}_${timestamp}`,
|
|
component: `TestMenu${uniqueSuffix}`,
|
|
permission: `system:testmenu:${uniqueSuffix}:${timestamp}`,
|
|
sort: 1,
|
|
visible: '0',
|
|
status: '0'
|
|
};
|
|
}
|
|
|
|
static createSubMenu(parentId: string, suffix?: string): MenuData {
|
|
const menuData = this.createMenu(suffix);
|
|
menuData.menuType = 'C';
|
|
menuData.path = `${menuData.path}/submenu`;
|
|
return menuData;
|
|
}
|
|
|
|
static createDictType(suffix?: string): DictTypeData {
|
|
const timestamp = this.generateTimestamp();
|
|
const uniqueSuffix = suffix || this.generateRandomString(4);
|
|
|
|
return {
|
|
dictName: `测试字典类型_${uniqueSuffix}_${timestamp}`,
|
|
dictType: `test_dict_type_${uniqueSuffix}_${timestamp}`,
|
|
status: '0',
|
|
remark: `测试字典类型备注_${uniqueSuffix}_${timestamp}`
|
|
};
|
|
}
|
|
|
|
static createDictData(dictType: string, suffix?: string): DictDataData {
|
|
const timestamp = this.generateTimestamp();
|
|
const uniqueSuffix = suffix || this.generateRandomString(4);
|
|
|
|
return {
|
|
dictLabel: `测试字典数据_${uniqueSuffix}_${timestamp}`,
|
|
dictValue: `test_dict_value_${uniqueSuffix}_${timestamp}`,
|
|
dictType: dictType,
|
|
status: '0',
|
|
sort: 1
|
|
};
|
|
}
|
|
|
|
static createBatchUsers(count: number): UserData[] {
|
|
const users: UserData[] = [];
|
|
for (let i = 0; i < count; i++) {
|
|
users.push(this.createUser(`batch_${i}`));
|
|
}
|
|
return users;
|
|
}
|
|
|
|
static createBatchRoles(count: number): RoleData[] {
|
|
const roles: RoleData[] = [];
|
|
for (let i = 0; i < count; i++) {
|
|
roles.push(this.createRole(`batch_${i}`));
|
|
}
|
|
return roles;
|
|
}
|
|
|
|
static createBatchMenus(count: number): MenuData[] {
|
|
const menus: MenuData[] = [];
|
|
for (let i = 0; i < count; i++) {
|
|
menus.push(this.createMenu(`batch_${i}`));
|
|
}
|
|
return menus;
|
|
}
|
|
|
|
static createBatchDictTypes(count: number): DictTypeData[] {
|
|
const dictTypes: DictTypeData[] = [];
|
|
for (let i = 0; i < count; i++) {
|
|
dictTypes.push(this.createDictType(`batch_${i}`));
|
|
}
|
|
return dictTypes;
|
|
}
|
|
|
|
static createBatchDictData(dictType: string, count: number): DictDataData[] {
|
|
const dictData: DictDataData[] = [];
|
|
for (let i = 0; i < count; i++) {
|
|
dictData.push(this.createDictData(dictType, `batch_${i}`));
|
|
}
|
|
return dictData;
|
|
}
|
|
|
|
static createInvalidUser(): UserData {
|
|
return {
|
|
username: '',
|
|
nickname: '',
|
|
email: 'invalid-email',
|
|
phone: 'invalid-phone',
|
|
password: 'weak',
|
|
confirmPassword: 'different'
|
|
};
|
|
}
|
|
|
|
static createInvalidRole(): RoleData {
|
|
return {
|
|
roleName: '',
|
|
roleKey: '',
|
|
roleSort: -1,
|
|
status: 'invalid'
|
|
};
|
|
}
|
|
|
|
static createInvalidMenu(): MenuData {
|
|
return {
|
|
menuName: '',
|
|
menuType: 'invalid',
|
|
path: '',
|
|
component: '',
|
|
permission: '',
|
|
sort: -1,
|
|
visible: 'invalid',
|
|
status: 'invalid'
|
|
};
|
|
}
|
|
|
|
static createLongString(length: number = 1000): string {
|
|
return this.generateRandomString(length);
|
|
}
|
|
|
|
static createSpecialCharsString(): string {
|
|
return '!@#$%^&*()_+-=[]{}|;:,.<>?/~`';
|
|
}
|
|
|
|
static createUnicodeString(): string {
|
|
return '测试中文🎉🚀';
|
|
}
|
|
}
|