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 = `visit_${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: TIMEOUTS.VERY_LONG }) > 0) { await deleteButton.click({ timeout: TIMEOUTS.DIALOG }); await page.getByRole('button', { name: '确认' }).click({ timeout: TIMEOUTS.DIALOG }).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 today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `电话回访测试内容_${testData.name}`, visitResult: '良好', }); // 验证回访记录出现在列表中 const visitCount = await disabilityPersonPage.getVisitCount(); expect(visitCount).toBe(1); 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 today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '上门回访', visitContent: `上门回访测试内容_${testData.name}`, visitResult: '需要跟进', }); // 验证回访记录出现在列表中 const visitCount = await disabilityPersonPage.getVisitCount(); expect(visitCount).toBe(1); 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 today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '视频回访', visitContent: `视频回访测试内容_${testData.name}`, visitResult: '正常', }); // 验证回访记录出现在列表中 const visitCount = await disabilityPersonPage.getVisitCount(); expect(visitCount).toBe(1); 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 today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `原始内容_${testData.name}`, }); // 编辑回访内容 const updatedContent = `更新后的回访内容_${testData.name}`; await disabilityPersonPage.editVisit(0, { visitContent: updatedContent }); // 验证更新后的内容 - 确保旧文本完全被替换 const visitList = await disabilityPersonPage.getVisitList(); expect(visitList[0].visitContent).toContain('更新后的回访内容'); expect(visitList[0].visitContent).not.toContain('原始内容'); 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 today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `测试内容_${testData.name}`, }); // 编辑回访类型 await disabilityPersonPage.editVisit(0, { visitType: '上门回访' }); // 验证更新后的类型 const visitList = await disabilityPersonPage.getVisitList(); expect(visitList[0].visitType).toBe('上门回访'); 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 today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `测试内容_${testData.name}`, }); // 编辑回访日期为昨天 const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0]; await disabilityPersonPage.editVisit(0, { visitDate: yesterday }); // 验证更新后的日期 const visitList = await disabilityPersonPage.getVisitList(); expect(visitList[0].visitDate).toBe(yesterday); 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 today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `待删除内容_${testData.name}`, }); // 验证回访存在 let visitCount = await disabilityPersonPage.getVisitCount(); expect(visitCount).toBe(1); console.debug(' ✓ 回访记录已添加'); // 删除回访 await disabilityPersonPage.deleteVisit(0); // 验证回访已被删除 visitCount = await disabilityPersonPage.getVisitCount(); expect(visitCount).toBe(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('回访记录管理'); // 添加多条回访 const today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `回访1_${testData.name}`, }); await disabilityPersonPage.addVisit({ visitDate: today, visitType: '上门回访', visitContent: `回访2_${testData.name}`, }); await disabilityPersonPage.addVisit({ visitDate: today, visitType: '视频回访', visitContent: `回访3_${testData.name}`, }); // 验证所有回访都显示 const visitCount = await disabilityPersonPage.getVisitCount(); expect(visitCount).toBe(3); console.debug(' ✓ 已添加 3 条回访记录'); 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条回访记录 const today = new Date().toISOString().split('T')[0]; for (let i = 0; i < 10; i++) { await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `回访${i + 1}_${testData.name}`, }); } // 验证有10条回访 const visitCount = await disabilityPersonPage.getVisitCount(); expect(visitCount).toBe(10); console.debug(' ✓ 已添加 10 条回访记录'); // 验证添加按钮被禁用 const isDisabled = await disabilityPersonPage.isAddVisitButtonDisabled(); 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('回访记录管理'); // 添加两条回访 const today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `第一次回访_${testData.name}`, visitResult: '良好', }); await disabilityPersonPage.addVisit({ visitDate: today, visitType: '上门回访', visitContent: `第二次回访_${testData.name}`, visitResult: '需要跟进', }); // 验证回访列表 const visitList = await disabilityPersonPage.getVisitList(); expect(visitList).toHaveLength(2); expect(visitList[0].visitContent).toContain('第一次回访'); expect(visitList[1].visitContent).toContain('第二次回访'); 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 today = new Date().toISOString().split('T')[0]; const testVisit = { visitDate: today, visitType: '微信回访', visitContent: `完整测试_${testData.name}`, visitResult: '已完成', }; await disabilityPersonPage.addVisit(testVisit); // 验证回访详情 const visitList = await disabilityPersonPage.getVisitList(); expect(visitList).toHaveLength(1); expect(visitList[0].visitType).toBe('微信回访'); expect(visitList[0].visitResult).toBe('已完成'); 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 today = new Date().toISOString().split('T')[0]; const nextWeek = new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `测试内容_${testData.name}`, nextVisitDate: nextWeek, }); // 验证下次回访日期 const visitList = await disabilityPersonPage.getVisitList(); expect(visitList[0].nextVisitDate).toBe(nextWeek); console.debug(' ✓ 下次回访日期已设置'); console.debug('✅ 下次回访日期测试通过'); }); test('应该成功编辑回访结果(状态管理)', async ({ disabilityPersonPage }) => { const testData = generateUniqueTestData('回访状态管理'); createdTestData.push({ name: testData.name, idCard: testData.idCard }); console.debug('\n========== 回访状态管理测试(AC #4) =========='); // 打开对话框并填写基本信息 await disabilityPersonPage.openCreateDialog(); await disabilityPersonPage.fillBasicForm(testData); // 滚动到回访管理区域 await disabilityPersonPage.scrollToSection('回访记录管理'); // 添加回访,初始状态为"需要跟进" const today = new Date().toISOString().split('T')[0]; await disabilityPersonPage.addVisit({ visitDate: today, visitType: '电话回访', visitContent: `测试内容_${testData.name}`, visitResult: '需要跟进', }); // 验证初始状态 const visitListBefore = await disabilityPersonPage.getVisitList(); expect(visitListBefore[0].visitResult).toBe('需要跟进'); console.debug(' ✓ 初始回访结果: 需要跟进'); // 编辑回访结果为"已完成"(标记回访为已完成) await disabilityPersonPage.editVisit(0, { visitResult: '已完成' }); // 验证状态已更新 const visitListAfter = await disabilityPersonPage.getVisitList(); expect(visitListAfter[0].visitResult).toBe('已完成'); console.debug(' ✓ 回访结果已更新为: 已完成'); console.debug('✅ 回访状态管理测试通过(AC #4)'); }); });