disability-person-visit.spec.ts 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. import { test, expect } from '../../utils/test-setup';
  2. import { readFileSync } from 'fs';
  3. import { join, dirname } from 'path';
  4. import { fileURLToPath } from 'url';
  5. const __filename = fileURLToPath(import.meta.url);
  6. const __dirname = dirname(__filename);
  7. const testUsers = JSON.parse(readFileSync(join(__dirname, '../../fixtures/test-users.json'), 'utf-8'));
  8. // 超时配置
  9. const TIMEOUTS = {
  10. SHORT: 300,
  11. MEDIUM: 500,
  12. LONG: 1000,
  13. VERY_SHORT: 200,
  14. } as const;
  15. /**
  16. * 生成唯一的测试数据
  17. */
  18. function generateUniqueTestData(suffix: string) {
  19. const randomPart = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
  20. const timestamp = Date.now();
  21. return {
  22. name: `回访${suffix}_${timestamp}_${randomPart}`,
  23. gender: randomPart % 2 === 0 ? '男' : '女',
  24. idCard: `42010119900101${String(randomPart % 10000).padStart(4, '0')}`,
  25. disabilityId: `511001199001${String(randomPart % 10000).padStart(4, '0')}`,
  26. disabilityType: ['视力残疾', '听力残疾', '言语残疾', '肢体残疾', '智力残疾', '精神残疾'][randomPart % 6],
  27. disabilityLevel: ['一级', '二级', '三级', '四级'][randomPart % 4],
  28. phone: `138${String(randomPart % 100000000).padStart(8, '0')}`,
  29. idAddress: `湖北省武汉市测试街道${randomPart % 100}号`,
  30. province: '湖北省',
  31. city: '武汉市'
  32. };
  33. }
  34. test.describe('残疾人管理 - 回访记录管理功能', () => {
  35. // 测试级别的时间戳,用于生成唯一数据
  36. const TEST_TIMESTAMP = Date.now();
  37. const TEST_PREFIX = `visit_${TEST_TIMESTAMP}`;
  38. // 测试级别的数据存储,避免可变全局状态
  39. let createdTestData: Array<{ name: string; idCard: string }> = [];
  40. test.beforeEach(async ({ adminLoginPage, disabilityPersonPage }) => {
  41. // 每次测试前重置数据存储
  42. createdTestData = [];
  43. // 以管理员身份登录后台
  44. await adminLoginPage.goto();
  45. await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
  46. await adminLoginPage.expectLoginSuccess();
  47. await disabilityPersonPage.goto();
  48. });
  49. test.afterEach(async ({ disabilityPersonPage, page }) => {
  50. // 清理测试数据(增加超时保护以避免 afterEach 超过 60 秒)
  51. for (const data of createdTestData) {
  52. try {
  53. await disabilityPersonPage.goto();
  54. await disabilityPersonPage.searchByName(data.name);
  55. const deleteButton = page.getByRole('button', { name: '删除' }).first();
  56. if (await deleteButton.count() > 0) {
  57. await deleteButton.click();
  58. await page.getByRole('button', { name: '确认' }).click().catch(() => {});
  59. await page.waitForTimeout(TIMEOUTS.SHORT);
  60. }
  61. } catch (error) {
  62. console.debug(` ⚠ 清理数据失败: ${data.name}`, error);
  63. }
  64. }
  65. createdTestData.length = 0;
  66. });
  67. test('应该成功创建电话回访记录', async ({ disabilityPersonPage }) => {
  68. const testData = generateUniqueTestData('电话回访');
  69. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  70. console.debug('\n========== 电话回访记录测试 ==========');
  71. // 打开对话框并填写基本信息
  72. await disabilityPersonPage.openCreateDialog();
  73. await disabilityPersonPage.fillBasicForm(testData);
  74. // 滚动到回访管理区域
  75. await disabilityPersonPage.scrollToSection('回访记录管理');
  76. // 添加电话回访
  77. const today = new Date().toISOString().split('T')[0];
  78. await disabilityPersonPage.addVisit({
  79. visitDate: today,
  80. visitType: '电话回访',
  81. visitContent: `电话回访测试内容_${testData.name}`,
  82. visitResult: '良好',
  83. });
  84. // 验证回访记录出现在列表中
  85. const visitCount = await disabilityPersonPage.getVisitCount();
  86. expect(visitCount).toBe(1);
  87. console.debug(' ✓ 电话回访记录已添加');
  88. console.debug('✅ 电话回访记录测试通过');
  89. });
  90. test('应该成功创建上门回访记录', async ({ disabilityPersonPage }) => {
  91. const testData = generateUniqueTestData('上门回访');
  92. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  93. console.debug('\n========== 上门回访记录测试 ==========');
  94. // 打开对话框并填写基本信息
  95. await disabilityPersonPage.openCreateDialog();
  96. await disabilityPersonPage.fillBasicForm(testData);
  97. // 滚动到回访管理区域
  98. await disabilityPersonPage.scrollToSection('回访记录管理');
  99. // 添加上门回访
  100. const today = new Date().toISOString().split('T')[0];
  101. await disabilityPersonPage.addVisit({
  102. visitDate: today,
  103. visitType: '上门回访',
  104. visitContent: `上门回访测试内容_${testData.name}`,
  105. visitResult: '需要跟进',
  106. });
  107. // 验证回访记录出现在列表中
  108. const visitCount = await disabilityPersonPage.getVisitCount();
  109. expect(visitCount).toBe(1);
  110. console.debug(' ✓ 上门回访记录已添加');
  111. console.debug('✅ 上门回访记录测试通过');
  112. });
  113. test('应该成功创建视频回访记录', async ({ disabilityPersonPage }) => {
  114. const testData = generateUniqueTestData('视频回访');
  115. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  116. console.debug('\n========== 视频回访记录测试 ==========');
  117. // 打开对话框并填写基本信息
  118. await disabilityPersonPage.openCreateDialog();
  119. await disabilityPersonPage.fillBasicForm(testData);
  120. // 滚动到回访管理区域
  121. await disabilityPersonPage.scrollToSection('回访记录管理');
  122. // 添加视频回访
  123. const today = new Date().toISOString().split('T')[0];
  124. await disabilityPersonPage.addVisit({
  125. visitDate: today,
  126. visitType: '视频回访',
  127. visitContent: `视频回访测试内容_${testData.name}`,
  128. visitResult: '正常',
  129. });
  130. // 验证回访记录出现在列表中
  131. const visitCount = await disabilityPersonPage.getVisitCount();
  132. expect(visitCount).toBe(1);
  133. console.debug(' ✓ 视频回访记录已添加');
  134. console.debug('✅ 视频回访记录测试通过');
  135. });
  136. test('应该成功编辑回访记录内容', async ({ disabilityPersonPage }) => {
  137. const testData = generateUniqueTestData('编辑回访内容');
  138. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  139. console.debug('\n========== 编辑回访记录内容测试 ==========');
  140. // 打开对话框并填写基本信息
  141. await disabilityPersonPage.openCreateDialog();
  142. await disabilityPersonPage.fillBasicForm(testData);
  143. // 滚动到回访管理区域
  144. await disabilityPersonPage.scrollToSection('回访记录管理');
  145. // 添加原始回访
  146. const today = new Date().toISOString().split('T')[0];
  147. await disabilityPersonPage.addVisit({
  148. visitDate: today,
  149. visitType: '电话回访',
  150. visitContent: `原始内容_${testData.name}`,
  151. });
  152. // 编辑回访内容
  153. const updatedContent = `更新后的回访内容_${testData.name}`;
  154. await disabilityPersonPage.editVisit(0, { visitContent: updatedContent });
  155. // 验证更新后的内容 - 确保旧文本完全被替换
  156. const visitList = await disabilityPersonPage.getVisitList();
  157. expect(visitList[0].visitContent).toContain('更新后的回访内容');
  158. expect(visitList[0].visitContent).not.toContain('原始内容');
  159. console.debug(' ✓ 回访内容已编辑');
  160. console.debug('✅ 编辑回访记录内容测试通过');
  161. });
  162. test('应该成功编辑回访类型', async ({ disabilityPersonPage }) => {
  163. const testData = generateUniqueTestData('编辑回访类型');
  164. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  165. console.debug('\n========== 编辑回访类型测试 ==========');
  166. // 打开对话框并填写基本信息
  167. await disabilityPersonPage.openCreateDialog();
  168. await disabilityPersonPage.fillBasicForm(testData);
  169. // 滚动到回访管理区域
  170. await disabilityPersonPage.scrollToSection('回访记录管理');
  171. // 添加原始回访
  172. const today = new Date().toISOString().split('T')[0];
  173. await disabilityPersonPage.addVisit({
  174. visitDate: today,
  175. visitType: '电话回访',
  176. visitContent: `测试内容_${testData.name}`,
  177. });
  178. // 编辑回访类型
  179. await disabilityPersonPage.editVisit(0, { visitType: '上门回访' });
  180. // 验证更新后的类型
  181. const visitList = await disabilityPersonPage.getVisitList();
  182. expect(visitList[0].visitType).toBe('上门回访');
  183. console.debug(' ✓ 回访类型已编辑');
  184. console.debug('✅ 编辑回访类型测试通过');
  185. });
  186. test('应该成功编辑回访日期', async ({ disabilityPersonPage }) => {
  187. const testData = generateUniqueTestData('编辑回访日期');
  188. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  189. console.debug('\n========== 编辑回访日期测试 ==========');
  190. // 打开对话框并填写基本信息
  191. await disabilityPersonPage.openCreateDialog();
  192. await disabilityPersonPage.fillBasicForm(testData);
  193. // 滚动到回访管理区域
  194. await disabilityPersonPage.scrollToSection('回访记录管理');
  195. // 添加原始回访
  196. const today = new Date().toISOString().split('T')[0];
  197. await disabilityPersonPage.addVisit({
  198. visitDate: today,
  199. visitType: '电话回访',
  200. visitContent: `测试内容_${testData.name}`,
  201. });
  202. // 编辑回访日期为昨天
  203. const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];
  204. await disabilityPersonPage.editVisit(0, { visitDate: yesterday });
  205. // 验证更新后的日期
  206. const visitList = await disabilityPersonPage.getVisitList();
  207. expect(visitList[0].visitDate).toBe(yesterday);
  208. console.debug(' ✓ 回访日期已编辑');
  209. console.debug('✅ 编辑回访日期测试通过');
  210. });
  211. test('应该成功删除回访记录', async ({ disabilityPersonPage }) => {
  212. const testData = generateUniqueTestData('删除回访');
  213. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  214. console.debug('\n========== 删除回访记录测试 ==========');
  215. // 打开对话框并填写基本信息
  216. await disabilityPersonPage.openCreateDialog();
  217. await disabilityPersonPage.fillBasicForm(testData);
  218. // 滚动到回访管理区域
  219. await disabilityPersonPage.scrollToSection('回访记录管理');
  220. // 添加回访
  221. const today = new Date().toISOString().split('T')[0];
  222. await disabilityPersonPage.addVisit({
  223. visitDate: today,
  224. visitType: '电话回访',
  225. visitContent: `待删除内容_${testData.name}`,
  226. });
  227. // 验证回访存在
  228. let visitCount = await disabilityPersonPage.getVisitCount();
  229. expect(visitCount).toBe(1);
  230. console.debug(' ✓ 回访记录已添加');
  231. // 删除回访
  232. await disabilityPersonPage.deleteVisit(0);
  233. // 验证回访已被删除
  234. visitCount = await disabilityPersonPage.getVisitCount();
  235. expect(visitCount).toBe(0);
  236. console.debug(' ✓ 回访记录已删除');
  237. console.debug('✅ 删除回访记录测试通过');
  238. });
  239. test('应该支持添加多条回访记录', async ({ disabilityPersonPage }) => {
  240. const testData = generateUniqueTestData('多条回访');
  241. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  242. console.debug('\n========== 添加多条回访记录测试 ==========');
  243. // 打开对话框并填写基本信息
  244. await disabilityPersonPage.openCreateDialog();
  245. await disabilityPersonPage.fillBasicForm(testData);
  246. // 滚动到回访管理区域
  247. await disabilityPersonPage.scrollToSection('回访记录管理');
  248. // 添加多条回访
  249. const today = new Date().toISOString().split('T')[0];
  250. await disabilityPersonPage.addVisit({
  251. visitDate: today,
  252. visitType: '电话回访',
  253. visitContent: `回访1_${testData.name}`,
  254. });
  255. await disabilityPersonPage.addVisit({
  256. visitDate: today,
  257. visitType: '上门回访',
  258. visitContent: `回访2_${testData.name}`,
  259. });
  260. await disabilityPersonPage.addVisit({
  261. visitDate: today,
  262. visitType: '视频回访',
  263. visitContent: `回访3_${testData.name}`,
  264. });
  265. // 验证所有回访都显示
  266. const visitCount = await disabilityPersonPage.getVisitCount();
  267. expect(visitCount).toBe(3);
  268. console.debug(' ✓ 已添加 3 条回访记录');
  269. console.debug('✅ 添加多条回访记录测试通过');
  270. });
  271. test('应该限制最多添加10条回访记录', async ({ disabilityPersonPage }) => {
  272. const testData = generateUniqueTestData('回访限制');
  273. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  274. console.debug('\n========== 回访记录数量限制测试 ==========');
  275. // 打开对话框并填写基本信息
  276. await disabilityPersonPage.openCreateDialog();
  277. await disabilityPersonPage.fillBasicForm(testData);
  278. // 滚动到回访管理区域
  279. await disabilityPersonPage.scrollToSection('回访记录管理');
  280. // 添加10条回访记录
  281. const today = new Date().toISOString().split('T')[0];
  282. for (let i = 0; i < 10; i++) {
  283. await disabilityPersonPage.addVisit({
  284. visitDate: today,
  285. visitType: '电话回访',
  286. visitContent: `回访${i + 1}_${testData.name}`,
  287. });
  288. }
  289. // 验证有10条回访
  290. const visitCount = await disabilityPersonPage.getVisitCount();
  291. expect(visitCount).toBe(10);
  292. console.debug(' ✓ 已添加 10 条回访记录');
  293. // 验证添加按钮被禁用
  294. const isDisabled = await disabilityPersonPage.isAddVisitButtonDisabled();
  295. expect(isDisabled).toBe(true);
  296. console.debug(' ✓ 添加按钮已禁用(达到最大数量)');
  297. console.debug('✅ 回访记录数量限制测试通过');
  298. });
  299. test('应该正确显示回访记录历史', async ({ disabilityPersonPage }) => {
  300. const testData = generateUniqueTestData('回访历史');
  301. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  302. console.debug('\n========== 回访记录历史测试 ==========');
  303. // 打开对话框并填写基本信息
  304. await disabilityPersonPage.openCreateDialog();
  305. await disabilityPersonPage.fillBasicForm(testData);
  306. // 滚动到回访管理区域
  307. await disabilityPersonPage.scrollToSection('回访记录管理');
  308. // 添加两条回访
  309. const today = new Date().toISOString().split('T')[0];
  310. await disabilityPersonPage.addVisit({
  311. visitDate: today,
  312. visitType: '电话回访',
  313. visitContent: `第一次回访_${testData.name}`,
  314. visitResult: '良好',
  315. });
  316. await disabilityPersonPage.addVisit({
  317. visitDate: today,
  318. visitType: '上门回访',
  319. visitContent: `第二次回访_${testData.name}`,
  320. visitResult: '需要跟进',
  321. });
  322. // 验证回访列表
  323. const visitList = await disabilityPersonPage.getVisitList();
  324. expect(visitList).toHaveLength(2);
  325. expect(visitList[0].visitContent).toContain('第一次回访');
  326. expect(visitList[1].visitContent).toContain('第二次回访');
  327. console.debug(' ✓ 回访记录历史正确显示');
  328. console.debug('✅ 回访记录历史测试通过');
  329. });
  330. test('应该正确获取回访记录详情', async ({ disabilityPersonPage }) => {
  331. const testData = generateUniqueTestData('回访详情');
  332. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  333. console.debug('\n========== 回访记录详情测试 ==========');
  334. // 打开对话框并填写基本信息
  335. await disabilityPersonPage.openCreateDialog();
  336. await disabilityPersonPage.fillBasicForm(testData);
  337. // 滚动到回访管理区域
  338. await disabilityPersonPage.scrollToSection('回访记录管理');
  339. // 添加完整回访
  340. const today = new Date().toISOString().split('T')[0];
  341. const testVisit = {
  342. visitDate: today,
  343. visitType: '微信回访',
  344. visitContent: `完整测试_${testData.name}`,
  345. visitResult: '已完成',
  346. };
  347. await disabilityPersonPage.addVisit(testVisit);
  348. // 验证回访详情
  349. const visitList = await disabilityPersonPage.getVisitList();
  350. expect(visitList).toHaveLength(1);
  351. expect(visitList[0].visitType).toBe('微信回访');
  352. expect(visitList[0].visitResult).toBe('已完成');
  353. console.debug(' ✓ 回访记录详情正确');
  354. console.debug('✅ 回访记录详情测试通过');
  355. });
  356. test('应该支持设置下次回访日期', async ({ disabilityPersonPage }) => {
  357. const testData = generateUniqueTestData('下次回访');
  358. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  359. console.debug('\n========== 下次回访日期测试 ==========');
  360. // 打开对话框并填写基本信息
  361. await disabilityPersonPage.openCreateDialog();
  362. await disabilityPersonPage.fillBasicForm(testData);
  363. // 滚动到回访管理区域
  364. await disabilityPersonPage.scrollToSection('回访记录管理');
  365. // 添加带下次回访日期的回访
  366. const today = new Date().toISOString().split('T')[0];
  367. const nextWeek = new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0];
  368. await disabilityPersonPage.addVisit({
  369. visitDate: today,
  370. visitType: '电话回访',
  371. visitContent: `测试内容_${testData.name}`,
  372. nextVisitDate: nextWeek,
  373. });
  374. // 验证下次回访日期
  375. const visitList = await disabilityPersonPage.getVisitList();
  376. expect(visitList[0].nextVisitDate).toBe(nextWeek);
  377. console.debug(' ✓ 下次回访日期已设置');
  378. console.debug('✅ 下次回访日期测试通过');
  379. });
  380. test('应该成功编辑回访结果(状态管理)', async ({ disabilityPersonPage }) => {
  381. const testData = generateUniqueTestData('回访状态管理');
  382. createdTestData.push({ name: testData.name, idCard: testData.idCard });
  383. console.debug('\n========== 回访状态管理测试(AC #4) ==========');
  384. // 打开对话框并填写基本信息
  385. await disabilityPersonPage.openCreateDialog();
  386. await disabilityPersonPage.fillBasicForm(testData);
  387. // 滚动到回访管理区域
  388. await disabilityPersonPage.scrollToSection('回访记录管理');
  389. // 添加回访,初始状态为"需要跟进"
  390. const today = new Date().toISOString().split('T')[0];
  391. await disabilityPersonPage.addVisit({
  392. visitDate: today,
  393. visitType: '电话回访',
  394. visitContent: `测试内容_${testData.name}`,
  395. visitResult: '需要跟进',
  396. });
  397. // 验证初始状态
  398. const visitListBefore = await disabilityPersonPage.getVisitList();
  399. expect(visitListBefore[0].visitResult).toBe('需要跟进');
  400. console.debug(' ✓ 初始回访结果: 需要跟进');
  401. // 编辑回访结果为"已完成"(标记回访为已完成)
  402. await disabilityPersonPage.editVisit(0, { visitResult: '已完成' });
  403. // 验证状态已更新
  404. const visitListAfter = await disabilityPersonPage.getVisitList();
  405. expect(visitListAfter[0].visitResult).toBe('已完成');
  406. console.debug(' ✓ 回访结果已更新为: 已完成');
  407. console.debug('✅ 回访状态管理测试通过(AC #4)');
  408. });
  409. });