vbv/server/vbv_lernwelt/notify/tests/test_notify_api.py

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)