123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- /**
- * 测试文件: 进入检查 - Worklist双击进入处理(已曝光)
- * 场景: 从Worklist双击已曝光任务,系统应进入处理界面
- *
- * 路径分析:
- * - POM: LoginPage, MainPage, WorklistPage
- * - Mock:
- * - mockLoginSuccess() - 登录成功
- * - mockFetchTwoWorks() - 获取工作列表
- * - mockGetStudyDetailsExposed() - 获取已曝光检查详情
- * - 规格:
- * ✓ 登录成功
- * ✓ 导航到工作列表
- * ✓ 工作列表显示至少2条记录
- * ✓ 双击第一条已曝光记录
- * ✓ 系统加载任务详细信息(已曝光状态)
- * ✓ 进入处理界面(businessFlow: 'process')
- * ✓ 验证Redux状态正确
- * ✓ 验证bodyPositionList已转换
- *
- * @see docs/测试/进入检查功能测试方案.md - 场景2
- */
- import { mockLoginSuccess } from '../../support/mock/handlers/user';
- import { mockFetchTwoWorks } from '../../support/mock/handlers/worklist';
- import { mockGetStudyDetailsExposed } from '../../support/mock/handlers/study';
- import LoginPage from '../../support/pageObjects/LoginPage';
- import MainPage from '../../support/pageObjects/MainPage';
- import WorklistPage from '../../support/pageObjects/WorklistPage';
- describe('进入检查:Worklist双击进入处理(已曝光)', () => {
- const loginPage = new LoginPage();
- const mainPage = new MainPage();
- const worklistPage = new WorklistPage();
- beforeEach(() => {
- // 设置所有必要的Mock
- mockLoginSuccess();
- mockFetchTwoWorks();
- // 使用第一条记录的StudyID,返回已曝光数据
- mockGetStudyDetailsExposed('250929163817805');
- });
- it('应该通过双击Worklist已曝光条目进入处理界面', () => {
- /**
- * Given: 用户已登录
- * 步骤1(前置): 打开登录界面,完成登录
- */
- loginPage.visit();
- loginPage.getUsernameInput().should('be.visible');
- loginPage.login('admin', '123456');
-
- // 等待登录成功
- cy.wait('@loginSuccess');
- cy.contains('登录成功').should('be.visible', { timeout: 10000 });
- /**
- * When: 导航到Worklist
- * 步骤1: 打开 Worklist
- */
- mainPage.clickPatientManagementButton();
- mainPage.clickWorklistButton();
- /**
- * Then: 系统加载Worklist任务信息
- * 步骤2(前置): 验证工作列表加载
- */
- cy.wait('@fetchTwoWorks').then((interception) => {
- expect(interception.response?.statusCode).to.eq(200);
- });
- // 验证工作列表显示(至少2条记录)
- worklistPage.getTable().should('be.visible');
- worklistPage.getTable().find('tr').should('have.length.at.least', 2);
- /**
- * When: 用户双击第一条已曝光任务
- * 步骤2: 双击任务条目
- */
- worklistPage.findTableAndDoubleClickFirstRow();
- /**
- * Then: 系统加载任务详细信息(已曝光状态)
- * 步骤3: 验证API调用和返回数据
- */
- cy.wait('@getStudyDetailsExposed').then((interception) => {
- expect(interception.response?.statusCode).to.eq(200);
-
- // 验证返回的数据包含已曝光的检查信息
- const studyData = interception.response?.body.data;
- expect(studyData).to.have.property('study_id');
- expect(studyData).to.have.property('series');
- expect(studyData.series).to.be.an('array');
-
- // 验证所有images的expose_status为'Exposed'
- studyData.series.forEach((series: any) => {
- series.images.forEach((image: any) => {
- expect(image.expose_status).to.eq('Exposed');
- // 已曝光的图像应该有文件路径
- expect(image.image_file_path).to.not.be.empty;
- });
- });
- });
- /**
- * Then: 验证Redux状态 - examWorksCache
- * 步骤4: 验证任务数据已缓存
- */
- cy.window()
- .its('store')
- .invoke('getState')
- .its('examWorksCache')
- .its('works')
- .should('have.length', 1)
- .its(0)
- .should('have.property', 'StudyID', '250929163817805');
- /**
- * Then: 验证Redux状态 - businessFlow
- * 步骤5: 验证进入处理流程(process模式)
- */
- cy.window()
- .its('store')
- .invoke('getState')
- .its('businessFlow')
- .its('currentFlow')
- .should('eq', 'process');
- /**
- * Then: 验证Redux状态 - bodyPositionList
- * 步骤6: 验证体位列表已正确转换
- */
- cy.window()
- .its('store')
- .invoke('getState')
- .its('bodyPositionList')
- .its('positions')
- .should('have.length.greaterThan', 0);
- });
- it('应该在Redux中正确保存已曝光任务的Views数据', () => {
- /**
- * 这个测试用例专注于验证已曝光数据的正确性
- */
- loginPage.visit();
- loginPage.login('admin', '123456');
- cy.wait('@loginSuccess');
- mainPage.clickPatientManagementButton();
- mainPage.clickWorklistButton();
- cy.wait('@fetchTwoWorks');
- worklistPage.findTableAndDoubleClickFirstRow();
- cy.wait('@getStudyDetailsExposed');
- /**
- * 验证Views数组包含已曝光数据
- */
- cy.window()
- .its('store')
- .invoke('getState')
- .its('examWorksCache')
- .its('works')
- .its(0)
- .its('Views')
- .should('be.an', 'array')
- .should('have.length.greaterThan', 0)
- .then((views: any[]) => {
- // 验证每个View都是已曝光状态
- views.forEach((view) => {
- expect(view).to.have.property('view_id');
- expect(view).to.have.property('view_description');
- expect(view).to.have.property('expose_status', 'Exposed');
- expect(view).to.have.property('study_id');
- expect(view).to.have.property('series_instance_uid');
- // 已曝光的View应该有图像文件路径
- expect(view).to.have.property('image_file_path');
- expect(view.image_file_path).to.not.be.empty;
- });
- });
- });
- it('应该正确判断所有体位已曝光并进入处理流程', () => {
- /**
- * 这个测试用例验证曝光状态判断逻辑
- */
- loginPage.visit();
- loginPage.login('admin', '123456');
- cy.wait('@loginSuccess');
- mainPage.clickPatientManagementButton();
- mainPage.clickWorklistButton();
- cy.wait('@fetchTwoWorks');
- worklistPage.findTableAndDoubleClickFirstRow();
- cy.wait('@getStudyDetailsExposed');
- /**
- * 验证所有体位都是已曝光状态
- */
- cy.window()
- .its('store')
- .invoke('getState')
- .its('examWorksCache')
- .its('works')
- .its(0)
- .its('Views')
- .then((views: any[]) => {
- // 确认Views不为空
- expect(views.length).to.be.greaterThan(0);
-
- // 确认所有Views都是已曝光
- const allExposed = views.every(
- (view) => view.expose_status === 'Exposed'
- );
- expect(allExposed).to.be.true;
- });
- /**
- * 验证系统正确进入处理流程
- */
- cy.window()
- .its('store')
- .invoke('getState')
- .its('businessFlow')
- .its('currentFlow')
- .should('eq', 'process');
- });
- });
|