15 lines
4.5 KiB
JavaScript
15 lines
4.5 KiB
JavaScript
const {start,assert,sanitized}=require('./portal-functional-qa-lib.cjs');
|
|
void(async()=>{const q=await start('functional-delivery-scope-chromium-20261011');let ctx,page,id=q.prior.opportunity_id;
|
|
async function actor(){if(ctx)await ctx.close();({ctx,page}=await q.context('promoter',390));await q.login(page,'promoter');}
|
|
async function save(expected){await page.getByLabel('Motivo da alteração',{exact:true}).fill('Preparação sintética QA: variante planeada permanece recuperável sem avançar para submissão.');const wait=page.waitForResponse(r=>['POST','PUT'].includes(r.request().method())&&/^\/minhas-oportunidades\/(drafts|\d+\/draft)$/.test(new URL(r.url()).pathname));await page.getByRole('button',{name:'Guardar contrato no rascunho',exact:true}).click();const r=await wait;assert.equal(r.status(),expected);return r.json();}
|
|
try{
|
|
await actor();await q.open(page,'/minhas-oportunidades/create');await page.getByRole('region',{name:'Âmbito desta entrega'}).waitFor();
|
|
const context=page.getByRole('combobox',{name:/^Organização e tipo autorizados/});const options=await context.locator('option').evaluateAll(rows=>rows.map(o=>o.value));const allowed=['investment_project','real_estate','land_rights','business_sale','business_partnership','franchise'];assert.equal(options.length,6);assert(options.every(o=>allowed.includes(o.split('|').at(-1))));q.proof.checks.only_authorized_base_categories_offered=true;
|
|
if(!id){await context.selectOption(options.find(o=>o.endsWith('|real_estate')));await page.locator('[id="canonical.official_title"]').fill('SIMULAÇÃO QA — variante em preparação, não incluída na submissão');await page.locator('[id="canonical.real_estate.transaction_type"]').selectOption('lease');await page.locator('[id="canonical.real_estate.construction_status"]').selectOption('planned');const r=await save(201);id=r.id;q.proof.opportunity_id=id;q.save();await page.waitForURL(new RegExp(`/minhas-oportunidades/${id}/edit$`));}
|
|
await actor();await q.open(page,`/minhas-oportunidades/${id}/edit`);assert.equal(await page.locator('[id="canonical.real_estate.construction_status"]').inputValue(),'planned');q.proof.checks.unavailable_variant_draft_recovered_in_new_session=true;
|
|
const workflow=page.getByRole('region',{name:'Workflow interno'});await workflow.getByLabel('Fundamentação',{exact:true}).fill('Ensaio QA: submissão da variante fora do âmbito deve ser recusada sem perder o rascunho.');const wait=page.waitForResponse(r=>r.request().method()==='POST'&&new URL(r.url()).pathname.endsWith('/workflow'));await workflow.getByRole('button',{name:'Submeter para validação',exact:true}).click();const r=await wait;assert.equal(r.status(),422);const body=await r.json();assert(body.errors['canonical.real_estate.construction_status']);const f=page.locator('[id="canonical.real_estate.construction_status"]');assert.equal(await f.getAttribute('aria-invalid'),'true');assert(await page.locator('[id="canonical.real_estate.construction_status-error"]').isVisible());q.proof.checks.server_blocks_unavailable_variant_with_field_error=true;await f.scrollIntoViewIfNeeded();await q.shot(page,'planned-variant-recovered-and-field-error',false);
|
|
await q.open(page,'/minhas-oportunidades/54/view');await page.getByRole('region',{name:'Âmbito desta entrega'}).waitFor();assert.equal(await page.locator('[id="canonical.real_estate.rent"]').inputValue(),'4500');assert.equal(await page.locator('[id="canonical.real_estate.rent_periodicity"]').inputValue(),'monthly');q.proof.checks.demonstrated_lease_preserved=true;
|
|
await q.open(page,'/minhas-oportunidades/54/resources');await page.getByRole('button',{name:'Documentos',exact:true}).click();const notice=page.getByRole('region',{name:'Privacidade dos anexos'});await notice.waitFor();assert((await notice.innerText()).includes('Partilhar um anexo com um destinatário individual'));assert((await notice.innerText()).includes('não publica os anexos'));q.proof.checks.document_privacy_and_unavailable_sharing_explained=true;await notice.scrollIntoViewIfNeeded();await q.shot(page,'document-privacy-scope-390',false);assert(await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth));q.proof.checks.notice_no_overflow_390=true;
|
|
q.proof.AB_C37_not_repeated=true;q.proof.result='passed';q.save();console.log(JSON.stringify({result:'passed',id,checks:q.proof.checks,active_writes:0}));
|
|
}catch(e){q.proof.result='failed';q.proof.failure=sanitized(e);q.save();console.log(JSON.stringify({result:'failed',failure:q.proof.failure,active_writes:0}));process.exitCode=1;}finally{if(ctx)await ctx.close();await q.browser.close();}})();
|