Lot U3c : les tests d'abord, rouges sur le code de d66823b

- ld-engine inertia::when_everyone_votes_the_share_asked_is_m_on_every_electorate : pour tout W de 1 à
  10 000 000, les cinq crans, G aux deux bornes de la participation habituelle, les quorums 1, 2 et W :
  quand les W votent, la part exigée des T′ = max(W, Q) votants est M, exactement ; la phrase d'avant
  (« la majorité M suffit », lue ⌈M·W⌉ « pour ») fausse sur 17 couples (W, cran), tous W ≤ 15, une voix
  de plus (B^W) ; vert sur le moteur inchangé, ses dents vues rouges par trois mutations (le plafond de
  la participation retiré, B^W mis dans la part, B^W retiré de R).
- web/tests/unit/rules.test.ts : formula.reading épinglée en fr, en, es (« la part exigée est la
  majorité M ») ; aucune chaîne des catalogues ni du texte des composants ne dit que la majorité suffit ;
  la liste fermée de ce que l'écran dit de la pleine participation (formula.M, formula.reading,
  settings.reading) ; inertia.test.ts suit. 5 tests rouges sur 116.
- tests/amorce.rs the_queue_names_the_starter_proposals_as_the_screen_does : les quatre raisons
  « Proposition d'amorce réécrite / ajoutée » (I1, E1, E2, E12), dans les constantes et dans les cinq
  lignes de file que T4 écrit sur une base comme la production après M8 ; celles de M6 inchangées. Rouge
  sur les constantes, et sur la file quand les constantes sont sautées.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-11-03 23:38:07 +01:00
co-authored by Claude Opus 5.5
parent 842a546796
commit 7d8be18c3b
4 changed files with 244 additions and 4 deletions
+56
View File
@@ -710,6 +710,62 @@ async fn production_after_m6c_gets_lot_t4_once_and_nothing_is_erased() {
production_gets_lot_t4_once(production_after_m6c("m6c").await, 4).await;
}
/// Lot U3c (review of d66823b): the reasons of the queue lines lot T4 writes become lines of the
/// public commit of the texts when the first text enters into force. They name the seed proposals
/// as the screen does, « Proposition d'amorce » (Yvv's word), never « Proposition seed ». The
/// amendments of M6, applied in production (`seed_proposal_amend`), keep theirs: their lines are
/// already in its queue.
#[tokio::test]
async fn the_queue_names_the_starter_proposals_as_the_screen_does() {
const REWRITTEN: [(&str, &str); 3] = [
("2026-11-03-i1-amorce", "Proposition d'amorce réécrite : I1, la Raison d'être (texte d'Yvv du 03/11)"),
(
"2026-11-03-e1-amorce",
"Proposition d'amorce réécrite : E1, l'unicité du compte certifiant (texte d'Yvv du 03/11)",
),
(
"2026-11-03-e2-amorce",
"Proposition d'amorce réécrite : E2, la réciprocité des trois principes (texte d'Yvv du 03/11)",
),
];
const ADDED: &str = "Proposition d'amorce ajoutée : E12, Responsabilité civique (texte d'Yvv du 03/11)";
for (id, reason) in REWRITTEN {
let a = ld_server::seed_amend::AMENDMENTS.iter().find(|a| a.id == id).expect(id);
assert_eq!(a.reason, reason, "{id}");
}
let e12 = ld_server::article_amend::AMENDMENTS.iter().find(|a| a.id == ADD).expect(ADD);
assert_eq!(e12.reason, ADDED);
// The lines lot T4 writes on a base as production holds it after M8: Monnaie libre only.
let base = production_after_m8("reasons").await;
let last: i64 = count(&base, "SELECT IFNULL(MAX(id), 0) FROM outbox").await;
let state = t4(&base).await;
let written: Vec<(String, String)> = sqlx::query_as(
"SELECT d.group_slug, o.reason FROM outbox o JOIN documents d ON d.id = o.doc_id WHERE o.id > ? ORDER BY o.id",
)
.bind(last)
.fetch_all(&state.db)
.await
.expect("outbox");
assert!(written.iter().all(|(g, _)| g == "monnaie-libre"), "{written:?}");
let reasons: Vec<&str> = written.iter().map(|(_, r)| r.as_str()).collect();
let between = format!("{ADDED}, entre E1 et E2");
for line in REWRITTEN.iter().map(|(_, r)| *r).chain([between.as_str()]) {
assert_eq!(reasons.iter().filter(|r| **r == line).count(), 1, "« {line} » in {reasons:?}");
}
assert_eq!(reasons.len(), 5, "and the retirement of the rules of operation: {reasons:?}");
assert!(reasons.iter().all(|r| !r.contains("seed")), "{reasons:?}");
// M6's, unchanged.
let m6: Vec<&str> = ld_server::seed_proposal_amend::AMENDMENTS.iter().map(|a| a.reason).collect();
assert_eq!(
m6,
[
"Proposition seed : I1 sort de la vigueur",
"Proposition seed : E1 sort de la vigueur",
"Proposition seed : E2 sort de la vigueur"
]
);
}
// ---------------------------------------------------------------------------
// After the retirement, the API refuses everything on them
// ---------------------------------------------------------------------------