mirror of
https://github.com/ae-utbm/sith.git
synced 2025-11-24 13:47:01 +00:00
65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
from datetime import timedelta
|
|
from operator import attrgetter
|
|
|
|
import pytest
|
|
from bs4 import BeautifulSoup
|
|
from django.test import Client, TestCase
|
|
from django.urls import reverse
|
|
from django.utils.timezone import now
|
|
from model_bakery import baker, seq
|
|
from pytest_django.asserts import assertRedirects
|
|
|
|
from core.baker_recipes import subscriber_user
|
|
from core.models import Notification
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestNotificationList(TestCase):
|
|
@classmethod
|
|
def setUpTestData(cls):
|
|
cls.user = subscriber_user.make()
|
|
url = reverse("core:user_profile", kwargs={"user_id": cls.user.id})
|
|
cls.notifs = baker.make(
|
|
Notification,
|
|
user=cls.user,
|
|
url=url,
|
|
viewed=False,
|
|
date=seq(now() - timedelta(days=1), timedelta(hours=1)),
|
|
_quantity=10,
|
|
_bulk_create=True,
|
|
)
|
|
|
|
def test_list(self):
|
|
self.client.force_login(self.user)
|
|
response = self.client.get(reverse("core:notification_list"))
|
|
assert response.status_code == 200
|
|
soup = BeautifulSoup(response.text, "lxml")
|
|
ul = soup.find("ul", id="notifications")
|
|
elements = list(ul.find_all("li"))
|
|
assert len(elements) == len(self.notifs)
|
|
notifs = sorted(self.notifs, key=attrgetter("date"), reverse=True)
|
|
for element, notif in zip(elements, notifs, strict=True):
|
|
assert element.find("a")["href"] == reverse(
|
|
"core:notification", kwargs={"notif_id": notif.id}
|
|
)
|
|
|
|
def test_read_all(self):
|
|
self.client.force_login(self.user)
|
|
response = self.client.get(
|
|
reverse("core:notification_list", query={"read_all": None})
|
|
)
|
|
assert response.status_code == 200
|
|
assert not self.user.notifications.filter(viewed=True).exists()
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_notification_redirect(client: Client):
|
|
user = subscriber_user.make()
|
|
url = reverse("core:user_profile", kwargs={"user_id": user.id})
|
|
notif = baker.make(Notification, user=user, url=url, viewed=False)
|
|
client.force_login(user)
|
|
response = client.get(reverse("core:notification", kwargs={"notif_id": notif.id}))
|
|
assertRedirects(response, url)
|
|
notif.refresh_from_db()
|
|
assert notif.viewed is True
|