import { mockI18nSuccess, mockAllRequiredAPIs } from '../../support/mock/handlers/i18n'; import { mockLoginSuccess, mockLoginFail } from '../../support/mock/handlers/user'; import LoginPage from '../../support/pageObjects/LoginPage'; describe('Login Page - I18n Display Test', () => { const loginPage = new LoginPage(); beforeEach(() => { cy.clearAllSessionStorage(); cy.clearAllLocalStorage(); mockAllRequiredAPIs(); }); describe('中文显示测试', () => { it('应该正确显示中文登录页面', () => { // Mock 中文多语言资源 mockI18nSuccess('zh_CN'); mockAllRequiredAPIs('zh_CN'); // 设置浏览器语言为中文 cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'zh-CN', writable: false }); }); // 访问登录页面 loginPage.visit(); // 等待多语言资源加载完成 cy.wait('@getI18nZH_CNSuccess'); // 验证所有文本元素显示为中文 loginPage.verifyLanguage('zh'); // 验证输入框占位符为中文 loginPage.verifyPlaceholders('zh'); // 验证页面上所有中文文本存在 cy.get('body').should('contain', '用户名'); cy.get('body').should('contain', '密码'); cy.get('body').should('contain', '登录'); cy.get('body').should('contain', '急诊'); }); it('应该显示中文的表单验证消息', () => { mockI18nSuccess('zh_CN'); mockAllRequiredAPIs('zh_CN'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'zh-CN', writable: false }); }); loginPage.visit(); cy.wait('@getI18nZH_CNSuccess'); // 不输入任何内容,直接点击登录按钮 loginPage.getLoginButton().click(); // 验证中文验证消息显示 cy.contains('请输入用户名').should('be.visible'); }); it('应该显示中文的登录成功消息', () => { mockI18nSuccess('zh_CN'); mockAllRequiredAPIs('zh_CN'); mockLoginSuccess(); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'zh-CN', writable: false }); }); loginPage.visit(); cy.wait('@getI18nZH_CNSuccess'); // 执行登录 loginPage.login('admin', '123456'); cy.wait('@loginSuccess'); // 验证中文成功消息 cy.contains('登录成功').should('be.visible', { timeout: 10000 }); }); it('应该显示中文的登录失败消息', () => { mockI18nSuccess('zh_CN'); mockAllRequiredAPIs('zh_CN'); mockLoginFail(); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'zh-CN', writable: false }); }); loginPage.visit(); cy.wait('@getI18nZH_CNSuccess'); // 执行登录 loginPage.login('wronguser', 'wrongpassword'); cy.wait('@loginFail'); // 验证中文失败消息 cy.contains('登录失败').should('be.visible', { timeout: 10000 }); }); }); describe('英文显示测试', () => { it('应该正确显示英文登录页面', () => { // Mock 英文多语言资源 mockI18nSuccess('en_US'); mockAllRequiredAPIs('en_US'); // 设置浏览器语言为英文 cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'en-US', writable: false }); }); // 访问登录页面 loginPage.visit(); // 等待多语言资源加载完成 cy.wait('@getI18nEN_USSuccess'); // 验证所有文本元素显示为英文 loginPage.verifyLanguage('en'); // 验证输入框占位符为英文 loginPage.verifyPlaceholders('en'); // 验证页面上所有英文文本存在 cy.get('body').should('contain', 'Username'); cy.get('body').should('contain', 'Password'); cy.get('body').should('contain', 'Login'); cy.get('body').should('contain', 'Emergency'); }); it('应该显示英文的表单验证消息', () => { mockI18nSuccess('en_US'); mockAllRequiredAPIs('en_US'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'en-US', writable: false }); }); loginPage.visit(); cy.wait('@getI18nEN_USSuccess'); // 不输入任何内容,直接点击登录按钮 loginPage.getLoginButton().click(); // 验证英文验证消息显示 cy.contains('Please enter username').should('be.visible'); }); it('应该显示英文的登录成功消息', () => { mockI18nSuccess('en_US'); mockAllRequiredAPIs('en_US'); mockLoginSuccess(); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'en-US', writable: false }); }); loginPage.visit(); cy.wait('@getI18nEN_USSuccess'); // 执行登录 loginPage.login('admin', '123456'); cy.wait('@loginSuccess'); // 验证英文成功消息 cy.contains('Login successful').should('be.visible', { timeout: 10000 }); }); it('应该显示英文的登录失败消息', () => { mockI18nSuccess('en_US'); mockAllRequiredAPIs('en_US'); mockLoginFail(); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'en-US', writable: false }); }); loginPage.visit(); cy.wait('@getI18nEN_USSuccess'); // 执行登录 loginPage.login('wronguser', 'wrongpassword'); cy.wait('@loginFail'); // 验证英文失败消息 cy.contains('Login failed').should('be.visible', { timeout: 10000 }); }); }); describe('语言切换测试', () => { it('应该能从中文切换到英文', () => { // 首先加载中文 mockI18nSuccess('zh_CN'); mockAllRequiredAPIs('zh_CN'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'zh-CN', writable: false }); }); loginPage.visit(); cy.wait('@getI18nZH_CNSuccess'); // 验证中文显示 loginPage.verifyLanguage('zh'); // 切换到英文 mockI18nSuccess('en_US'); mockAllRequiredAPIs('en_US'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'en-US', writable: false }); }); loginPage.visit(); cy.wait('@getI18nEN_USSuccess'); // 验证英文显示 loginPage.verifyLanguage('en'); }); it('应该能从英文切换到中文', () => { // 首先加载英文 mockI18nSuccess('en_US'); mockAllRequiredAPIs('en_US'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'en-US', writable: false }); }); loginPage.visit(); cy.wait('@getI18nEN_USSuccess'); // 验证英文显示 loginPage.verifyLanguage('en'); // 切换到中文 mockI18nSuccess('zh_CN'); mockAllRequiredAPIs('zh_CN'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'zh-CN', writable: false }); }); loginPage.visit(); cy.wait('@getI18nZH_CNSuccess'); // 验证中文显示 loginPage.verifyLanguage('zh'); }); }); describe('Redux 状态验证', () => { it('中文模式下 Redux 状态应该正确', () => { mockI18nSuccess('zh_CN'); mockAllRequiredAPIs('zh_CN'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'zh-CN', writable: false }); }); loginPage.visit(); cy.wait('@getI18nZH_CNSuccess'); // 验证 Redux 状态 cy.window().its('store').invoke('getState').then((state) => { expect(state.i18n.currentLocale).to.equal('zh_CN'); expect(state.i18n.loading).to.be.false; expect(state.i18n.error).to.be.null; expect(state.i18n.messages).to.have.property('login.username', '用户名'); expect(state.i18n.messages).to.have.property('login.password', '密码'); expect(state.i18n.messages).to.have.property('login.submit', '登录'); expect(state.i18n.messages).to.have.property('login.emergency', '急诊'); }); }); it('英文模式下 Redux 状态应该正确', () => { mockI18nSuccess('en_US'); mockAllRequiredAPIs('en_US'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'en-US', writable: false }); }); loginPage.visit(); cy.wait('@getI18nEN_USSuccess'); // 验证 Redux 状态 cy.window().its('store').invoke('getState').then((state) => { expect(state.i18n.currentLocale).to.equal('en_US'); expect(state.i18n.loading).to.be.false; expect(state.i18n.error).to.be.null; expect(state.i18n.messages).to.have.property('login.username', 'Username'); expect(state.i18n.messages).to.have.property('login.password', 'Password'); expect(state.i18n.messages).to.have.property('login.submit', 'Login'); expect(state.i18n.messages).to.have.property('login.emergency', 'Emergency'); }); }); }); describe('视觉验证(手动查看)', () => { it('[视觉] 中文登录页面完整显示', () => { mockI18nSuccess('zh_CN'); mockAllRequiredAPIs('zh_CN'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'zh-CN', writable: false }); }); loginPage.visit(); cy.wait('@getI18nZH_CNSuccess'); // 等待页面完全加载 loginPage.getUsernameInput().should('be.visible'); loginPage.getPasswordInput().should('be.visible'); loginPage.getLoginButton().should('be.visible'); loginPage.getEmergencyButton().should('be.visible'); // 添加等待时间供手动查看 cy.wait(500); }); it('[视觉] 英文登录页面完整显示', () => { mockI18nSuccess('en_US'); mockAllRequiredAPIs('en_US'); cy.window().then((win) => { Object.defineProperty(win.navigator, 'language', { value: 'en-US', writable: false }); }); loginPage.visit(); cy.wait('@getI18nEN_USSuccess'); // 等待页面完全加载 loginPage.getUsernameInput().should('be.visible'); loginPage.getPasswordInput().should('be.visible'); loginPage.getLoginButton().should('be.visible'); loginPage.getEmergencyButton().should('be.visible'); // 添加等待时间供手动查看 cy.wait(500); }); }); });