Files
Investidor-V2/tools/opportunity-resources-browser.cjs
T
nala 6ddafc95ba
tests / ci (push) Canceled after 0s
oportunidades 4
2026-10-10 07:03:59 +02:00

273 lines
9.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const {
chromium,
} = require('C:/Users/macbook/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright');
const fs = require('node:fs'),
assert = require('node:assert/strict'),
zlib = require('node:zlib');
const base = 'http://127.0.0.1:18096',
dir = 'storage/app/private/investmoz-v2/';
function png() {
function crc(bytes) {
let c = 0xffffffff;
for (const b of bytes) {
c ^= b;
for (let i = 0; i < 8; i++)
c = (c >>> 1) ^ (c & 1 ? 0xedb88320 : 0);
}
return (c ^ 0xffffffff) >>> 0;
}
function chunk(name, bytes) {
const n = Buffer.from(name),
body = Buffer.concat([n, bytes]),
head = Buffer.alloc(4),
tail = Buffer.alloc(4);
head.writeUInt32BE(bytes.length);
tail.writeUInt32BE(crc(body));
return Buffer.concat([head, body, tail]);
}
const hdr = Buffer.alloc(13);
hdr.writeUInt32BE(500, 0);
hdr.writeUInt32BE(500, 4);
hdr[8] = 8;
hdr[9] = 2;
return Buffer.concat([
Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]),
chunk('IHDR', hdr),
chunk('IDAT', zlib.deflateSync(Buffer.alloc(500 * 1501))),
chunk('IEND', Buffer.alloc(0)),
]);
}
(async () => {
const browser = await chromium.launch({
headless: true,
executablePath:
'C:/Users/macbook/AppData/Local/ms-playwright/chromium-1243/chrome-win64/chrome.exe',
});
const errors = [];
async function session(viewport) {
const context = await browser.newContext({ viewport });
await context.route('**/*', (r) =>
r.request().url().startsWith(base) ||
r.request().url().startsWith('data:')
? r.continue()
: r.abort(),
);
const page = await context.newPage();
page.on('pageerror', (e) => errors.push(e.message));
await page.goto(base + '/login');
await page
.getByLabel('Email address')
.fill('opportunity-manager@example.invalid');
await page
.getByLabel('Password', { exact: true })
.fill('Opportunity-QA-2026!');
await page.getByRole('button', { name: 'Log in', exact: true }).click();
await page.waitForURL('**/dashboard');
return { context, page };
}
const desktop = await session({ width: 1280, height: 900 }),
page = desktop.page;
await page
.getByRole('link', { name: 'Gestão de Oportunidades', exact: true })
.click();
await page
.getByRole('link', { name: 'Nova oportunidade', exact: true })
.click();
await page
.getByLabel('Motivo da alteração')
.fill('Criação de recursos somente na cópia QA');
await page
.getByRole('button', { name: 'Guardar rascunho', exact: true })
.click();
await page.waitForURL(/\/opportunities\/\d+\/edit$/);
const id = Number(page.url().match(/(\d+)\/edit$/)[1]);
assert(id > 6);
await page
.getByRole('link', {
name: 'Imagens, documentos e localizações',
exact: true,
})
.click();
await page.waitForURL('**/resources');
await page
.getByLabel('Título', { exact: true })
.fill('QA production location');
await page
.getByLabel('Papel da localização', { exact: true })
.selectOption('production');
const provinceSelect = page.getByLabel('Província', { exact: true });
await provinceSelect
.locator('option')
.nth(1)
.waitFor({ state: 'attached' });
const province = await provinceSelect
.locator('option')
.nth(1)
.getAttribute('value');
await provinceSelect.selectOption(province);
const districtSelect = page.getByLabel('Distrito', { exact: true });
await districtSelect
.locator('option')
.nth(1)
.waitFor({ state: 'attached' });
const district = await districtSelect
.locator('option')
.nth(1)
.getAttribute('value');
await districtSelect.selectOption(district);
await page.getByLabel('Distribuição (%)', { exact: true }).fill('60');
await page.getByLabel('Localização principal', { exact: true }).check();
await page
.getByLabel('Motivo (20–1000 caracteres)')
.fill('Localização e distribuição declaradas em QA');
await page
.getByRole('button', { name: 'Guardar recurso', exact: true })
.click();
await page
.locator('article')
.filter({ hasText: 'QA production location' })
.waitFor();
await page.getByLabel('Título', { exact: true }).fill('QA market location');
await page
.getByLabel('Papel da localização', { exact: true })
.selectOption('market');
await provinceSelect.selectOption(province);
await districtSelect
.locator('option')
.nth(1)
.waitFor({ state: 'attached' });
await districtSelect.selectOption(district);
await page.getByLabel('Distribuição (%)', { exact: true }).fill('40');
await page
.getByRole('button', { name: 'Guardar recurso', exact: true })
.click();
await page
.locator('article')
.filter({ hasText: 'QA market location' })
.waitFor();
assert.equal(await page.locator('article').count(), 2);
await page.getByRole('button', { name: 'Documentos', exact: true }).click();
await page.getByLabel('Título', { exact: true }).fill('QA source document');
await page
.getByLabel('Original / substituir por nova versão')
.setInputFiles({
name: 'qa.pdf',
mimeType: 'application/pdf',
buffer: Buffer.from('%PDF-1.7\nSynthetic QA document\n%%EOF'),
});
await page
.getByRole('button', { name: 'Guardar recurso', exact: true })
.click();
await page
.locator('article')
.filter({ hasText: 'QA source document' })
.waitFor();
await page.getByRole('button', { name: 'Imagens', exact: true }).click();
await page.getByLabel('Título', { exact: true }).fill('QA synthetic image');
await page
.getByLabel('Legenda', { exact: true })
.fill('Synthetic image only used in isolated QA');
await page
.getByLabel('Texto alternativo', { exact: true })
.fill('Black square generated for isolated QA');
await page
.getByLabel('Direitos de utilização', { exact: true })
.selectOption('owned');
await page
.getByLabel('Original / substituir por nova versão')
.setInputFiles({
name: 'qa.png',
mimeType: 'image/png',
buffer: png(),
});
await page
.getByRole('button', { name: 'Guardar recurso', exact: true })
.click();
const imageArticle = page
.locator('article')
.filter({ hasText: 'QA synthetic image' });
await imageArticle.waitFor();
await imageArticle
.getByRole('button', { name: 'Ver / editar / restaurar' })
.click();
const prepareButton = page.getByRole('button', {
name: 'Preparar WebP e miniaturas',
});
if (await prepareButton.isDisabled()) {
await page.getByText(/Processamento de imagens indisponível/).waitFor();
} else {
await prepareButton.click();
await page.getByText(/Scan do original pendente ou inseguro/).waitFor();
}
assert.equal(
await page.getByLabel('Título', { exact: true }).inputValue(),
'QA synthetic image',
);
await page.screenshot({
path: dir + 'opportunity-resources-desktop.png',
fullPage: true,
});
await desktop.context.close();
const mobile = await session({ width: 390, height: 844 }),
mp = mobile.page;
await mp.goto(base + `/management/opportunities/${id}/resources`);
await mp.evaluate(() => localStorage.clear());
await mp.reload();
assert.equal(await mp.locator('article').count(), 2);
await mp.getByRole('button', { name: 'Imagens', exact: true }).click();
const mi = mp.locator('article').filter({ hasText: 'QA synthetic image' });
await mi.getByRole('button', { name: 'Ver / editar / restaurar' }).click();
assert.equal(
await mp.getByLabel('Texto alternativo', { exact: true }).inputValue(),
'Black square generated for isolated QA',
);
await mp
.getByLabel('Motivo (20–1000 caracteres)')
.fill('Exclusão lógica de imagem somente no ensaio QA');
await mp.getByLabel('Confirmar exclusão lógica / restauração').check();
await mp
.getByRole('button', { name: 'Excluir recurso logicamente' })
.click();
await mp
.getByText('eliminado logicamente', { exact: false })
.first()
.waitFor();
await mi.getByRole('button', { name: 'Ver / editar / restaurar' }).click();
await mp.getByLabel('Confirmar exclusão lógica / restauração').check();
await mp.getByRole('button', { name: 'Restaurar recurso' }).click();
await mi.getByText(/rascunho/).waitFor();
await mp.screenshot({
path: dir + 'opportunity-resources-mobile.png',
fullPage: true,
});
assert(
await mp.evaluate(
() => document.documentElement.scrollWidth <= innerWidth + 1,
),
);
assert.deepEqual(errors, []);
const proof = {
recorded_at: new Date().toISOString(),
id,
desktop: true,
mobile: true,
new_session_recovery: true,
multiple_locations: true,
documents: true,
images: true,
scan_failure_visible: true,
soft_delete_restore: true,
errors,
active_writes: 0,
};
fs.writeFileSync(
dir + 'opportunity-resources-browser.json',
JSON.stringify(proof, null, 2),
);
console.log(JSON.stringify(proof));
await browser.close();
})().catch((e) => {
console.error(e);
process.exit(1);
});