worklist-delete.cy.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /**
  2. * 测试文件: Worklist - 删除功能
  3. *
  4. * 测试场景:
  5. * 1. 成功删除未锁定的记录
  6. * 2. 尝试删除锁定的记录(应显示警告)
  7. * 3. 删除API失败的情况(网络错误/服务器错误)
  8. * 4. 取消删除操作
  9. */
  10. import { mockLoginSuccess } from '../../support/mock/handlers/user';
  11. import {
  12. mockFetchTwoWorksWithUnlocked,
  13. mockFetchTwoWorksWithLocked,
  14. mockDeleteStudySuccess,
  15. mockDeleteStudyFailure,
  16. DeleteStudy,
  17. FetchTwoWorksWithUnlocked,
  18. FetchTwoWorksWithLocked,
  19. } from '../../support/mock/handlers/worklist';
  20. import {
  21. mockI18nSuccess,
  22. mockGetLanguageListSuccess,
  23. mockAllRequiredAPIs,
  24. } from '../../support/mock/handlers/i18n';
  25. import { mockGetQuotaSuccess } from '../../support/mock/handlers/quota';
  26. import LoginPage from '../../support/pageObjects/LoginPage';
  27. import MainPage from '../../support/pageObjects/MainPage';
  28. import WorklistPage from '../../support/pageObjects/WorklistPage';
  29. describe('Worklist - 删除功能测试', () => {
  30. const loginPage = new LoginPage();
  31. const mainPage = new MainPage();
  32. const worklistPage = new WorklistPage();
  33. beforeEach(() => {
  34. // Mock多语言资源和必要的API
  35. mockI18nSuccess('zh_CN');
  36. mockGetLanguageListSuccess();
  37. mockAllRequiredAPIs('zh_CN');
  38. // Mock登录成功响应
  39. mockLoginSuccess();
  40. // Mock配额成功
  41. mockGetQuotaSuccess();
  42. // 登录系统
  43. loginPage.visit();
  44. loginPage.login('admin', '123456');
  45. // 等待页面渲染和路由跳转
  46. cy.wait(1500);
  47. // 验证登录成功:登录页面元素不再存在
  48. loginPage.getUsernameInput().should('not.exist');
  49. loginPage.getPasswordInput().should('not.exist');
  50. loginPage.getSubmitButton().should('not.exist');
  51. // ⚠️ 不在这里导航,让每个测试用例自己设置mock并导航
  52. });
  53. it('应该成功删除未锁定的记录', () => {
  54. // 设置Worklist数据mock(未锁定)
  55. mockFetchTwoWorksWithUnlocked();
  56. mockDeleteStudySuccess();
  57. // 导航到工作列表
  58. mainPage.clickWorklistButton();
  59. cy.wait(FetchTwoWorksWithUnlocked);
  60. // 验证初始状态:2条记录
  61. worklistPage.verifyRowCount(2);
  62. // 调试:点击前查看Redux state
  63. cy.window().its('store').invoke('getState').then(state => {
  64. cy.log('Before click - selectedIds:', state.workSelection?.selectedIds || []);
  65. });
  66. // 点击第一行(未锁定)选中
  67. worklistPage.clickRowByIndex(0);
  68. // 等待React更新state
  69. cy.wait(500);
  70. // 调试:点击后查看Redux state
  71. cy.window().its('store').invoke('getState').then(state => {
  72. cy.log('After click - selectedIds:', state.workSelection?.selectedIds || []);
  73. });
  74. worklistPage.verifyRowSelected(0);
  75. // 点击删除按钮
  76. worklistPage.clickDeleteButton();
  77. // 验证确认对话框出现
  78. worklistPage.getDeleteConfirmModal();
  79. cy.contains('确认删除').should('be.visible');
  80. cy.contains('确定要删除选中的 1 个项目吗').should('be.visible');
  81. // 确认删除
  82. worklistPage.confirmDeleteInModal();
  83. // 等待删除API调用
  84. cy.wait(DeleteStudy).then((interception) => {
  85. expect(interception.response?.statusCode).to.eq(200);
  86. expect(interception.response?.body.code).to.eq('0x000000');
  87. });
  88. // 验证删除后只剩1条记录(本地删除,无需等待列表刷新)
  89. worklistPage.verifyRowCount(1);
  90. });
  91. it('尝试删除锁定的记录时应显示警告', () => {
  92. // 设置Worklist数据mock(已锁定)
  93. mockFetchTwoWorksWithLocked();
  94. // 导航到工作列表
  95. mainPage.clickWorklistButton();
  96. cy.wait(FetchTwoWorksWithLocked);
  97. // 验证有2条记录
  98. worklistPage.verifyRowCount(2);
  99. // 点击第一行(已锁定)选中
  100. worklistPage.clickRowByIndex(0);
  101. worklistPage.verifyRowSelected(0);
  102. // 点击删除按钮
  103. worklistPage.clickDeleteButton();
  104. // 验证警告消息:锁定状态不可删除
  105. worklistPage.verifyDeleteWarningMessage('锁定状态不可删除');
  106. // 验证没有弹出确认对话框(因为被提前拦截了)
  107. worklistPage.verifyModalNotExist();
  108. // 验证记录仍然存在
  109. worklistPage.verifyRowCount(2);
  110. });
  111. it('删除API失败时应显示错误提示', () => {
  112. // 设置Worklist数据mock和失败的删除API
  113. mockFetchTwoWorksWithUnlocked();
  114. mockDeleteStudyFailure();
  115. // 导航到工作列表
  116. mainPage.clickWorklistButton();
  117. cy.wait(FetchTwoWorksWithUnlocked);
  118. // 验证有2条记录
  119. worklistPage.verifyRowCount(2);
  120. // 点击第一行选中
  121. worklistPage.clickRowByIndex(0);
  122. worklistPage.verifyRowSelected(0);
  123. // 点击删除按钮
  124. worklistPage.clickDeleteButton();
  125. // 验证确认对话框出现
  126. worklistPage.getDeleteConfirmModal();
  127. // 确认删除
  128. worklistPage.confirmDeleteInModal();
  129. // 等待删除API调用(失败)
  130. cy.wait(DeleteStudy).then((interception) => {
  131. expect(interception.response?.statusCode).to.eq(200);
  132. expect(interception.response?.body.code).to.not.eq('0x000000');
  133. });
  134. // 验证记录仍然存在(因为删除失败)
  135. worklistPage.verifyRowCount(2);
  136. });
  137. it('取消删除操作时记录应保持不变', () => {
  138. // 设置Worklist数据mock
  139. mockFetchTwoWorksWithUnlocked();
  140. // 导航到工作列表
  141. mainPage.clickWorklistButton();
  142. cy.wait(FetchTwoWorksWithUnlocked);
  143. // 验证有2条记录
  144. worklistPage.verifyRowCount(2);
  145. // 点击第一行选中
  146. worklistPage.clickRowByIndex(0);
  147. worklistPage.verifyRowSelected(0);
  148. // 点击删除按钮
  149. worklistPage.clickDeleteButton();
  150. // 验证确认对话框出现
  151. worklistPage.getDeleteConfirmModal();
  152. // 取消删除
  153. worklistPage.cancelDeleteInModal();
  154. // 验证对话框关闭
  155. worklistPage.verifyModalNotExist();
  156. // 验证记录仍然存在
  157. worklistPage.verifyRowCount(2);
  158. });
  159. it('未选中任何记录时点击删除应显示警告', () => {
  160. // 设置Worklist数据mock
  161. mockFetchTwoWorksWithUnlocked();
  162. // 导航到工作列表
  163. mainPage.clickWorklistButton();
  164. cy.wait(FetchTwoWorksWithUnlocked);
  165. // 验证有2条记录
  166. worklistPage.verifyRowCount(2);
  167. // 不选中任何记录,直接点击删除按钮
  168. worklistPage.clickDeleteButton();
  169. // 验证警告消息:请先选择要删除的项目
  170. worklistPage.verifyDeleteWarningMessage('请先选择要删除的项目');
  171. // 验证没有弹出确认对话框
  172. worklistPage.verifyModalNotExist();
  173. // 验证记录仍然存在
  174. worklistPage.verifyRowCount(2);
  175. });
  176. });