logout.cy.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { mockLoginSuccess, mockLogoutSuccess } from '../../support/mock/handlers/user';
  2. import { mockI18nSuccess, mockAllRequiredAPIs } from '../../support/mock/handlers/i18n';
  3. import { mockGetQuotaSuccess } from '../../support/mock/handlers/quota';
  4. import { mockGetPatientTypeHuman, mockGetBodyPartHuman } from '../../support/mock/handlers/protocol';
  5. import LoginPage from '../../support/pageObjects/LoginPage';
  6. import MainPage from '../../support/pageObjects/MainPage';
  7. import ExitModalPage from '../../support/pageObjects/ExitModalPage';
  8. describe('User Logout', () => {
  9. const loginPage = new LoginPage();
  10. const mainPage = new MainPage();
  11. const exitModalPage = new ExitModalPage();
  12. beforeEach(() => {
  13. // 清除存储
  14. cy.clearAllSessionStorage();
  15. cy.clearAllLocalStorage();
  16. // Mock 所有必要的 API
  17. mockAllRequiredAPIs(); // 软件信息、日志
  18. mockI18nSuccess('zh'); // 多语言资源
  19. mockGetQuotaSuccess(); // 配额检查
  20. mockGetPatientTypeHuman(); // 患者类型
  21. mockGetBodyPartHuman(); // 身体部位
  22. mockLoginSuccess(); // 登录
  23. // 访问并登录
  24. loginPage.visit();
  25. loginPage.login('admin', '123456');
  26. cy.wait('@loginSuccess');
  27. cy.contains('登录成功').should('be.visible');
  28. });
  29. it('should successfully logout and return to login page', () => {
  30. mockLogoutSuccess();
  31. // 使用 Page Object 点击退出按钮
  32. mainPage.clickExitButton();
  33. // 验证 modal 可见
  34. exitModalPage.shouldBeVisible();
  35. // 点击"注销用户"按钮
  36. exitModalPage.clickLogout();
  37. // 应该显示成功消息
  38. cy.contains('已退出登录').should('be.visible');
  39. // 应该返回登录页面
  40. loginPage.getUsernameInput().should('be.visible');
  41. loginPage.getPasswordInput().should('be.visible');
  42. });
  43. it('should clear user state after logout', () => {
  44. mockLogoutSuccess();
  45. // 使用 Page Object 执行登出
  46. mainPage.clickExitButton();
  47. exitModalPage.shouldBeVisible();
  48. exitModalPage.clickLogout();
  49. // 验证 Redux store 中用户信息已清除
  50. cy.window().its('store').invoke('getState')
  51. .its('userInfo')
  52. .should('deep.equal', {
  53. token: '',
  54. expire: 0,
  55. uid: 0,
  56. name: '',
  57. avatar: ''
  58. });
  59. });
  60. it('should close exit modal when clicking cancel', () => {
  61. // 使用 Page Object 打开退出 modal
  62. mainPage.clickExitButton();
  63. exitModalPage.shouldBeVisible();
  64. // 点击取消按钮
  65. exitModalPage.clickCancel();
  66. // modal 应该关闭
  67. exitModalPage.shouldNotBeVisible();
  68. });
  69. it('should not call backend logout API (placeholder)', () => {
  70. // 由于后端 API 尚未实现,此测试验证不会调用实际的后端接口
  71. // 当前是纯前端状态清除
  72. // 使用 Page Object 执行登出
  73. mainPage.clickExitButton();
  74. exitModalPage.shouldBeVisible();
  75. exitModalPage.clickLogout();
  76. // 验证成功消息
  77. cy.contains('已退出登录').should('be.visible');
  78. // 验证返回登录页
  79. loginPage.getUsernameInput().should('be.visible');
  80. });
  81. });