You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

52 regels
4.2 KiB

  1. import { test, expect } from '@playwright/test'
  2. import { signIn, freshScene, openEditor, ready, diagnostics, action, save, shot, evidence, closeSession, call } from './scene-editor-closure-helpers'
  3. test.afterEach(async ({page})=>closeSession(page))
  4. const setName=async(page:any,name:string)=>{const input=page.locator('[data-inspector-field="name"]');await input.fill(name);await input.press('Tab')}
  5. test('加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载',async({page},info)=>{
  6. const token=await signIn(page),copy=await freshScene(token,'fox','加载互斥'),id=copy.project.id
  7. const endpoint=`**/api/tran/v1/content/projects/${id}`
  8. await page.route(endpoint,route=>route.fulfill({status:503,contentType:'application/json',body:JSON.stringify({code:503,message:'验收模拟场景加载失败'})}))
  9. await page.goto(`/content/scenes/${id}/edit`)
  10. await expect(page.getByText('场景工程加载失败',{exact:true})).toBeVisible()
  11. await expect(page.locator('.se-shell')).toHaveCount(0)
  12. await shot(page,info,'60-scene-load-failure-retry');await page.unroute(endpoint)
  13. let release!:()=>void;const gate=new Promise<void>(resolve=>release=resolve)
  14. await page.route('**/api/tran/v1/content/projects/*/assets/*/content',async route=>{await gate;await route.continue()})
  15. await page.getByRole('button',{name:'重新加载',exact:true}).click()
  16. await expect(page.locator('.se-shell')).toBeVisible()
  17. await expect.poll(async()=>Boolean((await diagnostics(page))?.pendingLoads)).toBe(true)
  18. for(const name of ['new','open','save','export','verify','publish','preview'])await expect(action(page,name)).toBeDisabled()
  19. await page.getByRole('button',{name:'关闭数字场景编辑',exact:true}).click()
  20. await page.getByRole('button',{name:'关闭标签',exact:true}).click()
  21. await expect(page.locator('.el-message-box')).toHaveCount(0)
  22. await expect(page.locator('.se-shell')).toBeVisible()
  23. await shot(page,info,'61-model-loading-blocks-partial-save')
  24. release();await ready(page);await page.unroute('**/api/tran/v1/content/projects/*/assets/*/content')
  25. expect((await diagnostics(page)).objects.some((o:any)=>o.targetProjectId==='157')).toBe(true)
  26. evidence('loading-retry',{projectId:id,ready:await diagnostics(page)})
  27. })
  28. test('延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突',async({page},info)=>{
  29. const token=await signIn(page),copy=await freshScene(token,'truck','并发保存'),id=copy.project.id
  30. await openEditor(page,id);const truck=(await diagnostics(page)).objects.find((o:any)=>o.targetProjectId==='156')
  31. await page.locator(`#se-tree [data-object-id="${truck.sceneId}"]`).click();await setName(page,'提交中的快照A')
  32. let release!:()=>void;const gate=new Promise<void>(resolve=>release=resolve),submitted:any[]=[]
  33. const endpoint=`**/api/tran/v1/content/projects/${id}`
  34. await page.route(endpoint,async route=>{if(route.request().method()!=='PUT')return route.continue();submitted.push(route.request().postDataJSON());await gate;await route.continue()})
  35. await action(page,'save').click();await expect.poll(()=>submitted.length).toBe(1)
  36. await expect(action(page,'save')).toBeDisabled()
  37. await page.keyboard.press('Control+s');expect(submitted.length).toBe(1)
  38. await setName(page,'提交之后的新修改B')
  39. await expect.poll(()=>page.evaluate(()=>Object.keys(localStorage).some(k=>k.includes('scene-api-recovery')))).toBe(true)
  40. release();await expect.poll(async()=>(await diagnostics(page)).saving).toBe(false)
  41. expect((await diagnostics(page)).dirty).toBe(true);expect(submitted.length).toBe(1)
  42. const first=(await call(`tran/v1/content/projects/${id}`,token)).data
  43. expect(first.currentVersion.content.objects.find((o:any)=>o.sceneId===truck.sceneId).name).toBe('提交中的快照A')
  44. await shot(page,info,'62-new-edits-preserved-during-save');await page.unroute(endpoint);await save(page)
  45. await page.reload();await ready(page)
  46. expect((await diagnostics(page)).objects.find((o:any)=>o.sceneId===truck.sceneId).name).toBe('提交之后的新修改B')
  47. await expect(page.locator('.el-message-box')).toHaveCount(0)
  48. evidence('save-concurrency',{projectId:id,firstVersion:first.project.version,submissionsBeforeRetry:submitted.length,reopened:await diagnostics(page)})
  49. })