test_merge_daily_journee_ecartee.py
Rama main · réplica de lectura del repositorio original.
"""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)