const fs = require('node:fs'); const path = require('node:path'); const assert = require('node:assert/strict'); const { chromium } = require(process.env.PLAYWRIGHT_MODULE || 'playwright'); // Read-only public navigation and login of the documented local demo account. // Receipts never include cookies, request bodies or credentials. (async () => { const base = 'http://127.0.0.1:8000'; const directory = path.resolve(__dirname, '../outputs/local-startup-20261019'); fs.mkdirSync(directory, { recursive: true }); const browser = await chromium.launch({ channel: 'chrome', headless: true }); const errors = []; const failures = []; const checks = []; try { const page = await browser.newPage({ viewport: { width: 1366, height: 900 } }); page.on('pageerror', error => errors.push(error.message)); page.on('response', response => { if (response.url().startsWith(base) && response.status() >= 500) { failures.push({ path: new URL(response.url()).pathname, status: response.status() }); } }); for (const route of ['/', '/oportunidades', '/sectores/agronegocio', '/login', '/register']) { const response = await page.goto(base + route, { waitUntil: 'networkidle', timeout: 90000 }); assert.equal(response.status(), 200, route); await page.locator('#app').waitFor(); assert.ok((await page.locator('body').innerText()).trim().length > 100, route); checks.push({ path: route, status: response.status(), rendered: true }); if (route === '/') await page.screenshot({ path: path.join(directory, 'home.png'), fullPage: true }); } await page.goto(base + '/login', { waitUntil: 'networkidle' }); await page.locator('input[name=email]').fill('test@example.com'); await page.locator('input[name=password]').fill('password'); await Promise.all([ page.waitForURL('**/dashboard', { timeout: 60000 }), page.locator('button[type=submit]').click(), ]); await page.waitForLoadState('networkidle'); assert.ok((await page.locator('body').innerText()).trim().length > 100); checks.push({ path: '/dashboard', authenticated: true, rendered: true }); await page.screenshot({ path: path.join(directory, 'dashboard.png'), fullPage: true }); assert.deepEqual(errors, []); assert.deepEqual(failures, []); const receipt = { at: new Date().toISOString(), checks, javascriptErrors: errors, serverErrors: failures }; fs.writeFileSync(path.join(directory, 'browser.json'), JSON.stringify(receipt, null, 2)); console.log(JSON.stringify(receipt)); } finally { await browser.close(); } })().catch(error => { console.error(error); process.exitCode = 1; });