Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

43 rindas
4.5 KiB

  1. import fs from 'node:fs';
  2. import assert from 'node:assert/strict';
  3. import {chromium,expect} from '@playwright/test';
  4. import {login,call} from './role-permissions-live.mjs';
  5. const dir='reports/bridge-content-authoring-20260924',fixture=JSON.parse(fs.readFileSync(dir+'/fixture.json','utf8'));
  6. const signed=await login('root'),checks=[];
  7. const api=async path=>{const r=await call('tran/v1/'+path,signed.accessToken);assert.equal(r.status,200,r.message);return r.data;};
  8. const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
  9. try{
  10. const page=await browser.newPage({viewport:{width:1440,height:1000}});
  11. await page.addInitScript(s=>{sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken);sessionStorage.setItem('unreal-tran:web:refresh-token:v1',s.refreshToken);localStorage.setItem('unreal-tran:web:preferences:v1',JSON.stringify({themeMode:'military'}));},signed);
  12. const ready=()=>expect(page.getByRole('button',{name:'播放动作',exact:true})).toBeEnabled({timeout:120000});
  13. for(const item of fixture.items.slice(1)){
  14. await page.goto('http://127.0.0.1:6180/content/models/'+item.modelProjectId+'/production');await ready();
  15. await page.getByRole('button',{name:'发布并进入场景'}).click();await expect(page).toHaveURL(new RegExp('/scenes/'+item.sceneProjectId+'/production'));await ready();
  16. if(item.taskCode.endsWith('006')){
  17. const x=page.locator('.production-object').nth(1).getByRole('spinbutton').first();const original=await x.inputValue();
  18. await x.fill(String(Number(original)+0.25));await x.press('Tab');await page.getByRole('button',{name:'应用场景预览'}).click();await ready();
  19. await page.getByRole('button',{name:'保存',exact:true}).click();await expect(page.getByText('已保存,可刷新继续编辑')).toBeVisible();
  20. await page.reload();await ready();assert.ok(Math.abs(Number(await x.inputValue())-Number(original)-0.25)<0.001);
  21. await x.fill(original);await x.press('Tab');await page.getByRole('button',{name:'应用场景预览'}).click();await ready();
  22. checks.push({name:'006 场景位置修改保存刷新回读并恢复',pass:true});
  23. }
  24. await page.getByRole('button',{name:'发布并进入编排'}).click();await expect(page).toHaveURL(new RegExp('/training-projects/'+item.trainingProjectId+'/production'));await ready();
  25. await page.getByRole('button',{name:'发布训练内容'}).click();await expect(page.getByText('训练内容已发布;现有仿真仍保持固定版本')).toBeVisible();
  26. const model=await api('content/projects/'+item.modelProjectId),scene=await api('content/projects/'+item.sceneProjectId),training=await api('content/projects/'+item.trainingProjectId);
  27. assert.equal(scene.currentVersion.dependencies[0].targetVersionId,model.project.publishedVersionId);
  28. assert.equal(training.currentVersion.dependencies[0].targetVersionId,scene.project.publishedVersionId);
  29. assert.equal(training.currentVersion.content.steps.flatMap(s=>s.modelActions).length,item.actions);
  30. await page.locator('.production-chain button').nth(3).click();await expect(page.getByRole('button',{name:'跳过讲解',exact:true})).toBeVisible({timeout:120000});
  31. await page.screenshot({path:dir+'/'+item.taskCode+'-simulation.png'});
  32. checks.push({name:item.taskCode+' 模型→场景→编排发布→原虚拟仿真',pass:true});
  33. }
  34. const current=[];
  35. for(const item of fixture.items){
  36. const stages={};for(const [stage,id] of [['model',item.modelProjectId],['scene',item.sceneProjectId],['training',item.trainingProjectId]]){const data=await api('content/projects/'+id);stages[stage]={id,name:data.project.name,versionId:data.project.publishedVersionId,versionCode:data.currentVersion.versionCode,dependencies:data.currentVersion.dependencies};fs.writeFileSync(dir+'/final-'+stage+'-'+item.taskCode+'.json',JSON.stringify(data,null,2));}
  37. current.push({taskCode:item.taskCode,taskId:item.taskId,steps:item.steps,actions:item.actions,...stages});
  38. }
  39. for(const id of [86,87,88,89,116]){const before=JSON.parse(fs.readFileSync(dir+'/before-task-'+id+'.json')),after=await api('teaching/assignments/'+id);delete before.serverNow;delete after.serverNow;assert.deepEqual(after,before);}
  40. checks.push({name:'五个原任务完整快照未变',pass:true});
  41. fs.writeFileSync(dir+'/integration-result.json',JSON.stringify({pass:true,checks,current},null,2));console.log(JSON.stringify({pass:true,checks:checks.length}));
  42. }catch(e){fs.writeFileSync(dir+'/integration-failure.json',JSON.stringify({pass:false,message:e.message,checks},null,2));throw e;}finally{await browser.close();}