import { test, expect } from '../../utils/test-setup'; import { readFileSync } from 'fs'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const testUsers = JSON.parse(readFileSync(join(__dirname, '../../fixtures/test-users.json'), 'utf-8')); // 超时配置 const TIMEOUTS = { SHORT: 300, MEDIUM: 500, LONG: 1000, VERY_SHORT: 200, } as const; /** * 生成唯一的测试数据 */ function generateUniqueTestData(suffix: string) { const randomPart = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const timestamp = Date.now(); return { name: `备注${suffix}_${timestamp}_${randomPart}`, gender: randomPart % 2 === 0 ? '男' : '女', idCard: `42010119900101${String(randomPart % 10000).padStart(4, '0')}`, disabilityId: `511001199001${String(randomPart % 10000).padStart(4, '0')}`, disabilityType: ['视力残疾', '听力残疾', '言语残疾', '肢体残疾', '智力残疾', '精神残疾'][randomPart % 6], disabilityLevel: ['一级', '二级', '三级', '四级'][randomPart % 4], phone: `138${String(randomPart % 100000000).padStart(8, '0')}`, idAddress: `湖北省武汉市测试街道${randomPart % 100}号`, province: '湖北省', city: '武汉市' }; } test.describe('残疾人管理 - 备注管理功能', () => { // 测试级别的时间戳,用于生成唯一数据 const TEST_TIMESTAMP = Date.now(); const TEST_PREFIX = `note_${TEST_TIMESTAMP}`; // 测试级别的数据存储,避免可变全局状态 let createdTestData: Array<{ name: string; idCard: string }> = []; test.beforeEach(async ({ adminLoginPage, disabilityPersonPage }) => { // 每次测试前重置数据存储 createdTestData = []; // 以管理员身份登录后台 await adminLoginPage.goto(); await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password); await adminLoginPage.expectLoginSuccess(); await disabilityPersonPage.goto(); }); test.afterEach(async ({ disabilityPersonPage, page }) => { // 清理测试数据(添加超时保护以避免 afterEach 超过 60 秒) for (const data of createdTestData) { try { await disabilityPersonPage.goto().catch(() => {}); await disabilityPersonPage.searchByName(data.name); // 为每个清理操作设置较短的超时时间 const deleteButton = page.getByRole('button', { name: '删除' }).first(); if (await deleteButton.count({ timeout: 2000 }) > 0) { await deleteButton.click({ timeout: 5000 }); await page.getByRole('button', { name: '确认' }).click({ timeout: 5000 }).catch(() => {}); await page.waitForTimeout(TIMEOUTS.SHORT); } } catch (error) { console.debug(` ⚠ 清理数据失败: ${data.name}`, error); } } createdTestData.length = 0; }); test('应该成功添加简单备注', async ({ disabilityPersonPage }) => { const testData = generateUniqueTestData('简单备注'); createdTestData.push({ name: testData.name, idCard: testData.idCard }); console.debug('\n========== 添加简单备注测试 =========='); // 打开对话框并填写基本信息 await disabilityPersonPage.openCreateDialog(); await disabilityPersonPage.fillBasicForm(testData); // 滚动到备注管理区域 await disabilityPersonPage.scrollToSection('备注管理'); // 添加备注 const noteContent = `这是一条测试备注_${testData.name}`; await disabilityPersonPage.addNote(noteContent); // 验证备注出现在列表中 const noteList = await disabilityPersonPage.getNoteList(); expect(noteList).toHaveLength(1); expect(noteList[0]).toContain(noteContent); console.debug(' ✓ 备注已添加'); console.debug('✅ 添加简单备注测试通过'); }); test('应该成功添加长文本备注', async ({ disabilityPersonPage }) => { const testData = generateUniqueTestData('长文本备注'); createdTestData.push({ name: testData.name, idCard: testData.idCard }); console.debug('\n========== 添加长文本备注测试 =========='); // 打开对话框并填写基本信息 await disabilityPersonPage.openCreateDialog(); await disabilityPersonPage.fillBasicForm(testData); // 滚动到备注管理区域 await disabilityPersonPage.scrollToSection('备注管理'); // 添加长文本备注 const longNote = `这是一条很长的备注内容_${testData.name}`.repeat(10); await disabilityPersonPage.addNote(longNote); // 验证备注出现在列表中 - 验证完整内容和长度 const noteList = await disabilityPersonPage.getNoteList(); expect(noteList).toHaveLength(1); expect(noteList[0].length).toBe(longNote.length); expect(noteList[0]).toBe(longNote); console.debug(' ✓ 长文本备注已添加'); console.debug('✅ 添加长文本备注测试通过'); }); test('应该成功编辑备注', async ({ disabilityPersonPage }) => { const testData = generateUniqueTestData('编辑备注'); createdTestData.push({ name: testData.name, idCard: testData.idCard }); console.debug('\n========== 编辑备注测试 =========='); // 打开对话框并填写基本信息 await disabilityPersonPage.openCreateDialog(); await disabilityPersonPage.fillBasicForm(testData); // 滚动到备注管理区域 await disabilityPersonPage.scrollToSection('备注管理'); // 添加原始备注 const originalNote = `原始备注_${testData.name}`; await disabilityPersonPage.addNote(originalNote); // 编辑备注 const updatedNote = `更新后的备注_${testData.name}`; await disabilityPersonPage.editNote(0, updatedNote); // 验证更新后的内容 - 确保旧文本完全被替换 const noteList = await disabilityPersonPage.getNoteList(); expect(noteList[0]).toBe(updatedNote); expect(noteList[0]).not.toContain(originalNote); console.debug(' ✓ 备注已编辑'); console.debug('✅ 编辑备注测试通过'); }); test('应该成功删除备注', async ({ disabilityPersonPage }) => { const testData = generateUniqueTestData('删除备注'); createdTestData.push({ name: testData.name, idCard: testData.idCard }); console.debug('\n========== 删除备注测试 =========='); // 打开对话框并填写基本信息 await disabilityPersonPage.openCreateDialog(); await disabilityPersonPage.fillBasicForm(testData); // 滚动到备注管理区域 await disabilityPersonPage.scrollToSection('备注管理'); // 添加备注 const noteContent = `待删除备注_${testData.name}`; await disabilityPersonPage.addNote(noteContent); // 验证备注存在 let noteList = await disabilityPersonPage.getNoteList(); expect(noteList).toHaveLength(1); console.debug(' ✓ 备注已添加'); // 删除备注 await disabilityPersonPage.deleteNote(0); // 验证备注已被删除 noteList = await disabilityPersonPage.getNoteList(); expect(noteList).toHaveLength(0); console.debug(' ✓ 备注已删除'); console.debug('✅ 删除备注测试通过'); }); test('应该支持添加多条备注', async ({ disabilityPersonPage }) => { const testData = generateUniqueTestData('多条备注'); createdTestData.push({ name: testData.name, idCard: testData.idCard }); console.debug('\n========== 添加多条备注测试 =========='); // 打开对话框并填写基本信息 await disabilityPersonPage.openCreateDialog(); await disabilityPersonPage.fillBasicForm(testData); // 滚动到备注管理区域 await disabilityPersonPage.scrollToSection('备注管理'); // 添加多条备注 await disabilityPersonPage.addNote(`备注1_${testData.name}`); await disabilityPersonPage.addNote(`备注2_${testData.name}`); await disabilityPersonPage.addNote(`备注3_${testData.name}`); // 验证所有备注都显示 const noteList = await disabilityPersonPage.getNoteList(); expect(noteList).toHaveLength(3); console.debug(' ✓ 已添加 3 条备注'); console.debug('✅ 添加多条备注测试通过'); }); test('应该支持标记特殊需求', async ({ disabilityPersonPage }) => { const testData = generateUniqueTestData('特殊需求'); createdTestData.push({ name: testData.name, idCard: testData.idCard }); console.debug('\n========== 特殊需求标记测试 =========='); // 打开对话框并填写基本信息 await disabilityPersonPage.openCreateDialog(); await disabilityPersonPage.fillBasicForm(testData); // 滚动到备注管理区域 await disabilityPersonPage.scrollToSection('备注管理'); // 添加带特殊需求标记的备注 const noteContent = `特殊需求备注_${testData.name}`; await disabilityPersonPage.addNote(noteContent, { isSpecialNeeds: true }); // 验证特殊需求开关状态 const isSpecialNeeds = await disabilityPersonPage.getNoteSpecialNeedsStatus(0); expect(isSpecialNeeds).toBe(true); console.debug(' ✓ 特殊需求已标记'); console.debug('✅ 特殊需求标记测试通过'); }); test('应该限制最多添加10条备注', async ({ disabilityPersonPage }) => { const testData = generateUniqueTestData('备注限制'); createdTestData.push({ name: testData.name, idCard: testData.idCard }); console.debug('\n========== 备注数量限制测试 =========='); // 打开对话框并填写基本信息 await disabilityPersonPage.openCreateDialog(); await disabilityPersonPage.fillBasicForm(testData); // 滚动到备注管理区域 await disabilityPersonPage.scrollToSection('备注管理'); // 添加10条备注 for (let i = 0; i < 10; i++) { await disabilityPersonPage.addNote(`备注${i + 1}_${testData.name}`); } // 验证有10条备注 const noteList = await disabilityPersonPage.getNoteList(); expect(noteList).toHaveLength(10); console.debug(' ✓ 已添加 10 条备注'); // 验证添加按钮被禁用 const isDisabled = await disabilityPersonPage.isAddNoteButtonDisabled(); expect(isDisabled).toBe(true); console.debug(' ✓ 添加按钮已禁用(达到最大数量)'); console.debug('✅ 备注数量限制测试通过'); }); test('完整流程:添加多条备注、编辑、删除', async ({ disabilityPersonPage }) => { const testData = generateUniqueTestData('完整流程'); createdTestData.push({ name: testData.name, idCard: testData.idCard }); console.debug('\n========== 备注完整流程测试 =========='); // 打开对话框并填写基本信息 await disabilityPersonPage.openCreateDialog(); await disabilityPersonPage.fillBasicForm(testData); // 滚动到备注管理区域 await disabilityPersonPage.scrollToSection('备注管理'); // 添加多条备注 await disabilityPersonPage.addNote(`第一条备注_${testData.name}`, { isSpecialNeeds: true }); await disabilityPersonPage.addNote(`第二条备注_${testData.name}`); await disabilityPersonPage.addNote(`第三条备注_${testData.name}`); let noteList = await disabilityPersonPage.getNoteList(); expect(noteList).toHaveLength(3); console.debug(' ✓ 已添加 3 条备注'); // 编辑第一条备注 await disabilityPersonPage.editNote(0, `编辑后的第一条备注_${testData.name}`); console.debug(' ✓ 第一条备注已编辑'); // 删除第二条备注 await disabilityPersonPage.deleteNote(1); console.debug(' ✓ 第二条备注已删除'); // 验证最终状态 noteList = await disabilityPersonPage.getNoteList(); expect(noteList).toHaveLength(2); expect(noteList[0]).toContain('编辑后的第一条备注'); expect(noteList[1]).toContain('第三条备注'); console.debug(' ✓ 最终状态验证通过'); console.debug('✅ 备注完整流程测试通过'); }); });