107 lines
3.8 KiB
JavaScript
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);
|