This repository has been archived on 2026-10-14. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
extension/tests/homepage.test.mjs
T

62 lines
2.6 KiB
JavaScript

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);
});