// Local component fixtures only. Start loopback Vite on32915; never use a live node URL. const fs=require('node:fs');const path=require('node:path'); const repo=path.resolve(__dirname,'../..'); const fixtureDir=path.join(repo,'neode-ui/.qualification');const fixturePath=path.join(fixtureDir,'native-payment-fixture.js'); const {chromium,expect}=require(path.join(repo,'neode-ui/node_modules/@playwright/test')); const origin='http://127.0.0.1:32915'; const boot=String.raw` import {createApp,h,reactive,nextTick} from 'vue'; import {createPinia} from 'pinia'; import {createRouter,createMemoryHistory} from 'vue-router'; import Rental from '/src/components/RentalPurchaseConsent.vue'; import Signer from '/src/components/NostrSignConsent.vue'; import PeerFiles from '/src/views/PeerFiles.vue'; import {rpcClient} from '/src/api/rpc-client.ts'; import '/src/style.css'; window.fixtureCalls=[]; rpcClient.call=async ({method})=>{window.fixtureCalls.push(method);if(method==='content.purchase-pending')return {attempts:[]};if(method==='wallet.ecash-balance')return {cashu_sats:100,fedimint_sats:0,ark_sats:0};return {items:[]}}; rpcClient.federationListNodes=async()=>({nodes:[]}); rpcClient.payLightningInvoice=async()=>{throw Error('No fixture payment is permitted')}; const quote={network:'testnet',mint_url:'https://original-mint-with-long-name.example.test/cashu',wallet_debit_sats:10,gross_token_sats:9,seller_net_sats:8,operation_id:'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',envelope_sha256:'b'.repeat(64),expires_at:2000000000}; window.layout=reactive({kind:'rental',phase:'confirm',error:'',signing:false}); const offer={title:'A long film title with a story about independent creators',terms:{nodeDid:'did:key:fixture',contentId:'registered_fixture',sha256:'a'.repeat(64),priceSats:8,viewingSeconds:3600}}; const rental=createApp({render(){return h('div',{style:'position:fixed;inset:24px 0 0'},[ !window.layout.signing&&h(Rental,{request:offer,quote,phase:window.layout.phase,error:window.layout.error,onCancel:()=>window.layout.cancelled=true}), h(Signer,{show:window.layout.signing,appName:'Fixture IndeeHub',method:'signEvent',phase:'review',content:'Fixture signature; no RPC',onDeny:()=>window.layout.signing=false})])}}).mount('#rental'); const router=createRouter({history:createMemoryHistory(),routes:[]}); let peerApp=null,vm=null; window.showFixture=async(kind,phase,error='')=>{ document.querySelector('#rental').style.display=kind==='rental'?'block':'none';document.querySelector('#peer').style.display=kind==='peer'?'block':'none'; window.layout.phase=phase;window.layout.error=error;window.layout.signing=phase==='signer'; if(vm)vm.closePayModal(); if(kind!=='peer'&&peerApp){peerApp.unmount();peerApp=null;vm=null} if(kind==='peer'){ if(!peerApp){peerApp=createApp(PeerFiles,{peerId:'fixture.onion'}).use(createPinia()).use(router);const peer=peerApp.mount('#peer');vm=peer.$.setupState;window.peerVm=vm;} vm.openPayModal({id:'fixture-file',filename:'A meaningful independent documentary.mp4',mime_type:'video/mp4',size_bytes:1024,access:{paid:{price_sats:8,accepted:['ecash']}}}); vm.payMode='ecash-confirm';vm.ecashPlan={cashu:100,fedimint:0,ark:0,total:100,chosen:'cashu'};vm.cashuQuote=quote;vm.cashuRecoveryRequired=true;vm.purchaseError=error;vm.ecashPreparing=phase==='paying'; } await nextTick(); }; await window.showFixture('rental','confirm');window.fixtureReady=true; `; fs.mkdirSync(fixtureDir,{recursive:true});fs.writeFileSync(fixturePath,boot); (async()=>{const browser=await chromium.launch({headless:true});try{for(const width of [320,390,1440]){const context=await browser.newContext({viewport:{width,height:width===320?568:844},reducedMotion:'reduce'});let blocked=0;const errors=[];await context.routeWebSocket('**/*',socket=>socket.close()); await context.route('**/*',r=>{const u=new URL(r.request().url());if(u.origin!==origin||u.pathname==='/rpc/v1'){blocked++;return r.abort()}return r.continue()}); await context.route(origin+'/native-payment-fixture',r=>r.fulfill({contentType:'text/html',body:'