en cours - test model diffusion

This commit is contained in:
Laurent Van Wambeke 2023-05-11 23:30:09 +02:00
parent 2a034fc467
commit 7bf2989090
2 changed files with 182 additions and 120 deletions

View File

@ -1,5 +1,9 @@
from datetime import time, timedelta from datetime import time, timedelta
import itertools import itertools
import random
import datetime
from django.utils import timezone as tz
import pytz
import pytest import pytest
from model_bakery import baker from model_bakery import baker
@ -100,3 +104,92 @@ def podcasts(episodes):
sound.file = f"test_sound_{episode.pk}_{i}.mp3" sound.file = f"test_sound_{episode.pk}_{i}.mp3"
items += sounds items += sounds
return items return items
@pytest.fixture
def diffusions_time_variation(episodes):
random_episode = random.choice([episodes[0], episodes[1], episodes[2]])
now_date = datetime.date.today()
now_datetime = tz.now()
tomorrow_datetime = now_datetime + timedelta(hours=25)
yesterday_datetime = now_datetime - timedelta(hours=25)
now_diffusion = baker.make(
models.Diffusion,
episode=random_episode,
start=now_datetime - timedelta(minutes=30),
end=now_datetime + timedelta(minutes=30),
)
after_diffusion = baker.make(
models.Diffusion,
episode=random_episode,
start=now_datetime + timedelta(minutes=30),
end=now_datetime + timedelta(minutes=60),
)
tomorrow_diffusion = baker.make(
models.Diffusion,
episode=random_episode,
start=tomorrow_datetime,
end=tomorrow_datetime + timedelta(minutes=30),
)
before_diffusion = baker.make(
models.Diffusion,
episode=random_episode,
start=now_datetime - timedelta(minutes=60),
end=now_datetime - timedelta(minutes=30),
)
yesterday_diffusion = baker.make(
models.Diffusion,
episode=random_episode,
start=yesterday_datetime,
end=yesterday_datetime + timedelta(minutes=30),
)
return (
now_date,
now_datetime,
yesterday_diffusion,
before_diffusion,
now_diffusion,
after_diffusion,
tomorrow_diffusion,
)
@pytest.fixture
def diffusions_episode_variation(episodes):
key_episode = episodes[1]
another_episode = episodes[2]
diffusions_with_the_key_episode = baker.make(
models.Diffusion, _quantity=3, episode=key_episode
)
diffusions_without_the_key_episode = baker.make(
models.Diffusion, _quantity=3, episode=another_episode
)
return (
key_episode,
another_episode,
diffusions_with_the_key_episode,
diffusions_without_the_key_episode,
)
@pytest.fixture
def diffusions_with_rerun(episodes, programs):
initial_diffusion = baker.make(
models.Diffusion,
program=programs[0],
episode=episodes[0],
start=datetime.datetime(2023, 5, 12, 13, 0, tzinfo=pytz.UTC),
end=datetime.datetime(2023, 5, 12, 13, 30, tzinfo=pytz.UTC),
)
rerun_diffusion = baker.make(
models.Diffusion,
program=programs[0],
episode=episodes[0],
initial=initial_diffusion,
)
return initial_diffusion, rerun_diffusion
@pytest.fixture
def diffusion(diffusions_with_rerun):
return diffusions_with_rerun[0]

View File

@ -5,73 +5,7 @@ from model_bakery import baker
from django.utils import timezone as tz from django.utils import timezone as tz
from datetime import timedelta from datetime import timedelta
import pytz import pytz
from aircox.models import Diffusion, Episode from aircox.models import Diffusion
#TODO fixture for rerun diffusion
@pytest.fixture
def diffusions_time_variation(episodes):
random_episode = random.choice([episodes[1], episodes[0], episodes[2]])
now_date = datetime.date.today()
now_datetime = tz.now()
tomorrow_datetime = now_datetime + timedelta(hours=25)
yesterday_datetime = now_datetime - timedelta(hours=25)
now_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=now_datetime - timedelta(minutes=30),
end=now_datetime + timedelta(minutes=30),
)
after_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=now_datetime + timedelta(minutes=30),
end=now_datetime + timedelta(minutes=60),
)
tomorrow_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tomorrow_datetime,
end=tomorrow_datetime + timedelta(minutes=30),
)
before_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=now_datetime - timedelta(minutes=60),
end=now_datetime - timedelta(minutes=30),
)
yesterday_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=yesterday_datetime,
end=yesterday_datetime + timedelta(minutes=30),
)
return (
now_date,
now_datetime,
yesterday_diffusion,
before_diffusion,
now_diffusion,
after_diffusion,
tomorrow_diffusion,
)
@pytest.fixture
def diffusions_episode_variation(episodes):
key_episode = episodes[1]
another_episode = episodes[2]
diffusions_with_the_key_episode = baker.make(
Diffusion, _quantity=3, episode=key_episode
)
diffusions_without_the_key_episode = baker.make(
Diffusion, _quantity=3, episode=another_episode
)
return (
key_episode,
another_episode,
diffusions_with_the_key_episode,
diffusions_without_the_key_episode,
)
class TestDiffusionQuerySet: class TestDiffusionQuerySet:
@ -118,11 +52,7 @@ class TestDiffusionQuerySet:
assert diffusion.type == Diffusion.TYPE_ON_AIR assert diffusion.type == Diffusion.TYPE_ON_AIR
assert diffusion.type != Diffusion.TYPE_UNCONFIRMED assert diffusion.type != Diffusion.TYPE_UNCONFIRMED
# la méthode "now" filtre les diffusions en cours d'un moment précis. # TODO test si il y a doublon qu'un seul objet soit récupéré.
# elle prend en compte un objet datetime (date + heure)
# les diffusions en cours sont définie en fonction de l'argument "now" ou de l'heure actuelle si now=None.
# la méthode distinct élimine les doublons de diffusions (si ils ont des valeurs identiques pour tous les champs de la db)
# TODO test si il y a doublon qu'un seul objet soit récupéré.
@pytest.mark.django_db @pytest.mark.django_db
def test_now_test(self, diffusions_time_variation): def test_now_test(self, diffusions_time_variation):
now = tz.now() now = tz.now()
@ -141,11 +71,6 @@ class TestDiffusionQuerySet:
assert result[0] == now_diffusion assert result[0] == now_diffusion
assert result[0].start <= now <= result[0].end assert result[0].start <= now <= result[0].end
# méthode date filtre les diffusions en cours d'une date précise.
# elle ne prend pas en compte un objet datetime mais un "objet date" uniquement
# elle crée deux objets datetime (start and end) à partir de l'argument "date" (if none = today)
# elle utilise la méthode "combine" de la classe "datetime" pour créer ces deux objets à partir de la date
# elle filtre ensuite les diffusions qui ont lieu entre "start" et "end".
@pytest.mark.django_db @pytest.mark.django_db
def test_date_without_date_arg(self, diffusions_time_variation): def test_date_without_date_arg(self, diffusions_time_variation):
( (
@ -182,9 +107,6 @@ class TestDiffusionQuerySet:
assert len(result) == 1 assert len(result) == 1
assert result[0] == tomorrow_diffusion assert result[0] == tomorrow_diffusion
# la méthode at récupère les diffusions à une date donnée.
# elle utilise la méthode now si la date est un objet datetime
# elle utilise la méthode date si la date est un objet date
@pytest.mark.django_db @pytest.mark.django_db
def test_at_datetimeobj(self, diffusions_time_variation): def test_at_datetimeobj(self, diffusions_time_variation):
( (
@ -358,7 +280,6 @@ class TestDiffusionQuerySet:
start=start, start=start,
end=end + timedelta(minutes=30), end=end + timedelta(minutes=30),
) )
range_diffusion = Diffusion.objects.range(start=start, end=end) range_diffusion = Diffusion.objects.range(start=start, end=end)
assert before_diffusion in range_diffusion assert before_diffusion in range_diffusion
@ -372,56 +293,104 @@ class TestDiffusionQuerySet:
class TestDiffusion: class TestDiffusion:
@pytest.mark.django_db @pytest.mark.django_db
def test__str__initial_diffusion(self, programs): def test__str__initial_diffusion(self, diffusions_with_rerun):
episode = baker.make( (
Episode, program=programs[0], title="Episode title" initial_diffusion,
_,
) = diffusions_with_rerun
initial_diffusion.episode.title = "Episode title"
initial_diffusion.start = datetime.datetime(
2023, 5, 12, 13, 0, tzinfo=pytz.UTC
) )
diffusion = baker.make( assert (
Diffusion, initial_diffusion.__str__()
episode=episode, == "Episode title - 2023/05/12 13:00+0000"
start=datetime.datetime(2023, 5, 12, 13, 0, tzinfo=pytz.UTC),
) )
expected_str = "Episode title - 2023/05/12 13:00+0000"
returned_str = diffusion.__str__()
assert expected_str == returned_str
@pytest.mark.django_db @pytest.mark.django_db
def test__str__rerun_diffusion(self, programs): def test__str__rerun_diffusion(self, diffusions_with_rerun):
episode = baker.make( (
Episode, program=programs[0], title="Episode title" initial_diffusion,
rerun_diffusion,
) = diffusions_with_rerun
initial_diffusion.episode.title = "Episode title"
rerun_diffusion.start = datetime.datetime(
2023, 5, 12, 13, 0, tzinfo=pytz.UTC
) )
initial_diffusion = baker.make(Diffusion, episode=episode) assert (
rerun_diffusion = baker.make( rerun_diffusion.__str__()
Diffusion, == "Episode title - 2023/05/12 13:00+0000 (rerun)"
episode=episode,
start=datetime.datetime(2023, 5, 12, 13, 0, tzinfo=pytz.UTC),
initial=initial_diffusion,
) )
expected_str = "Episode title - 2023/05/12 13:00+0000 (rerun)"
returned_str = rerun_diffusion.__str__()
assert expected_str == returned_str
# dans la méthode self._initial[valeur] est un dictionnaire qui stocke les valeurs initiales des champs de l'objet au moment de sa création # dans la méthode self._initial[valeur] est un dictionnaire qui stocke les valeurs initiales des champs de l'objet au moment de sa création
# save # save
# si diffusion est initial et si son épisode a été modifié depuis la création initiale # si diffusion est initial et si son épisode a été modifié depuis la création initiale
# la méthode save update l'épisode et le programme sur paramètre initial (rerun_set) de la rediffusion (qui représente l'objet diffusion initial). # la méthode save update l'épisode et le programme sur paramètre initial (rerun_set) de la rediffusion (qui représente l'objet diffusion initial).
""" je ne comprends pas rerun_set.update, que la méthode l'update ou pas, on accède quand même à l'épisode mis à jour sur la diffusion initiale""" """ je ne comprends pas rerun_set.update, que la méthode l'update ou pas, on accède quand même à l'épisode mis à jour sur la diffusion initiale"""
@pytest.mark.django_db
def test_save_rerun_diffusion(self, episodes, programs):
initial_diffusion = baker.make(
Diffusion, program=programs[0], episode=episodes[0]
)
rerun_diffusion = baker.make(
Diffusion,
program=programs[0],
episode=episodes[0],
initial=initial_diffusion,
)
initial_diffusion.episode = episodes[1]
initial_diffusion.program = programs[1]
initial_diffusion.save()
@pytest.mark.django_db
def test_save_rerun_diffusion(self, episodes, diffusions_with_rerun):
(
initial_diffusion,
rerun_diffusion,
) = diffusions_with_rerun
initial_diffusion.episode = episodes[1]
initial_diffusion.program = episodes[1].program
initial_diffusion.save()
assert rerun_diffusion.initial.episode == episodes[1] assert rerun_diffusion.initial.episode == episodes[1]
assert rerun_diffusion.initial.program == programs[1] assert rerun_diffusion.initial.program == episodes[1].program
@pytest.mark.django_db
def test_save_rerun(self, diffusions_with_rerun):
(
initial_diffusion,
rerun_diffusion,
) = diffusions_with_rerun
rerun_diffusion.save_rerun()
assert rerun_diffusion.episode == initial_diffusion.episode
@pytest.mark.django_db
def test_save_initial(self, diffusions_with_rerun):
(
initial_diffusion,
rerun_diffusion,
) = diffusions_with_rerun
initial_diffusion.save_initial()
assert initial_diffusion.program == initial_diffusion.episode.program
@pytest.mark.django_db
def test_duration(self, diffusion):
assert diffusion.duration == datetime.timedelta(seconds=1800)
@pytest.mark.django_db
def test_date(self, diffusion):
assert diffusion.date == datetime.date(2023, 5, 12)
@pytest.mark.django_db
def test_local_start(self, diffusion):
assert diffusion.local_start == datetime.datetime(
2023, 5, 12, 13, 00, tzinfo=pytz.UTC
)
@pytest.mark.django_db
def test_local_end(self, diffusion):
assert diffusion.local_end == datetime.datetime(
2023, 5, 12, 13, 30, tzinfo=pytz.UTC
)
@pytest.mark.django_db
def test_is_now(self, diffusion):
diffusion.type = Diffusion.TYPE_ON_AIR
diffusion.start = tz.now()
diffusion.end = tz.now() + timedelta(minutes=30)
assert diffusion.is_now == True
@pytest.mark.django_db
def test_is_live(self, diffusion):
diffusion.type = Diffusion.TYPE_ON_AIR
diffusion.episode.sound_set == None
assert diffusion.is_live == True
# on ne peut pas changer l'heure de diffusion ?
# souci avec save
# un autre souci ailleurs : est overlaping devrait être testé partout aussi ?