const assert=require('node:assert/strict'); const fs=require('node:fs'); const vm=require('node:vm'); const source=fs.readFileSync('app/modules/sag/templates/detail_v4.html','utf8'); const start=source.indexOf(' async function saveSelectedSubscriptionChange()'); const end=source.indexOf(' function openAgreementChangeComposer()',start); const nodes={agreementChangeReason:{value:''},agreementEffectiveDate:{value:'2026-11-01'},agreementSaveChangeBtn:{disabled:false}}; const fields={'.subscription-change-select':{checked:true},'.sub-change-product':{value:'Drift'},'.sub-change-interval':{value:'monthly'},'.sub-change-schedule':{value:'fixed_day'},'.sub-change-day':{value:'15'},'.sub-change-status':{value:'active'}}; const card={dataset:{subscriptionId:'12'},querySelector:key=>fields[key]}; let calls=[],messages=[],loads=0,failSubmit=false; const ctx={document:{getElementById:id=>nodes[id],querySelectorAll:()=>[card]},subscriptionCaseId:79,collectAgreementChangeLines:()=>[{description:'Drift',quantity:1,unit_price:1200}],showCaseFeedback:(...args)=>messages.push(args),loadSubscriptionForCase:async()=>{loads++;},fetch:async(url,options)=>{calls.push({url,options});return {ok:!(failSubmit&&url.endsWith('/save')),json:async()=>url.endsWith('/save')?{detail:'Prøv igen'}:{id:5}};}}; vm.createContext(ctx);vm.runInContext(source.slice(start,end),ctx); (async()=>{ await ctx.saveSelectedSubscriptionChange(); assert.equal(calls.length,2); assert(calls[1].url.endsWith('/5/save')); const body=JSON.parse(calls[0].options.body); assert.equal(body.proposals[0].subscription_id,12); assert.equal(body.proposals[0].changes.line_items[0].unit_price,1200); assert.equal(body.reason,'Ændring af abonnement'); assert.equal(loads,1); assert.equal(messages.at(-1)[1],'success'); assert.equal(nodes.agreementSaveChangeBtn.disabled,false); failSubmit=true; await ctx.saveSelectedSubscriptionChange(); assert.equal(loads,1); assert(messages.at(-1)[0].includes('kunne ikke gennemføres')); assert.equal(nodes.agreementSaveChangeBtn.disabled,false); console.log('Simple subscription change OK: one save applies without approval, failure preserves draft, no redirect'); })().catch(error=>{console.error(error);process.exitCode=1;});