Ctrl K
ComunidadGuías…

test_maj_finaliser_arret.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Aucun remplacement ni redémarrage tant que l'arrêt n'est pas confirmé."""

import os
import tempfile
import unittest
from pathlib import Path
from unittest import mock

import maj


class TestFinaliserArret(unittest.TestCase):
    def setUp(self):
        temporaire = tempfile.TemporaryDirectory(prefix="blink-finaliser-arret-")
        self.addCleanup(temporaire.cleanup)
        donnees = Path(temporaire.name) / "donnees"
        controle = Path(temporaire.name) / "controle"
        donnees.mkdir()
        controle.mkdir()
        environnement = mock.patch.dict(os.environ, {
            "BLINK_HOME": str(donnees),
            "BLINK_CONTROL_HOME": str(controle),
        })
        environnement.start()
        self.addCleanup(environnement.stop)

    def executer(self, code_arret, vivants):
        fiches = [{"pid": 123, "verbes": [["serve"]]}]
        with tempfile.TemporaryDirectory() as dossier, \
                mock.patch.object(maj.runtime, "frozen", return_value=False), \
                mock.patch.object(maj.runtime, "lire_instances", side_effect=[
                    fiches, *[fiches if vivant else [] for vivant in vivants]]), \
                mock.patch.object(maj.runtime, "lancer", return_value=mock.Mock(
                    returncode=code_arret)), \
                mock.patch.object(maj.time, "sleep"), \
                mock.patch.object(maj, "_permuter", return_value=True) as permuter, \
                mock.patch.object(maj, "_relancer") as relancer:
            code = maj.finaliser(Path(dossier))
        return code, permuter, relancer

    def test_arret_echoue_ne_remplace_et_ne_relance_pas(self):
        code, permuter, relancer = self.executer(1, [True] * 20)
        self.assertEqual(code, 1)
        permuter.assert_not_called()
        relancer.assert_not_called()
        travail = maj.runtime.travail_affichable()
        self.assertEqual(travail["cle"], "phase.update_noop")
        self.assertEqual(travail["quoi"], maj.msg("arret_echoue"))
        self.assertTrue(travail["termine"])
        self.assertFalse(travail["actif"])

    def test_arret_reussi_mais_instance_survivante_refuse_la_mise_a_jour(self):
        code, permuter, relancer = self.executer(0, [True] * 20)
        self.assertEqual(code, 1)
        permuter.assert_not_called()
        relancer.assert_not_called()
        travail = maj.runtime.travail_affichable()
        self.assertEqual(travail["cle"], "phase.update_noop")
        self.assertEqual(travail["quoi"], maj.msg("instance_encore_active"))
        self.assertTrue(travail["termine"])
        self.assertFalse(travail["actif"])

    def test_arret_confirme_apres_attente_autorise_la_mise_a_jour(self):
        code, permuter, relancer = self.executer(0, [True, True, False])
        self.assertEqual(code, 0)
        permuter.assert_called_once()
        relancer.assert_called_once()
        self.assertEqual(maj.runtime.travail_affichable(), {})

    def test_parent_mort_mais_enfant_ou_travailleur_survivant_refuse_la_mise_a_jour(self):
        for champ in ("enfants", "travailleurs"):
            with self.subTest(champ=champ), tempfile.TemporaryDirectory() as dossier, \
                    mock.patch.object(maj.runtime, "frozen", return_value=False), \
                    mock.patch.object(maj.runtime, "lire_instances", return_value=[
                        {"pid": 123, champ: [456], "verbes": [["serve"]]}]), \
                    mock.patch.object(maj.runtime, "processus_vivant", side_effect=lambda pid: pid == 456), \
                    mock.patch.object(maj.runtime, "lancer", return_value=mock.Mock(returncode=0)), \
                    mock.patch.object(maj.time, "sleep"), \
                    mock.patch.object(maj, "_permuter") as permuter, \
                    mock.patch.object(maj, "_relancer") as relancer:
                code = maj.finaliser(Path(dossier))

                self.assertEqual(code, 1)
                permuter.assert_not_called()
                relancer.assert_not_called()


if __name__ == "__main__":
    unittest.main()