Set-OPS-Public/scripts/tests/test_forge_cles.py
Daniel Allaire 9af39b1b60 forge : chaque locataire publie la cle qui lira son depot, le site sait l'enregistrer
Debut du chantier des depots prives (docs/depots-prives-conception.md). La face reseau
publie genome: {depot, cle_lecture} ; P95 exige que la cle soit connue de la flotte, et
l'armement refuse une voute qui en remettrait une autre. make forge-cles enregistre
chaque cle en lecture seule sur le seul depot que la face nomme, retire une cle
perimee, ne touche jamais celle du runner du site. Flux SSH vers la forge du site
depuis les seuls runners des locataires (paire runners_locataires).

Rien n'est encore applique sur le terrain ; les depots restent publics.

95 preuves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 19:59:07 -04:00

57 lines
2.2 KiB
Python

#!/usr/bin/env python3
"""Le plan de `forge_cles.py` : ajouter la cle publiee, retirer la perimee, refuser l'ecriture.
Pur : aucun appel a la forge. Ce que le script ECRIT est rendu par `plan()` ; s'il se trompe
ici, il se trompe sur la forge — c'est donc ici qu'on l'epingle.
"""
from __future__ import annotations
import sys
import unittest
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "scripts"))
import forge_cles as fc # noqa: E402
CLE = "ssh-ed25519 AAAALECTURE"
AUTRE = "ssh-ed25519 AAAAANCIENNE"
SITE = "ssh-ed25519 AAAASITE"
def voulue(depot="ops-essai", cle=CLE):
return {"locataire": "OPS-Essai", "depot": depot, "cle": cle}
class TestPlan(unittest.TestCase):
def test_une_cle_absente_s_ajoute(self):
a, r, x = fc.plan([voulue()], {"ops-essai": []})
self.assertEqual((len(a), r, x), (1, [], []))
def test_une_cle_deja_la_ne_change_rien(self):
cles = [{"id": 1, "title": fc.titre_de("OPS-Essai"), "key": CLE + " setops@ops-01", "read_only": True}]
self.assertEqual(fc.plan([voulue()], {"ops-essai": cles}), ([], [], []))
def test_une_cle_perimee_sous_le_meme_titre_se_retire(self):
cles = [{"id": 7, "title": fc.titre_de("OPS-Essai"), "key": AUTRE, "read_only": True}]
a, r, x = fc.plan([voulue()], {"ops-essai": cles})
self.assertEqual(len(a), 1)
self.assertEqual([y["id"] for y in r], [7])
def test_la_cle_du_runner_du_site_n_est_jamais_touchee(self):
cles = [{"id": 3, "title": "runner du site — site-ops-01", "key": SITE, "read_only": False}]
a, r, x = fc.plan([voulue()], {"ops-essai": cles})
self.assertEqual(r, [], "la cle d'ecriture du site n'est pas une cle de lecture perimee")
def test_une_cle_de_lecture_en_ecriture_est_refusee(self):
cles = [{"id": 4, "title": "autre", "key": CLE, "read_only": False}]
a, r, x = fc.plan([voulue()], {"ops-essai": cles})
self.assertEqual((a, r), ([], []))
self.assertEqual(len(x), 1)
def test_une_face_sans_cle_est_refusee(self):
a, r, x = fc.plan([voulue(cle="")], {})
self.assertEqual((a, r, len(x)), ([], [], 1))
if __name__ == "__main__":
unittest.main(verbosity=2)