diff --git a/aircox/tests/conftest.py b/aircox/tests/conftest.py index bb93cca..4c1a736 100644 --- a/aircox/tests/conftest.py +++ b/aircox/tests/conftest.py @@ -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] diff --git a/aircox/tests/models/test_diffusion.py b/aircox/tests/models/test_diffusion.py index 5af19a1..00d1a67 100644 --- a/aircox/tests/models/test_diffusion.py +++ b/aircox/tests/models/test_diffusion.py @@ -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 ?