196 lines
6.8 KiB
JavaScript
196 lines
6.8 KiB
JavaScript
const {
|
|
chromium,
|
|
} = require('C:/Users/macbook/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright');
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
const directory = path.resolve(
|
|
__dirname,
|
|
'../storage/app/private/investmoz-v2',
|
|
);
|
|
const plan = JSON.parse(
|
|
fs.readFileSync(
|
|
path.join(
|
|
directory,
|
|
'qa-traceability-browser/territory-activation-plan.json',
|
|
),
|
|
'utf8',
|
|
),
|
|
);
|
|
assert.match(plan.target.database, /^desk_restore_\d{8}_\d{6}_test$/);
|
|
assert.equal(plan.target.port, 55441);
|
|
const base = 'http://127.0.0.1:18093';
|
|
(async () => {
|
|
const browser = await chromium.launch({
|
|
headless: true,
|
|
executablePath:
|
|
'C:/Users/macbook/AppData/Local/ms-playwright/chromium-1243/chrome-win64/chrome.exe',
|
|
});
|
|
try {
|
|
const context = await browser.newContext({
|
|
viewport: { width: 1440, height: 950 },
|
|
});
|
|
await context.route('**/*', (route) =>
|
|
route.request().url().startsWith(base)
|
|
? route.continue()
|
|
: route.abort(),
|
|
);
|
|
const page = await context.newPage();
|
|
const errors = [];
|
|
const writes = [];
|
|
page.on('pageerror', (error) => errors.push(error.message));
|
|
page.on('request', (request) => {
|
|
if (request.method() === 'POST')
|
|
writes.push(new URL(request.url()).pathname);
|
|
});
|
|
const response = await page.goto(base + '/login');
|
|
assert.equal(
|
|
response.headers()['x-investmoz-qa-target'],
|
|
plan.target.database + ':55441',
|
|
);
|
|
await page
|
|
.locator('input[name=email]')
|
|
.fill('territory-browser@example.invalid');
|
|
await page.locator('input[name=password]').fill('Territory-QA-2026!');
|
|
await page.getByRole('button', { name: 'Log in', exact: true }).click();
|
|
await page.waitForURL((url) => url.pathname !== '/login');
|
|
await page.goto(base + '/management/relationship-repair');
|
|
const apply = page.getByRole('button', {
|
|
name: 'Aplicar rastreabilidade territorial V2',
|
|
exact: true,
|
|
});
|
|
await apply.waitFor();
|
|
assert.equal(await apply.isEnabled(), true);
|
|
assert.match(
|
|
await page.locator('body').innerText(),
|
|
/112 associações\/fontes/,
|
|
);
|
|
assert.match(
|
|
await page.locator('body').innerText(),
|
|
/13 atualizações de referências/,
|
|
);
|
|
await page.screenshot({
|
|
path: path.join(directory, 'territory-activation-preview.png'),
|
|
});
|
|
const post = page.waitForResponse(
|
|
(response) =>
|
|
response.request().method() === 'POST' &&
|
|
response.url().endsWith('/management/relationship-repair'),
|
|
);
|
|
await apply.click();
|
|
assert.equal((await post).status(), 302);
|
|
const revert = page.getByRole('button', {
|
|
name: 'Reverter este incremento de rastreabilidade',
|
|
exact: true,
|
|
});
|
|
try {
|
|
await revert.waitFor({ timeout: 8000 });
|
|
} catch (error) {
|
|
fs.writeFileSync(
|
|
path.join(directory, 'territory-browser-failure.txt'),
|
|
await page.locator('body').innerText(),
|
|
);
|
|
throw error;
|
|
}
|
|
assert.match(
|
|
await page.locator('body').innerText(),
|
|
/Rastreabilidade aplicada; validações e dados territoriais preservados/,
|
|
);
|
|
await page.reload();
|
|
await page
|
|
.getByRole('button', {
|
|
name: 'Reverter este incremento de rastreabilidade',
|
|
exact: true,
|
|
})
|
|
.waitFor();
|
|
const row = plan.rows.find(
|
|
(row) =>
|
|
row.kind === 'economic_clusters' &&
|
|
row.dossier_id &&
|
|
row.association_id,
|
|
);
|
|
await page.goto(base + '/carteira/' + row.dossier_id);
|
|
await page
|
|
.getByRole('heading', {
|
|
name: 'Fundamento documental das associações',
|
|
exact: true,
|
|
})
|
|
.waitFor();
|
|
assert.match(
|
|
await page.locator('body').innerText(),
|
|
/citação recuperada; ponte ao exemplar oficial por recuperar/,
|
|
);
|
|
await page.goto(base + '/management/relationship-repair');
|
|
assert.equal(
|
|
await page
|
|
.getByRole('button', {
|
|
name: 'Reverter este incremento de rastreabilidade',
|
|
exact: true,
|
|
})
|
|
.isEnabled(),
|
|
false,
|
|
);
|
|
await page
|
|
.getByLabel('Motivo da reversão')
|
|
.fill('Ensaio consciente de reversão no navegador QA.');
|
|
await page
|
|
.getByLabel('Confirmo que pretendo reverter este incremento')
|
|
.check();
|
|
const reversal = page.waitForResponse(
|
|
(response) =>
|
|
response.request().method() === 'POST' &&
|
|
response.url().endsWith('/management/relationship-repair'),
|
|
);
|
|
await page
|
|
.getByRole('button', {
|
|
name: 'Reverter este incremento de rastreabilidade',
|
|
exact: true,
|
|
})
|
|
.click();
|
|
assert.equal((await reversal).status(), 302);
|
|
await page
|
|
.getByRole('button', {
|
|
name: 'Aplicar rastreabilidade territorial V2',
|
|
exact: true,
|
|
})
|
|
.waitFor();
|
|
assert.match(
|
|
await page.locator('body').innerText(),
|
|
/Rastreabilidade revertida, histórico preservado/,
|
|
);
|
|
assert.deepEqual(errors, []);
|
|
assert.deepEqual(
|
|
writes.filter((path) => path !== '/login'),
|
|
[
|
|
'/management/relationship-repair',
|
|
'/management/relationship-repair',
|
|
],
|
|
);
|
|
const evidence = {
|
|
recorded_at: new Date().toISOString(),
|
|
target: plan.target,
|
|
checks: [
|
|
'authenticated preview',
|
|
'apply exact V2 button',
|
|
'HTTP 302 and visible success',
|
|
'recovery after reload',
|
|
'source per association on public dossier',
|
|
'revert exact increment',
|
|
'no console errors',
|
|
],
|
|
writes,
|
|
active_writes: 0,
|
|
};
|
|
fs.writeFileSync(
|
|
path.join(directory, 'territory-activation-browser.json'),
|
|
JSON.stringify(evidence, null, 2),
|
|
);
|
|
console.log(JSON.stringify(evidence));
|
|
} finally {
|
|
await browser.close();
|
|
}
|
|
})().catch((error) => {
|
|
console.error(error);
|
|
process.exitCode = 1;
|
|
});
|