25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

47 satır
4.2 KiB

  1. import fs from 'node:fs';
  2. import path from 'node:path';
  3. import assert from 'node:assert/strict';
  4. import {chromium,expect} from '@playwright/test';
  5. import {login,call} from './role-permissions-live.mjs';
  6. const dir='reports/bridge-introduction-20260918',signed=await login('root');
  7. const api=async(endpoint,body,method)=>{const r=await call('tran/v1/'+endpoint,signed.accessToken,body,method);assert.equal(r.status,200,endpoint+': '+r.message);return r.data;};
  8. const original=await api('content/projects/458');
  9. let fixture=await api('content/projects/458/copy',{version:original.project.version,code:'INTRO-UPLOAD-'+Date.now(),name:'讲解上传验收临时工程'}),pass=false;
  10. const id=fixture.project.id;
  11. const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
  12. const page=await browser.newPage({viewport:{width:1366,height:768}});
  13. await page.addInitScript(s=>{sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken);sessionStorage.setItem('unreal-tran:web:refresh-token:v1',s.refreshToken);},signed);
  14. try{
  15. await page.goto('http://127.0.0.1:6180/content/training-projects/'+id+'/legacy');
  16. await expect(page.locator('[data-action="save"]')).toBeVisible({timeout:120000});
  17. await page.getByRole('button',{name:'背景与前置讲解',exact:true}).click();
  18. const dialog=page.getByRole('dialog',{name:'背景与前置讲解'});
  19. await dialog.locator('input[type="file"]').setInputFiles('../unreal_tran_web/public/models/bridge-training/bridge-pump-switch-v2.jpg');
  20. await expect(dialog.locator('button').filter({hasText:'上传背景图'})).not.toHaveClass(/is-loading/,{timeout:60000});
  21. await dialog.getByRole('button',{name:/讲解1 ·/}).click();
  22. await dialog.getByText('视频',{exact:true}).click();
  23. const videos='../unreal_tran_web/public/legacy/virtual-training/videos/narration/bridge-pump-switch/v2/instructor-1-v2';
  24. const file=fs.readdirSync(videos).find(f=>f.endsWith('.mp4'));assert.ok(file);
  25. await dialog.locator('input[type="file"]').setInputFiles(path.join(videos,file));
  26. await expect(dialog.locator('button').filter({hasText:'上传讲解视频'})).not.toHaveClass(/is-loading/,{timeout:60000});
  27. await dialog.getByRole('button',{name:'应用到编排',exact:true}).click();
  28. const saved=page.waitForResponse(r=>r.url().includes('/content/projects/'+id)&&r.request().method()==='PUT');
  29. await page.locator('[data-action="save"]').click();assert.equal((await saved).status(),200);
  30. fixture=await api('content/projects/'+id);const intro=fixture.currentVersion.content.introduction;
  31. assert.ok(intro.background.imageAssetCode.startsWith('INTRO-'));assert.ok(intro.lectures[0].videoAssetCode.startsWith('INTRO-'));
  32. assert.equal(intro.lectures[0].format,'video');
  33. for(const [code,type]of [[intro.background.imageAssetCode,'IMAGE'],[intro.lectures[0].videoAssetCode,'VIDEO']]){const asset=fixture.currentVersion.assets.find(a=>a.code===code);assert.equal(asset.type,type);assert.equal(asset.status,'READY');}
  34. fixture=await api('content/projects/'+id+'/publish',{version:fixture.project.version});assert.equal(fixture.project.status,'PUBLISHED');
  35. await page.reload();await expect(page.locator('[data-action="save"]')).toBeVisible({timeout:120000});await page.getByRole('button',{name:'背景与前置讲解',exact:true}).click();
  36. await dialog.getByRole('button',{name:/讲解1 ·/}).click();await expect(dialog.locator('button').filter({hasText:'上传讲解视频'})).toBeVisible();
  37. await page.screenshot({path:dir+'/authoring-uploaded-video.png'});pass=true;
  38. }catch(error){await page.screenshot({path:dir+'/upload-failure.png'});throw error;}
  39. finally{
  40. await browser.close();fixture=await api('content/projects/'+id);
  41. if(fixture.project.status==='PUBLISHED')fixture=await api('content/projects/'+id+'/review',{version:fixture.project.version,action:'REVOKE',comment:'讲解上传验收结束,清理临时工程'});
  42. await api('content/projects/'+id+'?version='+fixture.project.version,undefined,'DELETE');
  43. const deleted=await call('tran/v1/content/projects/'+id,signed.accessToken);assert.equal(deleted.status,404);
  44. fs.writeFileSync(dir+'/upload-result.json',JSON.stringify({pass,projectId:id,uploadedImage:true,uploadedVideo:true,published:pass,softDeleted:true},null,2));
  45. }
  46. console.log('UPLOAD/PUBLISH/CLEANUP PASS',id);