aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-10-08 16:34:06 -0700
committerAdam Soltys <[email protected]>2026-10-08 16:34:06 -0700
commite35764950b59bde6e36bdfad1ca671eef564a6d1 (patch)
treea72a950e6e8ffd21312b6e2610ee7c73092026bc /tools
parentd3a0af140dabdd6b53c1be0532b37f28254633be (diff)
downloadcoinosv3-e35764950b59bde6e36bdfad1ca671eef564a6d1.tar.gz
coinosv3-e35764950b59bde6e36bdfad1ca671eef564a6d1.zip
Max fills the amount in the unit the field shows: in fiat that's money floored to the cent (so it never parses back above the maximum), not a BTC figure under a CAD label. One ctx.amountField helper for the ark send/LN Max, the gift Max and fixed-amount zap/BOLT 12 fills
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'tools')
-rw-r--r--tools/amount-field-unit-test.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/tools/amount-field-unit-test.js b/tools/amount-field-unit-test.js
new file mode 100644
index 0000000..26c5357
--- /dev/null
+++ b/tools/amount-field-unit-test.js
@@ -0,0 +1,50 @@
+// Max (and fixed-amount invoices) fill the amount field in the unit it is
+// showing: in fiat that is money to the cent, floored so a filled-in maximum
+// never parses back to more sats than were offered — not a BTC figure under a
+// CAD label (2026-10-08: Max on an ark recipient filled 0.00004978 'CAD').
+// Run: bun tools/amount-field-unit-test.js
+import assert from 'node:assert/strict';
+import puppeteer from './puppeteer.js';
+
+const bundle = await Bun.build({ entrypoints: ['src/app.js'], target: 'browser', minify: true,
+ plugins: [{ name: 'amount-field-test', setup(build) {
+ build.onLoad({ filter: /src\/app\.js$/ }, async ({ path }) => ({ loader: 'js', contents: await Bun.file(path).text() + `
+window.amtApp = { ctx, toggleUnit, get unit() { return unit; } };
+` }));
+ build.onLoad({ filter: /src\/video-compress\.js$/ }, () => ({ loader: 'js', contents: 'export async function compressVideo(f) { return f; }' }));
+ } }] });
+assert(bundle.success, bundle.logs.join('\n'));
+const html = `<!doctype html><meta charset="utf-8"><div id="app"></div><script type="module">${await bundle.outputs[0].text()}</script>`;
+const server = Bun.serve({ port: 0, fetch: (req) => new URL(req.url).pathname === '/'
+ ? new Response(html, { headers: { 'Content-Type': 'text/html' } }) : new Response(null, { status: 404 }) });
+const browser = await puppeteer.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox'] });
+try {
+ const page = await browser.newPage(), errors = [];
+ page.on('pageerror', (e) => errors.push(e.message));
+ await page.setRequestInterception(true);
+ page.on('request', (r) => r.url().startsWith(server.url.origin) ? r.continue() : r.abort());
+ await page.evaluateOnNewDocument(() => {
+ localStorage.setItem('btc-wallet-network', 'regtest');
+ localStorage.setItem('btc-wallet-unit', 'fiat');
+ localStorage.setItem('btc-wallet-currency', 'CAD');
+ localStorage.setItem('btc-wallet-rates', JSON.stringify({ CAD: 150000, USD: 110000 }));
+ });
+ await page.goto(server.url.href, { waitUntil: 'domcontentloaded' });
+ await page.waitForFunction(() => window.amtApp);
+ const r = await page.evaluate(() => {
+ const { ctx } = amtApp;
+ const out = { unit: amtApp.unit, fiat: ctx.amountField(62212), back: ctx.parseAmount(ctx.amountField(62212), 'fiat') };
+ while (amtApp.unit !== 'sats') amtApp.toggleUnit();
+ out.sats = ctx.amountField(62212);
+ amtApp.toggleUnit(); out.btc = ctx.amountField(62212);
+ return out;
+ });
+ console.log(r);
+ assert.equal(r.unit, 'fiat');
+ assert.equal(r.fiat, '93.31', '62,212 sats at 150,000 CAD/BTC = 93.318 → floored to 93.31');
+ assert(r.back <= 62212 && r.back > 62200, 'parses back to at most the maximum');
+ assert.equal(r.sats, '62212');
+ assert.equal(r.btc, '0.00062212');
+ assert.deepEqual(errors, []);
+ console.log('✅ amount fills follow the display unit');
+} finally { await browser.close(); server.stop(true); }