Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 

37 Zeilen
2.9 KiB

  1. import fs from 'node:fs'
  2. import path from 'node:path'
  3. import {chromium,expect} from '@playwright/test'
  4. import {login,call} from './role-permissions-live.mjs'
  5. const report=path.resolve('reports/guide-formal-20260910'),fixture=JSON.parse(fs.readFileSync('../../.codex-tmp/guide-formal/fixture.json'))
  6. const session=await login('root'),browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']})
  7. const context=await browser.newContext({viewport:{width:1920,height:1080}})
  8. await context.addInitScript(s=>{sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken);sessionStorage.setItem('unreal-tran:web:refresh-token:v1',s.refreshToken)},session)
  9. const page=await context.newPage(),checks=[]
  10. const check=(name,pass,detail='')=>{checks.push({name,pass,detail});console.log(pass?'PASS':'FAIL',name);if(!pass)process.exitCode=1}
  11. try{
  12. await page.goto('http://127.0.0.1:6180/content/ofd')
  13. await expect(page.getByRole('button',{name:'新建指导书',exact:true})).toBeVisible()
  14. const result=await page.evaluate(async id=>{
  15. const {FormalGuideStore}=await import('/src/features/guide-legacy/formalStore.ts')
  16. const store=new FormalGuideStore()
  17. try{
  18. await store.load(id);await store.loadCatalog();const old=store.project.publishedVersionId
  19. if(store.project.status==='PUBLISHED')await store.transitionOFDProject(id,'edit',null)
  20. const state=JSON.parse(JSON.stringify(store.record.state)),first=state.chapters[0].steps[0]
  21. first.image='';first.title='狐狸模型巡检'
  22. const truck=state.resources.find(r=>r.name?.includes('MilkTruck'))
  23. const second={...JSON.parse(JSON.stringify(first)),id:'formal-truck-step',title:'牛奶卡车检查',image:'',modelRef:{...first.modelRef,assetId:truck.id,nodeName:''},mediaBlocks:[]}
  24. state.chapters[0].steps=[first,second]
  25. for(const [step,key] of [[first,'160@463'],[second,'159@209']])step.mediaBlocks=[{id:'scene-'+step.id,kind:'scene',assetId:key,title:step.title+'场景',x:20,y:180,width:170,height:80}]
  26. await store.saveOFDProjectState(id,state)
  27. return {old,published:store.project.publishedVersionId,assets:store.project.assets.length,bindings:Object.keys(store.record.state.sceneBindings||{}),version:store.project.version}
  28. }finally{store.dispose()}
  29. },fixture.id)
  30. check('新修订保持原发布版本可阅读',result.old===result.published)
  31. check('狐狸与卡车场景固定版本已保存',result.bindings.length===2,JSON.stringify(result))
  32. await page.goto(`http://127.0.0.1:6180/content/ofd/${fixture.id}/studio`)
  33. await expect(page.locator('.ofd-view-editor')).toBeVisible({timeout:60000})
  34. await page.screenshot({path:path.join(report,'10-two-scene-resources.png')})
  35. }catch(e){check('正式场景资源闭环',false,e.message);await page.screenshot({path:path.join(report,'failure-scenes.png')})}
  36. finally{fs.writeFileSync(path.join(report,'scenes.json'),JSON.stringify({checks},null,2));await browser.close()}