import fs from 'node:fs'; import assert from 'node:assert/strict'; import {chromium} from '@playwright/test'; import {login,call} from './role-permissions-live.mjs'; const dir='reports/bridge-content-authoring-20260924',fixture=JSON.parse(fs.readFileSync(dir+'/fixture.json','utf8')); const signed=await login('root'),checks=[]; const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']}); try{const page=await browser.newPage({viewport:{width:1440,height:1000}}); await page.goto('http://127.0.0.1:6180/'); for(const item of fixture.items){ const response=await call('tran/v1/content/projects/'+item.modelProjectId,signed.accessToken);assert.equal(response.status,200); const result=await page.evaluate(async content=>{ const style=document.createElement('style');style.textContent='.authoring-test .training-shell,.authoring-test .training-main,.authoring-test .training-viewport{width:100%!important;height:100%!important;min-height:0!important;min-width:0!important;display:block!important;padding:0!important}.authoring-test .training-shell>:not(.training-main),.authoring-test .training-main>:not(.training-viewport),.authoring-test .training-viewport>:not(canvas){display:none!important}';document.head.append(style); const host=document.createElement('div');host.className='authoring-test';host.style.cssText='position:fixed;inset:0;width:700px;height:500px;z-index:999999';document.body.append(host); const {createProductionPreview}=await import('/src/features/content-production/preview.js'); const viewer=await createProductionPreview(host,content.productionDefinition),checks=[]; try{const actions=viewer.configure(content.productionActions);viewer.overview(); const overview=viewer.inspect(); for(let i=0;iitem.assetRole!=='environment'&&!/terrain|地形/i.test(item.sourceName)); item.position[0]+=0.25; const secondHost=host.cloneNode(false);document.body.append(secondHost); const second=await createProductionPreview(secondHost,changed); let placement; try{const after=second.inspect().sceneObjects.find(o=>o.sceneId===item.sceneId),before=overview.sceneObjects.find(o=>o.sceneId===item.sceneId);placement={sceneId:item.sceneId,deltaX:after.position[0]-before.position[0]};} finally{second.destroy();secondHost.remove();} viewer.resume();return {overview,checks,paused,cancelled,resumed:!viewer.inspect().paused,placement}; }finally{viewer.destroy();host.remove();style.remove();} },response.data.currentVersion.content); assert.ok(result.paused&&result.resumed); assert.equal(result.cancelled,false); assert.ok(Math.abs(result.placement.deltaX-0.25)<1e-6,JSON.stringify(result.placement)); for(const action of result.checks){assert.ok([...action.after.position,...action.after.quaternion,...action.after.projected].every(Number.isFinite),action.id); assert.ok(Math.abs(action.before.projected[0])<0.01&&Math.abs(action.before.projected[1])<0.01,action.id+' focus'); if(action.kind!=='state')assert.notDeepEqual([action.after.position,action.after.quaternion],[action.before.position,action.before.quaternion],action.id+' must move'); } assert.equal(result.checks.length,item.actions);checks.push({task:item.taskCode,...result});console.log(item.taskCode+': '+result.checks.length+' actions'); } fs.writeFileSync(dir+'/actions-result.json',JSON.stringify({pass:true,checks},null,2)); }finally{await browser.close();}