import { mockLoginSuccess, mockLogoutSuccess } from '../../support/mock/handlers/user'; import { mockI18nSuccess, mockAllRequiredAPIs } from '../../support/mock/handlers/i18n'; import { mockGetQuotaSuccess } from '../../support/mock/handlers/quota'; import { mockGetPatientTypeHuman, mockGetBodyPartHuman } from '../../support/mock/handlers/protocol'; import LoginPage from '../../support/pageObjects/LoginPage'; import MainPage from '../../support/pageObjects/MainPage'; import ExitModalPage from '../../support/pageObjects/ExitModalPage'; describe('User Logout', () => { const loginPage = new LoginPage(); const mainPage = new MainPage(); const exitModalPage = new ExitModalPage(); beforeEach(() => { // 清除存储 cy.clearAllSessionStorage(); cy.clearAllLocalStorage(); // Mock 所有必要的 API mockAllRequiredAPIs(); // 软件信息、日志 mockI18nSuccess('zh'); // 多语言资源 mockGetQuotaSuccess(); // 配额检查 mockGetPatientTypeHuman(); // 患者类型 mockGetBodyPartHuman(); // 身体部位 mockLoginSuccess(); // 登录 // 访问并登录 loginPage.visit(); loginPage.login('admin', '123456'); cy.wait('@loginSuccess'); cy.contains('登录成功').should('be.visible'); }); it('should successfully logout and return to login page', () => { mockLogoutSuccess(); // 使用 Page Object 点击退出按钮 mainPage.clickExitButton(); // 验证 modal 可见 exitModalPage.shouldBeVisible(); // 点击"注销用户"按钮 exitModalPage.clickLogout(); // 应该显示成功消息 cy.contains('已退出登录').should('be.visible'); // 应该返回登录页面 loginPage.getUsernameInput().should('be.visible'); loginPage.getPasswordInput().should('be.visible'); }); it('should clear user state after logout', () => { mockLogoutSuccess(); // 使用 Page Object 执行登出 mainPage.clickExitButton(); exitModalPage.shouldBeVisible(); exitModalPage.clickLogout(); // 验证 Redux store 中用户信息已清除 cy.window().its('store').invoke('getState') .its('userInfo') .should('deep.equal', { token: '', expire: 0, uid: 0, name: '', avatar: '' }); }); it('should close exit modal when clicking cancel', () => { // 使用 Page Object 打开退出 modal mainPage.clickExitButton(); exitModalPage.shouldBeVisible(); // 点击取消按钮 exitModalPage.clickCancel(); // modal 应该关闭 exitModalPage.shouldNotBeVisible(); }); it('should not call backend logout API (placeholder)', () => { // 由于后端 API 尚未实现,此测试验证不会调用实际的后端接口 // 当前是纯前端状态清除 // 使用 Page Object 执行登出 mainPage.clickExitButton(); exitModalPage.shouldBeVisible(); exitModalPage.clickLogout(); // 验证成功消息 cy.contains('已退出登录').should('be.visible'); // 验证返回登录页 loginPage.getUsernameInput().should('be.visible'); }); });