From 534961db9bb82a119a0ff5d7a9dc74ef39ef8fe3 Mon Sep 17 00:00:00 2001 From: matcha Date: Sun, 4 Oct 2026 02:46:22 +0000 Subject: [PATCH] Consolidate Persimmons extension --- extension/tests/homepage.test.mjs | 61 +++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 extension/tests/homepage.test.mjs diff --git a/extension/tests/homepage.test.mjs b/extension/tests/homepage.test.mjs new file mode 100644 index 0000000..fa4173c --- /dev/null +++ b/extension/tests/homepage.test.mjs @@ -0,0 +1,61 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFile} from 'node:fs/promises'; + +test('homepage derives one onboarding state and never renders up-to-date copy', async () => { + const nodes = new Map(); + const node = id => { + if (!nodes.has(id)) nodes.set(id,{ + hidden:false,textContent:'',innerHTML:'',open:false, + addEventListener(){},append(){},appendChild(){},replaceChildren(){},style:{} + }); + return nodes.get(id); + }; + globalThis.document={ + hidden:false, + getElementById:node, + createElement:tag=>({ + tagName:tag.toUpperCase(),hidden:false,textContent:'',innerHTML:'',style:{},open:false, + setAttribute(){},append(){},appendChild(){},replaceChildren(){},showModal(){this.open=true},close(){this.open=false}, + addEventListener(){},querySelector(){return {value:'',disabled:false}} + }), + body:{append(){}} + }; + globalThis.window={addEventListener(){}}; + globalThis.setInterval=()=>0; + + let installed={connected:true,initialized:true,unlocked:true,empty:true,version:'0.4.4'}; + let signedIn=true, latest='0.4.4'; + globalThis.chrome={runtime:{sendMessage:(id,message,callback)=>callback(installed),lastError:null}}; + globalThis.fetch=async url=>new Response(JSON.stringify(url==='/api/session'?{owner:'fixture'}:{version:latest}),{ + status:url==='/api/session'&&!signedIn?401:200,headers:{'content-type':'application/json'} + }); + + const source=(await readFile(new URL('../../persimmons/web/app.js',import.meta.url),'utf8')) + .replace('./version.mjs',new URL('../version.mjs',import.meta.url).href); + let sequence=0; + async function render(){ + await import('data:text/javascript,'+encodeURIComponent(source+'\n//'+sequence++)); + await new Promise(resolve=>setImmediate(resolve)); + } + + await render(); + assert.equal(node('extensionState').textContent,'🔓'); + assert.equal(node('updateExtension').hidden,true); + assert.ok(![...nodes.values()].some(n=>n.textContent==='Up to date')); + + installed={connected:true,initialized:true,unlocked:false,version:'0.4.4'}; await render(); + assert.equal(node('extensionState').textContent,'🔒'); + + installed={connected:false,version:'0.4.3'}; await render(); + assert.equal(node('onboardingHelp').textContent,'Open 🍊 and choose Link vault.'); + assert.equal(node('updateExtension').hidden,false); + + signedIn=false; await render(); + assert.equal(node('signInLink').hidden,false); + assert.equal(node('createAccount').hidden,false); + assert.equal(node('updateExtension').hidden,true); + + signedIn=true; installed=null; await render(); + assert.equal(node('getExtension').hidden,false); +});