140 lines
4.8 KiB
Python
140 lines
4.8 KiB
Python
import json
|
|
|
|
from rest_framework.test import APITestCase
|
|
|
|
from vbv_lernwelt.core.admin import User
|
|
from vbv_lernwelt.core.tests.factories import UserFactory
|
|
from vbv_lernwelt.notify.models import Notification, NotificationCategory
|
|
from vbv_lernwelt.notify.tests.factories import NotificationFactory
|
|
|
|
|
|
class TestNotificationApi(APITestCase):
|
|
def setUp(self) -> None:
|
|
alice = UserFactory(username="Alice", email="alice@gmail.com")
|
|
john = UserFactory(username="John Doe", email="john.doe@gmail.com")
|
|
|
|
self.user = User.objects.get(username="Alice")
|
|
self.client.login(username="Alice", password="pw")
|
|
self.alice = alice
|
|
self.john = john
|
|
|
|
def create_default_notifications(self):
|
|
NotificationFactory(
|
|
recipient=self.john, verb="{} hat einen neuen Beitrag erfasst"
|
|
)
|
|
NotificationFactory(
|
|
recipient=self.john,
|
|
actor=self.alice,
|
|
verb="hat einen Tranverauftrag erstellt",
|
|
)
|
|
NotificationFactory(
|
|
recipient=self.alice,
|
|
actor=self.john,
|
|
verb="{} hat deinen Beitrag kommentiert",
|
|
unread=False,
|
|
)
|
|
NotificationFactory(
|
|
recipient=self.alice,
|
|
actor=self.john,
|
|
verb="{} ist ganz klein geworden",
|
|
unread=True,
|
|
)
|
|
|
|
def test_get_all_only_returns_logged_in_user_notification(self):
|
|
self.create_default_notifications()
|
|
response = self.client.get("/notifications/api/all_list/")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
data = response.json()
|
|
|
|
self.assertTrue(data["all_count"] < Notification.objects.count())
|
|
self.assertEqual(2, data["all_count"])
|
|
self.assertTrue(
|
|
all(
|
|
[
|
|
str(self.alice.id) == notification["recipient"]
|
|
for notification in data["all_list"]
|
|
]
|
|
)
|
|
)
|
|
self.assertEqual("John Doe", data["all_list"][0]["actor"])
|
|
|
|
def test_get_all_pagination(self):
|
|
num_notifications = 322
|
|
for _ in range(num_notifications):
|
|
NotificationFactory(
|
|
recipient=self.alice,
|
|
actor=self.john,
|
|
verb="{} ist ganz klein geworden",
|
|
unread=True,
|
|
)
|
|
|
|
response = self.client.get("/notifications/api/all_list/?max=10")
|
|
data = response.json()
|
|
|
|
self.assertEqual(num_notifications, data["all_count"])
|
|
self.assertEqual(len(data["all_list"]), 10)
|
|
|
|
def test_get_unread_pagination(self):
|
|
unread_notifications = 120
|
|
for _ in range(unread_notifications):
|
|
NotificationFactory(
|
|
recipient=self.alice,
|
|
actor=self.john,
|
|
verb="{} ist ganz klein geworden",
|
|
unread=True,
|
|
)
|
|
|
|
while unread_notifications > 0:
|
|
to_read_at_once = 12
|
|
# Read to_read_at_once unread notifications at a time
|
|
data = self.client.get(
|
|
f"/notifications/api/unread_list/?max={to_read_at_once}&mark_as_read=true"
|
|
).json()
|
|
self.assertEqual(len(data["unread_list"]), to_read_at_once)
|
|
unread_notifications -= to_read_at_once
|
|
|
|
response = self.client.get("/notifications/api/unread_count/")
|
|
unread_count = response.json()["unread_count"]
|
|
self.assertEqual(unread_count, unread_notifications)
|
|
|
|
def test_unread_count(self):
|
|
self.create_default_notifications()
|
|
response = self.client.get("/notifications/api/unread_count/")
|
|
unread_count = response.json()["unread_count"]
|
|
self.assertEqual(unread_count, 1)
|
|
|
|
|
|
class TestNotificationSettingsApi(APITestCase):
|
|
def setUp(self) -> None:
|
|
username = "Alice"
|
|
UserFactory(username=username, email="alice@gmail.com")
|
|
|
|
self.user = User.objects.get(username=username)
|
|
self.client.login(username=username, password="pw")
|
|
|
|
def test_store_retrieve_settings(self):
|
|
notification_settings = json.dumps(
|
|
[NotificationCategory.INFORMATION, NotificationCategory.PROGRESS]
|
|
)
|
|
|
|
api_path = "/api/notify/email_notification_settings/"
|
|
response = self.client.post(
|
|
api_path,
|
|
notification_settings,
|
|
format="json",
|
|
)
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.json(), notification_settings)
|
|
self.user.refresh_from_db()
|
|
self.assertEqual(
|
|
self.user.additional_json_data["email_notification_categories"],
|
|
notification_settings,
|
|
)
|
|
|
|
response = self.client.get(
|
|
api_path,
|
|
format="json",
|
|
)
|
|
self.assertEqual(response.json(), notification_settings)
|