選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

20 行
1.9 KiB

  1. // Read-only API contract checks; these are synthetic observations, not learner
  2. // operations. No progress, score or teaching run is created.
  3. import fs from 'node:fs';
  4. import assert from 'node:assert/strict';
  5. import {login,call} from './role-permissions-live.mjs';
  6. const session=await login('root'),r=await call('tran/v1/teaching/assignments/86',session.accessToken);assert.equal(r.status,200);
  7. const task=r.data,step=task.definitionSnapshot.steps[0],ops=step.action.mechanism.steps,code=step.stepCode||step.id;
  8. const observation={schema:'teaching-virtual-observation/1',stepCode:code,kind:'target-click',targetId:ops.at(-1).targetId,completed:true,
  9. selectedToolId:'',selectedToolIds:step.toolRequirements?.map(r=>r.anyOf[0])||(step.toolId?[step.toolId]:[]),
  10. safetyKeys:(step.safetyRules||[]).map((s,i)=>s.key||s.code||s.id||'SAFETY-'+(i+1)),measurementNote:'',
  11. operations:ops.map(op=>({targetId:op.targetId,kind:op.kind,completed:true}))};
  12. const body={version:task.version,steps:[{completedStepCode:code,actionCode:step.actionCode||'COMPLETE_'+code.toUpperCase(),observation}]};
  13. const valid=await call('tran/v1/teaching/assignments/86/preview/validate',session.accessToken,body,'POST');
  14. assert.equal(valid.status,200,'historical task accepts complete observations');
  15. body.steps[0].observation.operations=[];
  16. const invalid=await call('tran/v1/teaching/assignments/86/preview/validate',session.accessToken,body,'POST');
  17. const dir='reports/bridge-tools-authoring-20260924';fs.mkdirSync(dir,{recursive:true});
  18. fs.writeFileSync(dir+'/api-contract.json',JSON.stringify({pass:valid.status===200&&invalid.status===400,validStatus:valid.status,missingOperationsStatus:invalid.status,syntheticReadOnlyContractTest:true},null,2));
  19. assert.equal(invalid.status,400,'incomplete observations rejected by running service');console.log('Live operation contract: complete accepted, missing operations rejected');