"""Bug #2, revue de code du 0eab463 (AUDIT-2026-08-13.md, 28.61) : load_groups() faisait disparaître une journée entièrement écartée au lieu de la lister avec une liste vide, laissant sa vidéo déjà assemblée sur disque indéfiniment, jamais revue ni supprimée.""" from __future__ import annotations import datetime as dt import json import tempfile import unittest from pathlib import Path try: from zoneinfo import ZoneInfo except ImportError: # Python 3.8, édition Windows 7 from backports.zoneinfo import ZoneInfo import merge_daily def mp4_structurel() -> bytes: def boite(nom, contenu=b""): return (len(contenu) + 8).to_bytes(4, "big") + nom + contenu return ( boite(b"ftyp", b"isom\x00\x00\x02\x00isom") + boite(b"moov") + boite(b"mdat", b"video") ) class TestsJourneeEcartee(unittest.TestCase): def setUp(self) -> None: self.tmp = tempfile.TemporaryDirectory() self.addCleanup(self.tmp.cleanup) self.input_dir = Path(self.tmp.name) self.tz = ZoneInfo("Europe/Paris") def _ecrire_registre(self, clips: dict) -> None: chemin = self.input_dir / merge_daily.DOWNLOAD_STATE chemin.write_text(json.dumps({"clips": clips}), encoding="utf-8") def test_journee_entierement_ecartee_reste_listee_vide(self): self._ecrire_registre({ "a": {"path": "jardin/a.mp4", "camera": "jardin", "excluded": True, "created_at": "2026-08-10T10:00:00+00:00"}, }) groupes = merge_daily.load_groups(self.input_dir, self.tz) self.assertIn(("jardin", "2026-08-10"), groupes) self.assertEqual(groupes[("jardin", "2026-08-10")], []) def test_journee_partiellement_ecartee_ignore_pas_le_reste(self): clip_valide = self.input_dir / "jardin" / "b.mp4" clip_valide.parent.mkdir(parents=True) clip_valide.write_bytes(mp4_structurel()) self._ecrire_registre({ "a": {"path": "jardin/a.mp4", "camera": "jardin", "excluded": True, "created_at": "2026-08-10T09:00:00+00:00"}, "b": {"path": "jardin/b.mp4", "camera": "jardin", "excluded": False, "created_at": "2026-08-10T10:00:00+00:00"}, }) groupes = merge_daily.load_groups(self.input_dir, self.tz) self.assertEqual(len(groupes[("jardin", "2026-08-10")]), 1) self.assertEqual(groupes[("jardin", "2026-08-10")][0][1], clip_valide.resolve()) def test_journee_avec_clip_invalide_reste_listee_vide(self): # Chemin absent du disque : simule un clip disparu ou jamais # tombé, sans passer par « excluded » - même conséquence attendue. self._ecrire_registre({ "a": {"path": "jardin/absent.mp4", "camera": "jardin", "excluded": False, "created_at": "2026-08-10T10:00:00+00:00"}, }) groupes = merge_daily.load_groups(self.input_dir, self.tz) self.assertIn(("jardin", "2026-08-10"), groupes) self.assertEqual(groupes[("jardin", "2026-08-10")], []) if __name__ == "__main__": unittest.main(verbosity=2)