erplibre/test/test_qemu_vm_name.py
Mathieu Benoit cfbdd9406e [REF] format : passer l'outillage et les tests sous ruff
Le formateur de ce dépôt est ruff depuis qu'il remplace black, qui ne connaît
aucune cible au-delà de py313 ; ce passage applique sa norme à l'arbre entier,
d'un coup, pour qu'aucun commit de fond n'ait à porter du style. L'écart tient
presque entièrement aux chaînes coupées à la main que ruff recolle quand elles
tiennent sur une ligne, et aux « with » multiples qu'il regroupe : aucune
valeur ne change, et les clés de traduction non plus.
Vérifié : la suite unitaire reste verte après le passage, et le contrôle de
syntaxe ne signale rien.

--- EN ---

This repository's formatter is ruff since it replaced black, which knows no
target beyond py313; this pass applies its standard to the whole tree at once,
so that no substantive commit has to carry style. The difference is almost
entirely the hand-split strings ruff joins back when they fit on one line, and
the multiple "with" it merges: no value changes, nor do the translation keys.
Checked: the unit suite stays green after the pass, and the syntax check
reports nothing.

Assisted-by: Claude Opus 5
2026-09-24 14:40:38 -04:00

100 lines
3.3 KiB
Python

#!/usr/bin/env python3
# © 2021-2026 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
"""Le nom de VM du parc : que porte-t-il, et que retrouve-t-on dedans ?
Le nom se lit dans les deux sens. `_qemu_infra_name` le fabrique à partir de
(distro, version, archi) ; `_qemu_vm_meta` remonte de ce nom à la version en
rejouant le catalogue. Les deux doivent rester en miroir : une règle ajoutée
d'un seul côté rend une VM introuvable dans son propre parc.
Une distribution en publication continue n'a qu'une version, « latest », qui
ne distingue donc rien — elle sort du nom. Une version nommée qui coexiste
avec d'autres au catalogue, tumbleweed, reste.
"""
import unittest
from unittest.mock import patch
from script.todo.todo import TODO
class TestInfraName(unittest.TestCase):
"""Ce que le nom porte selon la distribution et l'architecture."""
def setUp(self):
patcher = patch.object(
TODO, "_native_arch", staticmethod(lambda: "amd64")
)
patcher.start()
self.addCleanup(patcher.stop)
def test_rolling_release_drops_the_version(self):
self.assertEqual(
TODO._qemu_infra_name("arch", "latest", "amd64"), "erplibre-arch"
)
def test_rolling_release_keeps_the_foreign_arch(self):
self.assertEqual(
TODO._qemu_infra_name("arch", "latest", "arm64"),
"erplibre-arch-arm64",
)
def test_named_version_stays(self):
"""tumbleweed coexiste avec Leap au catalogue : le nom doit trancher."""
self.assertEqual(
TODO._qemu_infra_name("opensuse", "tumbleweed", "amd64"),
"erplibre-opensuse-tumbleweed",
)
def test_numbered_version_loses_only_its_dots(self):
self.assertEqual(
TODO._qemu_infra_name("ubuntu", "24.04", "amd64"),
"erplibre-ubuntu-2404",
)
def test_every_catalogue_entry_yields_a_distinct_name(self):
"""Deux entrées du catalogue ne peuvent pas porter le même nom."""
import importlib.util
from pathlib import Path
path = (
Path(__file__).resolve().parent.parent
/ "script"
/ "qemu"
/ "deploy_qemu.py"
)
spec = importlib.util.spec_from_file_location("deploy_qemu", path)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
noms = [
TODO._qemu_infra_name(distro, version, "amd64")
for distro, (versions, _default) in mod.DISTROS.items()
for version in versions
]
self.assertEqual(len(noms), len(set(noms)), sorted(noms))
class TestNameRoundTrip(unittest.TestCase):
"""_qemu_vm_meta retrouve la version que _qemu_infra_name a effacée."""
def test_rolling_release_resolves_back_to_latest(self):
todo = TODO()
with (
patch.object(TODO, "_qemu_vm_arch", lambda self, name: "amd64"),
patch.object(TODO, "_native_arch", staticmethod(lambda: "amd64")),
):
class Catalogue:
DISTROS = {"arch": (["latest"], "latest")}
self.assertEqual(
todo._qemu_vm_meta("erplibre-arch", Catalogue()),
("arch", "latest", "amd64"),
)
if __name__ == "__main__":
unittest.main()