import fs from 'node:fs' import path from 'node:path' import {chromium,expect} from '@playwright/test' import {login,call} from './role-permissions-live.mjs' const report=path.resolve('reports/guide-formal-20260910'),fixture=JSON.parse(fs.readFileSync('../../.codex-tmp/guide-formal/fixture.json')) const session=await login('root'),browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']}) const context=await browser.newContext({viewport:{width:1920,height:1080}}) 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) const page=await context.newPage(),checks=[] const check=(name,pass,detail='')=>{checks.push({name,pass,detail});console.log(pass?'PASS':'FAIL',name);if(!pass)process.exitCode=1} try{ await page.goto('http://127.0.0.1:6180/content/ofd') await expect(page.getByRole('button',{name:'新建指导书',exact:true})).toBeVisible() const result=await page.evaluate(async id=>{ const {FormalGuideStore}=await import('/src/features/guide-legacy/formalStore.ts') const store=new FormalGuideStore() try{ await store.load(id);await store.loadCatalog();const old=store.project.publishedVersionId if(store.project.status==='PUBLISHED')await store.transitionOFDProject(id,'edit',null) const state=JSON.parse(JSON.stringify(store.record.state)),first=state.chapters[0].steps[0] first.image='';first.title='狐狸模型巡检' const truck=state.resources.find(r=>r.name?.includes('MilkTruck')) const second={...JSON.parse(JSON.stringify(first)),id:'formal-truck-step',title:'牛奶卡车检查',image:'',modelRef:{...first.modelRef,assetId:truck.id,nodeName:''},mediaBlocks:[]} state.chapters[0].steps=[first,second] 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}] await store.saveOFDProjectState(id,state) return {old,published:store.project.publishedVersionId,assets:store.project.assets.length,bindings:Object.keys(store.record.state.sceneBindings||{}),version:store.project.version} }finally{store.dispose()} },fixture.id) check('新修订保持原发布版本可阅读',result.old===result.published) check('狐狸与卡车场景固定版本已保存',result.bindings.length===2,JSON.stringify(result)) await page.goto(`http://127.0.0.1:6180/content/ofd/${fixture.id}/studio`) await expect(page.locator('.ofd-view-editor')).toBeVisible({timeout:60000}) await page.screenshot({path:path.join(report,'10-two-scene-resources.png')}) }catch(e){check('正式场景资源闭环',false,e.message);await page.screenshot({path:path.join(report,'failure-scenes.png')})} finally{fs.writeFileSync(path.join(report,'scenes.json'),JSON.stringify({checks},null,2));await browser.close()}