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
import itertools
import random
import datetime
from django.utils import timezone as tz
import pytz
import pytest
from model_bakery import baker
@ -100,3 +104,92 @@ def podcasts(episodes):
sound.file = f"test_sound_{episode.pk}_{i}.mp3"
items += sounds
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 datetime import timedelta
import pytz
from aircox.models import Diffusion, Episode
#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,
)
from aircox.models import Diffusion
class TestDiffusionQuerySet:
@ -118,11 +52,7 @@ class TestDiffusionQuerySet:
assert diffusion.type == Diffusion.TYPE_ON_AIR
assert diffusion.type != Diffusion.TYPE_UNCONFIRMED
# la méthode "now" filtre les diffusions en cours d'un moment précis.
# 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é.
# TODO test si il y a doublon qu'un seul objet soit récupéré.
@pytest.mark.django_db
def test_now_test(self, diffusions_time_variation):
now = tz.now()
@ -141,11 +71,6 @@ class TestDiffusionQuerySet:
assert result[0] == now_diffusion
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
def test_date_without_date_arg(self, diffusions_time_variation):
(
@ -182,9 +107,6 @@ class TestDiffusionQuerySet:
assert len(result) == 1
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
def test_at_datetimeobj(self, diffusions_time_variation):
(
@ -358,7 +280,6 @@ class TestDiffusionQuerySet:
start=start,
end=end + timedelta(minutes=30),
)
range_diffusion = Diffusion.objects.range(start=start, end=end)
assert before_diffusion in range_diffusion
@ -372,56 +293,104 @@ class TestDiffusionQuerySet:
class TestDiffusion:
@pytest.mark.django_db
def test__str__initial_diffusion(self, programs):
episode = baker.make(
Episode, program=programs[0], title="Episode title"
def test__str__initial_diffusion(self, diffusions_with_rerun):
(
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(
Diffusion,
episode=episode,
start=datetime.datetime(2023, 5, 12, 13, 0, tzinfo=pytz.UTC),
assert (
initial_diffusion.__str__()
== "Episode title - 2023/05/12 13:00+0000"
)
expected_str = "Episode title - 2023/05/12 13:00+0000"
returned_str = diffusion.__str__()
assert expected_str == returned_str
@pytest.mark.django_db
def test__str__rerun_diffusion(self, programs):
episode = baker.make(
Episode, program=programs[0], title="Episode title"
def test__str__rerun_diffusion(self, diffusions_with_rerun):
(
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)
rerun_diffusion = baker.make(
Diffusion,
episode=episode,
start=datetime.datetime(2023, 5, 12, 13, 0, tzinfo=pytz.UTC),
initial=initial_diffusion,
assert (
rerun_diffusion.__str__()
== "Episode title - 2023/05/12 13:00+0000 (rerun)"
)
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
# save
# 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).
""" 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.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 ?