Cover theme persistence and live chain explorer flow

This commit is contained in:
matcha committed 2026-10-05 00:57:00 +00:00
1 parent c6d3af5dfd
commit 83a19b51ff
1 file changed
+29 -2
+29 -2
View File
@@ -1,15 +1,18 @@
import { test, expect } from '@playwright/test'; import { test, expect } from '@playwright/test';
test('create → mine → review/sign → owned inscription → block/transaction → reload/load', async ({page}) => { test('create → mine → mempool → inscription → block/transaction → reload/load', async ({page}) => {
const errors=[], remote=[]; const errors=[], remote=[];
page.on('pageerror',e=>errors.push(e.message)); page.on('pageerror',e=>errors.push(e.message));
page.on('request',r=>{ if(!r.url().startsWith('http://127.0.0.1:4178')) remote.push(r.url()); }); page.on('request',r=>{ if(!r.url().startsWith('http://127.0.0.1:4178')) remote.push(r.url()); });
await page.goto('/'); await page.goto('/');
await expect(page.getByRole('button',{name:'Mine a block'})).toBeDisabled(); await expect(page.getByRole('button',{name:'Mine a block'})).toBeDisabled();
await expect(page.locator('#mempool-list')).toContainText('Mempool empty');
await page.getByRole('button',{name:'Create test wallet'}).click(); await page.getByRole('button',{name:'Create test wallet'}).click();
await expect(page.locator('#address')).toHaveValue(/^bcrt1p/); await expect(page.locator('#address')).toHaveValue(/^bcrt1p/);
await page.getByRole('button',{name:'Mine a block'}).click(); await page.getByRole('button',{name:'Mine a block'}).click();
await expect(page.locator('#balance')).toHaveText('50.00000000'); await expect(page.locator('#balance')).toHaveText('50.00000000');
await expect(page.locator('#blocks .block-card')).toHaveCount(1);
await expect(page.locator('#blocks .block-card').first()).toContainText('HEIGHT 1');
const payload='<script>window.unwanted=true</script> Hello 🌱'; const payload='<script>window.unwanted=true</script> Hello 🌱';
await page.getByLabel('What will you put on your chain?').fill(payload); await page.getByLabel('What will you put on your chain?').fill(payload);
await page.getByRole('button',{name:'Review inscription'}).click(); await page.getByRole('button',{name:'Review inscription'}).click();
@@ -17,22 +20,34 @@ test('create → mine → review/sign → owned inscription → block/transactio
await expect(page.locator('#pending')).toHaveText('0'); await expect(page.locator('#pending')).toHaveText('0');
await page.getByRole('button',{name:'Sign & inscribe'}).click(); await page.getByRole('button',{name:'Sign & inscribe'}).click();
await expect(page.locator('#pending')).toHaveText('2'); await expect(page.locator('#pending')).toHaveText('2');
await expect(page.locator('#mempool-list .mempool-card')).toHaveCount(2);
await expect(page.locator('#mempool-list')).toContainText('INSCRIPTION COMMIT');
await expect(page.locator('#mempool-list')).toContainText('INSCRIPTION REVEAL');
await expect(page.locator('.collectible pre')).toHaveText(payload); await expect(page.locator('.collectible pre')).toHaveText(payload);
await expect(page.locator('.collectible .tag')).toContainText('PENDING'); await expect(page.locator('.collectible .tag')).toContainText('PENDING');
await expect(page.locator('#balance')).toHaveText('49.99999000'); await expect(page.locator('#balance')).toHaveText('49.99999000');
await page.locator('#mempool-list .mempool-card').last().click();
await expect(page.locator('#inspector')).toContainText('Pending in mempool');
await page.reload(); await page.reload();
await expect(page.locator('.collectible pre')).toHaveText(payload); await expect(page.locator('.collectible pre')).toHaveText(payload);
await expect(page.locator('#pending')).toHaveText('2'); await expect(page.locator('#pending')).toHaveText('2');
await expect(page.locator('#mempool-list .mempool-card')).toHaveCount(2);
await page.getByRole('button',{name:'Mine a block'}).click(); await page.getByRole('button',{name:'Mine a block'}).click();
await expect(page.locator('#mempool-list')).toContainText('Mempool empty');
await expect(page.locator('#blocks .block-card')).toHaveCount(2);
await expect(page.locator('#blocks .block-card').first()).toContainText('HEIGHT 2');
await expect(page.locator('.collectible .tag')).toHaveText('CONFIRMED · BLOCK 2'); await expect(page.locator('.collectible .tag')).toHaveText('CONFIRMED · BLOCK 2');
await page.getByRole('link',{name:'View reveal transaction'}).click(); await page.getByRole('link',{name:'View reveal transaction'}).click();
await expect(page.locator('#inspector')).toContainText('1 confirmation(s)'); await expect(page.locator('#inspector')).toContainText('1 confirmation(s)');
await expect(page.locator('#inspector')).toContainText('Raw Bitcoin transaction'); await expect(page.locator('#inspector')).toContainText('Raw Bitcoin transaction');
await expect(page.locator('#inspector')).toContainText('INSCRIPTION REVEAL');
await page.getByRole('link',{name:'Inspect commit transaction'}).click(); await page.getByRole('link',{name:'Inspect commit transaction'}).click();
await expect(page.locator('#inspector')).toContainText('4,999,998,000 sats'); await expect(page.locator('#inspector')).toContainText('4,999,998,000 sats');
await expect(page.locator('#inspector')).toContainText('INSCRIPTION COMMIT');
await page.getByRole('link',{name:'View block 2'}).click(); await page.getByRole('link',{name:'View block 2'}).click();
await expect(page.locator('#inspector h2')).toHaveText('Block 2'); await expect(page.locator('#inspector h2')).toHaveText('Block 2');
await expect(page.locator('#inspector a')).toHaveCount(3); await expect(page.locator('#inspector')).toContainText('Transactions');
await expect(page.locator('#inspector a')).toHaveCount(4);
await page.getByRole('link',{name:/^Inscription /}).click(); await page.getByRole('link',{name:/^Inscription /}).click();
await expect(page.locator('#inspector')).toContainText('Inscription detail'); await expect(page.locator('#inspector')).toContainText('Inscription detail');
const [download] = await Promise.all([page.waitForEvent('download'),page.getByRole('button',{name:'Save complete lab'}).click()]); const [download] = await Promise.all([page.waitForEvent('download'),page.getByRole('button',{name:'Save complete lab'}).click()]);
@@ -51,6 +66,18 @@ test('create → mine → review/sign → owned inscription → block/transactio
await page.screenshot({path:`test-results/${test.info().project.name}-complete.png`,fullPage:true}); await page.screenshot({path:`test-results/${test.info().project.name}-complete.png`,fullPage:true});
}); });
test('theme toggle persists explicit light/dark preference', async ({page}) => {
await page.emulateMedia({colorScheme:'dark'});
await page.goto('/');
await expect(page.locator('html')).toHaveAttribute('data-theme','dark');
await expect(page.getByRole('button',{name:'Switch to light mode'})).toBeVisible();
await page.getByRole('button',{name:'Switch to light mode'}).click();
await expect(page.locator('html')).toHaveAttribute('data-theme','light');
await page.reload();
await expect(page.locator('html')).toHaveAttribute('data-theme','light');
await expect(page.getByRole('button',{name:'Switch to dark mode'})).toBeVisible();
});
test('wallet backup reload and rejected oversized or invalid input',async({page})=>{ test('wallet backup reload and rejected oversized or invalid input',async({page})=>{
await page.goto('/'); await page.getByRole('button',{name:'Create test wallet'}).click(); await page.goto('/'); await page.getByRole('button',{name:'Create test wallet'}).click();
await expect(page.locator('#address')).toHaveValue(/^bcrt1p/); await expect(page.locator('#address')).toHaveValue(/^bcrt1p/);