Lot T4 : les tests d'avant suivent le seed de T4 sans rien perdre de ce qu'ils prouvent

Les tests qui lisaient F, N ou O rejouent leurs transitions sur le seed de M8
(tests/fixtures/seed-m8) : seed_quorum_texts, seed_rules, seed_proposals, api,
quorum ; ils disent en plus que ces amendements sont dépassés par le retrait
(superseded_by). Les comptes suivent le document de T4 : 27 articles, quatre
Propositions seed (I1, E1, E12, E2), 33 modules à voter (27 articles, le titre,
l'ordre de 5 sections). modules.rs : l'ordre sous vote se rejoue sur
« conclusion » (K1, K2) ; « un ordre d'un seul article n'a rien à décider » sur
une base née du seed de M8 (O1). seed_amend : tests unitaires de
Version::SeedProposal et de la ligne seed_proposal (put_forward). order.rs ne lit
que les colonnes d'avant 0012 : sections_now ne sert qu'à la naissance des
modules, et article_amend n'en garde que les articles vivants.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-11-03 21:21:44 +01:00
co-authored by Claude Opus 5.5
parent dda1ca85dd
commit 093d1ca471
14 changed files with 384 additions and 189 deletions
+17 -5
View File
@@ -4,7 +4,10 @@
//!
//! Played with the seed M5 shipped (3f10a0e, the fixture of production): since lot T
//! (2026-11-03), today's seed gives F1.2 and N1.1 the texts of the quorum, and their
//! amendments of 02/11 are superseded (`tests/seed_quorum_texts.rs`).
//! amendments of 02/11 are superseded (`tests/seed_quorum_texts.rs`). Since lot T4 (the same
//! day, ADR 0014), the four leave the seed: the seed of M8 (`tests/fixtures/seed-m8/`), the last
//! that holds them, stands for « today » here, and their last amendments are superseded by
//! their retirement (`retire`).
use ld_server::seed_amend::{self, AMENDMENTS, Version};
use ld_server::{AppState, Config, open_db, seed};
@@ -21,8 +24,13 @@ fn before() -> Value {
read(std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/seed-regles-avant.json"))
}
/// The seed of M8 (de1b7eb): the last that holds the rule articles.
fn m8_dir() -> std::path::PathBuf {
std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/seed-m8")
}
fn today_seed() -> Value {
read(Config::for_tests().seed_dir.join("acte-engagement-certification.json"))
read(m8_dir().join("acte-engagement-certification.json"))
}
/// The seed M5 shipped: production's since 2026-11-02.
@@ -125,12 +133,14 @@ fn the_shipped_amendments_go_from_the_texts_of_before_to_the_seed_of_m5() {
let (t, b) = fr(version(&today, code));
let now = seed_amend::fingerprint(t, b);
let mut last = a;
while let Some(later) = last.superseded_by {
while let Some(later) = last.superseded_by.filter(|l| *l != ld_server::retire::RETIREMENT) {
let l = AMENDMENTS.iter().find(|l| l.id == later).expect("the later amendment");
assert_eq!((l.unit, l.follows, l.from), (code, Some(last.id), last.to), "{code}: {}", l.id);
last = l;
}
assert_eq!(now, last.to, "{code}: the text of today");
// Lot T4 takes the article out of the seed: the last amendment of its text decides nothing more.
assert_eq!(last.superseded_by, Some(ld_server::retire::RETIREMENT), "{code}");
}
}
@@ -217,9 +227,11 @@ async fn untouched_rule_articles_are_replaced_once_and_a_vote_keeps_its_text() {
}
#[tokio::test]
async fn a_new_base_is_born_with_the_rules_of_today() {
async fn a_base_born_on_the_seed_of_m8_holds_its_rules() {
let db = open_db("sqlite::memory:").await.expect("db");
let state = AppState::new(Config::for_tests(), db).await.expect("state");
let mut cfg = Config::for_tests();
cfg.seed_dir = m8_dir();
let state = AppState::new(cfg, db).await.expect("state");
seed::ensure(&state).await.expect("seed");
let today = today_seed();
for group in ["essai", "monnaie-libre"] {