Files
aircox-radiocampus/aircox/tests/models/test_diffusion.py
2023-05-11 10:49:50 +02:00

226 lines
8.7 KiB
Python

import pytest
import random
import datetime
from model_bakery import baker
from django.utils import timezone as tz
from datetime import timedelta
from aircox.models import Diffusion
#TODO créer fixtures pour éviter toutes ces lignes pour créer les fake db.
class TestDiffusionQuerySet:
@pytest.mark.django_db
def test_episode_by_obj(self, 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
)
result = Diffusion.objects.episode(episode=key_episode)
for diffusion in diffusions_with_the_key_episode:
assert diffusion in result
for diffusion in diffusions_without_the_key_episode:
assert diffusion not in result
@pytest.mark.django_db
def test_episode_by_id(self, 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
)
result = Diffusion.objects.episode(id=key_episode.id)
for diffusion in diffusions_with_the_key_episode:
assert diffusion in result
for diffusion in diffusions_without_the_key_episode:
assert diffusion not in result
@pytest.mark.django_db
def test_on_air(self, episodes):
for episode in episodes:
random_type = random.choice(
[Diffusion.TYPE_ON_AIR, Diffusion.TYPE_UNCONFIRMED]
)
baker.make(Diffusion, episode=episode, type=random_type)
result = Diffusion.objects.on_air()
for diffusion in result:
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é.
@pytest.mark.django_db
def test_now(self, episodes):
now = tz.now()
random_episode = random.choice([episodes[1], episodes[0], episodes[2]])
now_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=now - timedelta(minutes=30),
end=now + timedelta(minutes=30),
)
after_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=now + timedelta(minutes=30),
end=now + timedelta(minutes=60),
)
before_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=now - timedelta(minutes=60),
end=now - timedelta(minutes=30),
)
result = Diffusion.objects.now(now=now, order=True)
assert len(result) == 1
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, episodes):
today = datetime.date.today()
tomorrow = today + timedelta(days=1)
random_episode = random.choice([episodes[1], episodes[0], episodes[2]])
second_today_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tz.datetime.combine(today, datetime.time.min)
+ timedelta(minutes=30),
end=tz.datetime.combine(today, datetime.time.max)
+ timedelta(minutes=60),
)
first_today_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tz.datetime.combine(today, datetime.time.min),
end=tz.datetime.combine(today, datetime.time.max)
+ timedelta(minutes=30),
)
another_day_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tz.datetime.combine(tomorrow, datetime.time.min),
end=tz.datetime.combine(tomorrow, datetime.time.max),
)
result = Diffusion.objects.date()
assert len(result) == 2
assert result[0] == first_today_diffusion
assert result[1] == second_today_diffusion
@pytest.mark.django_db
def test_date_with_date_arg(self, episodes):
today = datetime.date.today()
tomorrow = today + timedelta(days=1)
random_episode = random.choice([episodes[1], episodes[0], episodes[2]])
today_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tz.datetime.combine(today, datetime.time.min)
- timedelta(minutes=30),
end=tz.datetime.combine(today, datetime.time.min)
+ timedelta(minutes=30),
)
second_tomorrow_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tz.datetime.combine(tomorrow, datetime.time.min)
+ timedelta(minutes=30),
end=tz.datetime.combine(tomorrow, datetime.time.min)
+ timedelta(minutes=60),
)
first_tomorrow_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tz.datetime.combine(tomorrow, datetime.time.min),
end=tz.datetime.combine(tomorrow, datetime.time.min)
+ timedelta(minutes=60),
)
result = Diffusion.objects.date(date=tomorrow)
assert len(result) == 2
assert result[0] == first_tomorrow_diffusion
assert result[1] == second_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, episodes):
random_episode = random.choice([episodes[1], episodes[0], episodes[2]])
today_dt = datetime.datetime.today()
now_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=today_dt - timedelta(minutes=30),
end=today_dt + timedelta(minutes=30),
)
after_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=today_dt + timedelta(minutes=30),
end=today_dt + timedelta(minutes=60),
)
before_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=today_dt - timedelta(minutes=60),
end=today_dt - timedelta(minutes=30),
)
result = Diffusion.objects.at(date=today_dt)
assert now_diffusion in result
@pytest.mark.django_db
def test_at_dateobj(self, episodes):
today_d = datetime.date.today()
tomorrow_d = today_d + timedelta(days=1)
random_episode = random.choice([episodes[1], episodes[0], episodes[2]])
second_today_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tz.datetime.combine(today_d, datetime.time.min)
+ timedelta(minutes=30),
end=tz.datetime.combine(today_d, datetime.time.max)
+ timedelta(minutes=60),
)
first_today_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tz.datetime.combine(today_d, datetime.time.min),
end=tz.datetime.combine(today_d, datetime.time.max)
+ timedelta(minutes=30),
)
another_day_diffusion = baker.make(
Diffusion,
episode=random_episode,
start=tz.datetime.combine(tomorrow_d, datetime.time.min),
end=tz.datetime.combine(tomorrow_d, datetime.time.max),
)
result = Diffusion.objects.at(date=today_d)
assert len(result) == 2
assert result[0] == first_today_diffusion
assert result[1] == second_today_diffusion