#123: Sound Monitoring (#125)

110fac70a6 n'est pas lié à #123 (tu peux l'ignorer ici mais #122 (comment))

04f5c3208a : nettoyage d'anciens tests, je ne suis pas parvenu à rétablir le dernier, je l'ai préfixé avec broken_. Il y aurait aussi à supprimer/corriger aircox/tests/management/_test_sound_monitor.py

5a75f42808 : le correctif qui permet d'ajouter des sons dans une émission à l'aide de la commande `sounds_scan`.

Co-authored-by: Christophe Siraut <d@tobald.eu.org>
Reviewed-on: #125
Co-authored-by: Chris Tactic <chris@tacticasbl.be>
Co-committed-by: Chris Tactic <chris@tacticasbl.be>
This commit is contained in:
Chris Tactic 2023-11-08 18:38:49 +01:00 committed by Thomas Kairos
parent e690953b82
commit fd4c765dc4
4 changed files with 57 additions and 17 deletions

View File

@ -1,5 +1,4 @@
#! /usr/bin/env python3 #! /usr/bin/env python3
# TODO: SoundMonitor class
"""Monitor sound files; For each program, check for: """Monitor sound files; For each program, check for:
@ -60,10 +59,8 @@ class Command(BaseCommand):
) )
def handle(self, *args, **options): def handle(self, *args, **options):
SoundMonitor() monitor = SoundMonitor()
if options.get("scan"): if options.get("scan"):
self.scan() monitor.scan()
# if options.get('quality_check'):
# self.check_quality(check=(not options.get('scan')))
if options.get("monitor"): if options.get("monitor"):
self.monitor() monitor.monitor()

View File

@ -206,29 +206,48 @@ def monitor():
yield sound_monitor.SoundMonitor() yield sound_monitor.SoundMonitor()
class SoundMonitor: class TestSoundMonitor:
@pytest.mark.django_db
def test_report(self, monitor, program, logger): def test_report(self, monitor, program, logger):
monitor.report(program, "component", "content", logger=logger) monitor.report(program, "component", "content", logger=logger)
msg = f"{program}, component: content" msg = f"{program}, component: content"
assert logger._trace("info", args=True) == (msg,) assert logger._trace("info", args=True) == (msg,)
def test_scan(self, monitor, program, logger): @pytest.mark.django_db
def test_scan(self, monitor, programs, logger):
interface = Interface(None, {"scan_for_program": None}) interface = Interface(None, {"scan_for_program": None})
monitor.scan_for_program = interface.scan_for_program monitor.scan_for_program = interface.scan_for_program
dirs = monitor.scan(logger) dirs = monitor.scan(logger)
assert logger._traces("info") == ( assert logger._traces("info") == tuple(
"scan all programs...", [
f"#{program.id} {program.title}", (("scan all programs...",), {}),
) ]
assert dirs == [program.abspath] + [
assert interface._traces("scan_for_program") == ( ((f"#{program.id} {program.title}",), {})
((program, settings.SOUND_ARCHIVES_SUBDIR), {"logger": logger})( for program in programs
(program, settings.SOUND_EXCERPTS_SUBDIR), {"logger": logger} ]
) )
assert dirs == [program.abspath for program in programs]
traces = tuple(
[
[
(
(program, settings.SOUND_ARCHIVES_SUBDIR),
{"logger": logger, "type": Sound.TYPE_ARCHIVE},
),
(
(program, settings.SOUND_EXCERPTS_SUBDIR),
{"logger": logger, "type": Sound.TYPE_EXCERPT},
),
]
for program in programs
]
) )
traces_flat = tuple([item for sublist in traces for item in sublist])
assert interface._traces("scan_for_program") == traces_flat
def test_monitor(self, monitor, monitor_interfaces, logger): def broken_test_monitor(self, monitor, monitor_interfaces, logger):
def sleep(*args, **kwargs): def sleep(*args, **kwargs):
monitor.stop() monitor.stop()

View File

@ -0,0 +1,23 @@
import pytest
import os
from django.core.management import call_command
from django.conf import settings
wav = (
b"RIFF$\x00\x00\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x02\x00D\xac\x00\x00"
b"\x10\xb1\x02\x00\x04\x00\x10\x00data\x00\x00\x00\x00"
)
@pytest.mark.django_db
def test_adding_a_sound(programs, fs):
p0 = programs[0]
assert len(p0.sound_set.all()) == 0
s0 = os.path.join(
settings.PROJECT_ROOT, "static/media/%s/archives/sound.wav" % p0.path
)
fs.create_file(s0, contents=wav)
call_command("sounds_monitor", "-s")
assert len(p0.sound_set.all()) == 1

View File

@ -1,3 +1,4 @@
pytest~=7.2 pytest~=7.2
pytest-django~=4.5 pytest-django~=4.5
model_bakery~=1.10 model_bakery~=1.10
pyfakefs~=5.2