Files
Investidor-V2/tools/document-library-completion-browser.mjs
nala 1106509116
tests / ci (push) Canceled after 0s
vrsao 2
2026-10-08 14:02:01 +02:00

107 lines
3.8 KiB
JavaScript

import fs from 'node:fs';
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const {
chromium,
} = require('C:/Users/macbook/AppData/Local/Temp/investmoz-visual-qa-tools-20261004/node_modules/playwright');
const base = process.argv[2] ?? 'http://127.0.0.1:8000/documentos';
const browser = await chromium.launch({ headless: true });
const evidence = {
base,
testedAt: new Date().toISOString(),
targetDatabase:
'investemoz (confirmed by read-only Laravel connection query)',
viewports: [],
errors: [],
};
for (const viewport of [
{ name: 'desktop', width: 1440, height: 1000 },
{ name: 'mobile', width: 390, height: 844 },
]) {
const page = await browser.newPage({
viewport: { width: viewport.width, height: viewport.height },
});
page.on('pageerror', (error) => evidence.errors.push(error.message));
page.on('console', (message) => {
if (message.type() === 'error') evidence.errors.push(message.text());
});
const response = await page.goto(base, { waitUntil: 'networkidle' });
const heading = await page
.getByRole('heading', { name: 'Documentos e Formulários' })
.count();
const text = await page.locator('body').innerText();
const overflow = await page.evaluate(() => ({
viewport: innerWidth,
document: document.documentElement.scrollWidth,
body: document.body.scrollWidth,
}));
await page.keyboard.press('Tab');
const focus = await page.evaluate(() => ({
tag: document.activeElement?.tagName,
label: document.activeElement?.getAttribute('aria-label'),
text: document.activeElement?.textContent?.trim().slice(0, 80),
}));
const screenshot = `docs/investmoz/document-library-completion-${viewport.name}-2026-10-06.png`;
await page.screenshot({ path: screenshot, fullPage: true });
await page
.getByRole('textbox', { name: 'Pesquisar' })
.fill('__sem_correspondencia_qa__');
await page.getByRole('button', { name: 'Pesquisar' }).click();
await page.waitForURL(
(url) => url.searchParams.get('q') === '__sem_correspondencia_qa__',
);
const searchUrl = page.url();
const noResults = await page
.getByText(/Não existem documentos publicados para esta pesquisa/)
.count();
const searchOverflow = await page.evaluate(
() => document.documentElement.scrollWidth === innerWidth,
);
evidence.viewports.push({
...viewport,
status: response?.status(),
heading,
publicResultsText:
text.match(
/\d+ documentos correspondem aos filtros activos/,
)?.[0] ?? null,
emptyState: /Não existem documentos publicados para esta pesquisa/.test(
text,
),
overflow,
firstKeyboardFocus: focus,
noMatchSearch: {
url: searchUrl,
emptyState: noResults === 1,
noHorizontalOverflow: searchOverflow,
},
screenshot,
});
if (/SQLSTATE|select \* from|Database:|Host: 127\.0\.0\.1/.test(text))
evidence.errors.push(
`${viewport.name}: página contém detalhe interno de erro`,
);
await page.close();
}
await browser.close();
fs.writeFileSync(
'docs/investmoz/document-library-completion-browser-2026-10-06.json',
JSON.stringify(evidence, null, 2) + '\n',
);
console.log(JSON.stringify(evidence, null, 2));
if (
evidence.errors.length ||
evidence.viewports.some(
(item) =>
item.status !== 200 ||
item.heading !== 1 ||
item.overflow.document !== item.width ||
!item.noMatchSearch.emptyState ||
!item.noMatchSearch.noHorizontalOverflow,
)
)
process.exit(1);