import {chromium,expect} from '@playwright/test'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import {login,call} from './role-permissions-live.mjs'; const dir='reports/bridge-model-match-20260914', s=await login('root'),checks=[]; const api=async p=>{const r=await call('tran/v1/'+p,s.accessToken);assert.equal(r.status,200);return r.data;}; const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']}); try { const page=await browser.newPage({viewport:{width:1600,height:1000}}); await page.addInitScript(s=>{sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken);localStorage.setItem('unreal-tran:web:preferences:v1',JSON.stringify({themeMode:'military'}));},s); for(const id of [86,89]) { const task=await api('teaching/assignments/'+id), before=await api('teaching/runs?assignmentId='+id+'&size=100'); await page.goto('http://127.0.0.1:6180/teaching/virtual-training/preview/'+id); await expect(page.locator('[data-role="loading"]')).toHaveClass(/is-hidden/,{timeout:120000});await page.waitForTimeout(1500); const steps=id===86?task.definitionSnapshot.steps:task.definitionSnapshot.steps.slice(0,1); for(let i=0;ir.url().includes('/preview/validate'));await page.locator('[data-role="part-label"]').click();assert.equal((await response).status(),200);} else{await page.locator('[data-role="part-label"]').click();await page.waitForTimeout(1000);} } await expect(page.locator('[data-action="next"]')).toBeEnabled(); if(iJSON.parse(JSON.stringify(value,(key,item)=>key==='serverNow'?undefined:item)); assert.deepEqual(stable((await api('teaching/runs?assignmentId='+id+'&size=100')).records),stable(before.records)); checks.push(`${task.code} 原任务入口通过,原运行与成绩未变化`); } fs.writeFileSync(`${dir}/originals.json`,JSON.stringify({pass:true,checks},null,2)); }finally{await browser.close();}