import{uid,timestamp,resolveSelection,questionsFor,eligibleDocuments,readiness}from'./store.jsx';import{defaultFields}from'./seed.js';exportconstgenerationStages=['Preparing local sample fixtures','Applying the selected test template','Checking sample source traceability','Ready for review'];exportfunctionmakeDemoSuite(state,workspace,templateId){constselection=resolveSelection(state,workspace.baselineId,workspace.crIds);if (selection.issues.length)thrownewError(selection.issues.join(''));if (!readiness(state,workspace).ready)thrownewError('Generation requires an approved baseline and reviewed source-linked requirements.');consttemplate=state.templates.find(t=>t.id===templateId&&t.team===workspace.team&&(t.visibility!=='workspace'||t.workspaceId===workspace.id));if (!template)thrownewError('Choose an accessible team template.');constavailable=newSet(eligibleDocuments(state,workspace).map(d=>d.id));constmap=newMap((selection.baseline?.rules||[]).map(r=>[r.id,r]));selection.diff.forEach(change=>{if (change.op==='REMOVE')map.delete(change.ruleId);elsemap.set(change.ruleId,{id:change.ruleId,title:change.title,text:change.after,source:change.source,changed:true});});(workspace.customRules||[]).forEach(r=>map.set(r.id,r));consttests=[...map.values()].filter(r=>available.has(r.source)).map((r,i)=>({id:`TC-${workspace.team.toUpperCase()}-${String(i+1).padStart(3,'0')}`,title:`Verify ${r.title.toLowerCase()}`,category:r.changed?'Positive':'Regression',requirement:r.id,objective:`Check the selected revision of ${r.title}.`,preconditions:'Use an approved symbolic fixture applicable to this rule.',data:'APPROVED_RULE_FIXTURE',steps:['Prepare the source-backed fixture for this rule.',`Exercise ${r.title.toLowerCase()} within the owning team’s scope.`,'Record the observed result against the selected evidence.'],expected:r.text,priority:'Medium',rationale:'Directly exercises a selected source-backed rule.',sourceIds:[r.source],status:'Generated',notes:'',revision:1}));constgaps=questionsFor(state,workspace).filter(q=>q.status!=='resolved');constresolved=questionsFor(state,workspace).filter(q=>q.status==='resolved'&&available.has(q.answerSourceId||q.sourceId));resolved.forEach((q,i)=>{constsource=q.answerSourceId||q.sourceId;tests.push({id:`TC-${workspace.team.toUpperCase()}-CL-${i+1}`,title:`Verify ${q.title.replace(/\?$/,'').toLowerCase()}`,category:'Dependency',requirement:q.requirement,objective:'Check behavior supplied by reviewed workspace evidence.',preconditions:'Use the fixture described by the reviewed clarification.',data:'REVIEWED_CLARIFICATION_FIXTURE',steps:['Prepare the agreed fixture.','Exercise the approved behavior.','Compare the result to the reviewed answer.'],expected:q.answer,priority:'Medium',rationale:'Covers a previously missing dependency rule.',sourceIds:source&&available.has(source)?[source]:[],answerEvidence:q.sourceReference,status:'Generated',notes:`User-provided evidence, saved by ${q.resolvedBy||q.author||workspace.team}.`,revision:1});});constcustomFields=template.fields.filter(field=>!defaultFields.some(known=>known.toLowerCase()===field.toLowerCase()));tests.forEach(test=>{test.customFields=Object.fromEntries(customFields.map(field=>[field,'']));});return{id:uid('suite'),name:`${workspace.name} · Test suite`,workspaceId:workspace.id,version:workspace.version,baselineId:workspace.baselineId,crIds:[...workspace.crIds],sharedContractIds:[...workspace.sharedContractIds||[]],templateId,templateSnapshot:structuredClone(template),provisional:false,status:'Ready for review',createdAt:timestamp(),gaps:gaps.map(q=>({requirement:q.requirement,title:q.title})),tests,demo:true};}
Top comments (0)
Subscribe
We're a place where coders share, stay up-to-date and grow their careers.
Top comments (0)