forked from yvv/decision
v3 : interface d'une version retenue — « Contre » et « Retirer mon vote », jamais « Pour »
Sous l'article, une version retenue montre « Contre » et le retrait, avec la phrase qui dit pourquoi. Dans le panier, elle se choisit en « contre » ou en retrait ; « Tout pour » la saute et le dit, « Tout contre » la prend ; un « pour » gardé d'avant l'objection quitte le panier (basket.kept). Les phrases qui disaient « ne se vote plus » disent la règle d'Yvv, en fr, en et es. C28 ajusté. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -37,11 +37,11 @@ async function raise(page: Page, id: string, kind: 'Redit' | 'Contredit', target
|
||||
await panel.getByLabel('Quel article ?').selectOption({ label: `En vigueur — ${target}` });
|
||||
await panel.getByLabel(kind === 'Redit' ? 'En quoi ces deux textes disent la même chose' : 'En quoi ces deux textes se contredisent').fill(reason);
|
||||
await panel.getByRole('button', { name: "Envoyer l'objection" }).click();
|
||||
await expect(page.getByText("Objection enregistrée : la dernière arrivée des deux versions ne se vote plus jusqu'à sa levée.")).toBeVisible();
|
||||
await expect(page.getByText("Objection enregistrée : jusqu'à sa levée, personne ne peut plus voter pour la dernière arrivée des deux versions.")).toBeVisible();
|
||||
return panel;
|
||||
}
|
||||
|
||||
test('C28 — « redit » : la dernière arrivée ne se vote plus, l’auteur modifie l’article visé, la personne qui objecte lève', async ({ browser }) => {
|
||||
test('C28 — « redit » : plus de « pour » sur la dernière arrivée (contre ou retrait), l’auteur modifie l’article visé, la personne qui objecte lève', async ({ browser }) => {
|
||||
const aude = await person(browser, 'Aude');
|
||||
const oscar = await person(browser, 'Oscar');
|
||||
const vera = await person(browser, 'Vera');
|
||||
@@ -51,19 +51,57 @@ test('C28 — « redit » : la dernière arrivée ne se vote plus, l’auteur mo
|
||||
// Oscar: it repeats « Unicité du compte ».
|
||||
const panel = await raise(oscar, id, 'Redit', 'Unicité du compte', 'Unicité du compte dit déjà exactement cela.');
|
||||
await expect(panel.locator('.objection')).toContainText(`« ${title} » redit « Unicité du compte »`);
|
||||
await expect(panel.getByText('cette version ne se vote plus')).toBeVisible();
|
||||
await expect(panel.getByText('personne ne peut plus voter pour cette version')).toBeVisible();
|
||||
await expect(panel.getByRole('button', { name: "Lever l'objection" })).toBeVisible();
|
||||
await shots(oscar, 'f1-objection-vue-par-qui-objecte');
|
||||
|
||||
// Vera, who votes: held back, said so, nothing to press; the list marks it.
|
||||
// Vera, who votes (Yvv, 2026-11-01: « Retirer ou "contre" »): held back, said so;
|
||||
// « Contre » and the withdrawal, never « Pour »; the list marks it.
|
||||
await vera.goto(`${TEST_DOC}?vote=${id}`);
|
||||
const fold = vera.getByRole('region', { name: `Le vote de « ${title} »` });
|
||||
await expect(fold.getByText("Une objection retient cette version : elle ne se vote plus jusqu'à sa levée. Les votes déjà faits restent.")).toBeVisible();
|
||||
await expect(
|
||||
fold.getByText("Une objection retient cette version : jusqu'à sa levée, personne ne peut plus voter pour. Tu peux voter contre ou retirer ton vote ; à la levée, elle n'entre en vigueur qu'avec les voix encore là."),
|
||||
).toBeVisible();
|
||||
await expect(fold.getByText('Elle redit « Unicité du compte ».')).toBeVisible();
|
||||
const choice = fold.getByRole('group', { name: 'Ton vote', exact: true });
|
||||
await expect(choice.getByRole('button', { name: 'Contre', exact: true })).toBeVisible();
|
||||
await expect(fold.getByRole('button', { name: 'Pour', exact: true })).toHaveCount(0);
|
||||
await expect(vera.locator('ul.deep button.row', { hasText: title })).toContainText('non votable : objection');
|
||||
await expect(vera.locator('ul.deep button.row', { hasText: title })).toContainText('retenue par une objection');
|
||||
await fold.scrollIntoViewIfNeeded();
|
||||
await shots(vera, 'f2-objection-vue-par-qui-vote');
|
||||
// « Contre », then the withdrawal: the version can only lose votes; « Pour » never comes back.
|
||||
await choice.getByRole('button', { name: 'Contre', exact: true }).click();
|
||||
await expect(vera.getByText('Vote enregistré.')).toBeVisible();
|
||||
await expect(fold.getByText('Ton vote : contre')).toBeVisible();
|
||||
await expect(fold.locator('.tally')).toHaveText('0 pour · 1 contre');
|
||||
await expect(fold.getByRole('button', { name: 'Pour', exact: true })).toHaveCount(0);
|
||||
await choice.getByRole('button', { name: 'Retirer mon vote' }).click();
|
||||
await expect(vera.getByText('Vote retiré.')).toBeVisible();
|
||||
await expect(fold.getByText("Tu n'as pas voté sur cette version.")).toBeVisible();
|
||||
await expect(fold.locator('.tally')).toHaveText('0 pour · 0 contre');
|
||||
await expect(fold.getByRole('button', { name: 'Pour', exact: true })).toHaveCount(0);
|
||||
|
||||
// In the basket: « Contre » or the withdrawal, never « Pour »; « Tout pour » skips it
|
||||
// and says so, « Tout contre » takes it.
|
||||
await vera.goto(`${TEST_DOC}?onglet=panier`);
|
||||
const basket = vera.locator('aside.panel');
|
||||
await expect(basket.getByRole('heading', { name: 'Panier de vote' })).toBeVisible();
|
||||
const pick = basket.getByRole('group', { name: `Ton choix pour « ${title} »` });
|
||||
await expect(pick.getByRole('button', { name: 'Contre', exact: true })).toBeVisible();
|
||||
await expect(pick.getByRole('button', { name: 'Pour', exact: true })).toHaveCount(0);
|
||||
const heldRow = basket.locator('.version.held').filter({ has: vera.getByRole('group', { name: `Ton choix pour « ${title} »` }) });
|
||||
await expect(heldRow).toContainText('une objection la retient : contre ou retrait, pas de « pour »');
|
||||
const whole = basket.getByRole('group', { name: 'Tout le document', exact: true });
|
||||
await whole.getByRole('button', { name: 'Tout pour' }).click();
|
||||
await expect(basket.getByText(/^Tu as tout mis pour, sauf \d+ versions? qu'une objection retient : sur elles?, tu peux voter contre ou retirer ton vote\.$/)).toBeVisible();
|
||||
await expect(pick.getByRole('button', { name: 'Contre', exact: true })).toHaveAttribute('aria-pressed', 'false');
|
||||
await shots(vera, 'g1-panier-tout-pour-la-saute');
|
||||
await whole.getByRole('button', { name: 'Tout contre' }).click();
|
||||
await expect(pick.getByRole('button', { name: 'Contre', exact: true })).toHaveAttribute('aria-pressed', 'true');
|
||||
await heldRow.scrollIntoViewIfNeeded();
|
||||
await shots(vera, 'g2-panier-tout-contre-la-prend');
|
||||
await whole.getByRole('button', { name: 'Vider' }).click();
|
||||
await expect(basket.getByText("Rien dans le panier pour l'instant.")).toBeVisible();
|
||||
|
||||
// Aude: a message, and the way to answer — modify the article repeated.
|
||||
await aude.goto(TEST_DOC);
|
||||
@@ -99,8 +137,8 @@ test('C28 — « redit » : la dernière arrivée ne se vote plus, l’auteur mo
|
||||
await expect(answered.locator('.btn')).toHaveCount(0);
|
||||
await expect(oscar.getByRole('navigation', { name: 'Boîte à outils' }).getByRole('link', { name: 'Messages', exact: true })).toBeVisible();
|
||||
|
||||
// Vera: it is voted on again.
|
||||
await vera.reload();
|
||||
// Vera: it is voted on again, « Pour » too.
|
||||
await vera.goto(`${TEST_DOC}?vote=${id}`);
|
||||
await expect(fold.getByRole('button', { name: 'Pour', exact: true })).toBeVisible();
|
||||
await expect(fold.getByText('Une objection retient cette version', { exact: false })).toHaveCount(0);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user