|
- import fs from 'node:fs';
- import assert from 'node:assert/strict';
- import {login,call} from './role-permissions-live.mjs';
- import {scripts} from '../../unreal_tran_web/src/features/virtual-training-scripts/definition.js';
- const dir='reports/bridge-006-hose-connections-20260921';fs.mkdirSync(dir,{recursive:true});
- const signed=await login('root');
- const api=async(path,data,method)=>{const r=await call('tran/v1/'+path,signed.accessToken,data,method);assert.equal(r.status,200,path+': '+r.message);return r.data;};
- const backup=(name,value)=>{const file=dir+'/'+name+'.json';if(!fs.existsSync(file))fs.writeFileSync(file,JSON.stringify(value,null,2));};
- let task=await api('teaching/assignments/87'),project=await api('content/projects/'+task.contentProjectId);
- assert.equal(task.code,'TASK-VIRTUAL-006');assert.equal(task.definitionSnapshot.runtime.scriptVersion,'4');
- backup('before-task',task);backup('before-project',project);
- const previous=JSON.parse(fs.readFileSync(dir+'/before-task.json'));
- const expected=scripts.find(s=>s.code===task.code).definition.steps[1];
- if(JSON.stringify(task.definitionSnapshot.steps[1].action)!==JSON.stringify(expected.action)){
- const runs=await api('teaching/runs?assignmentId=87&size=100');
- assert.equal(runs.total,0,'Only migrate this unused task; do not interrupt active learners');
- const content=structuredClone(project.currentVersion.content);
- content.steps[1]={...content.steps[1],action:expected.action,targetName:expected.targetName,guidance:expected.guidance};
- content.scenario.operableParts=[...new Set(content.steps.flatMap(step=>step.action.mechanism.steps.map(op=>op.targetId)))];
- if(JSON.stringify(project.currentVersion.content.steps[1].action)!==JSON.stringify(expected.action)){
- assert.equal(project.currentVersion.id,project.project.publishedVersionId,'Do not overwrite an unrelated unpublished draft');
- project=await api('content/projects/'+project.project.id,{...project.project,content,assets:project.currentVersion.assets,dependencies:project.currentVersion.dependencies,version:project.project.version,changeSummary:'006软管连接修正:两车防尘盖与供回油软管四个端头分开操作,保留讲解、准备项与评分规则'},'PUT');
- }
- if(project.project.publishedVersionId!==project.currentVersion.id)project=await api('content/projects/'+project.project.id+'/publish',{version:project.project.version});
- if(task.status==='PUBLISHED')task=await api('teaching/assignments/87/withdraw',{version:task.version,reason:'修正软管连接操作,保留原任务及旧内容版本'});
- assert.ok(['DRAFT','WITHDRAWN'].includes(task.status));
- task=await api('teaching/assignments/87',{...task,contentVersionId:project.project.publishedVersionId,version:task.version},'PUT');
- task=await api('teaching/assignments/87/publish',{version:task.version});
- }
- assert.equal(task.status,'PUBLISHED');assert.deepEqual(task.definitionSnapshot.steps[1].action,expected.action);
- for(let i=0;i<7;i++){
- if(i!==1)assert.deepEqual(task.definitionSnapshot.steps[i],previous.definitionSnapshot.steps[i]);
- else for(const key of ['audio','assessment','stepCode','actionCode','instruction'])assert.deepEqual(task.definitionSnapshot.steps[i][key],previous.definitionSnapshot.steps[i][key]);
- }
- assert.deepEqual(task.members,previous.members);
- fs.writeFileSync(dir+'/after-task.json',JSON.stringify(task,null,2));
- fs.writeFileSync(dir+'/migration.json',JSON.stringify({pass:true,id:task.id,oldContentVersion:previous.contentVersionId,newContentVersion:task.contentVersionId,operations:6,runCount:task.runCount},null,2));
- console.log('006 published content version',task.contentVersionId);
|