Skip to content

Commit

Permalink
Merge pull request #278 from uchicago-cs/users/notifications-tests
Browse files Browse the repository at this point in the history
Unit tests for Notification model
  • Loading branch information
elizabethli31 authored Nov 29, 2023
2 parents 7b4d4ae + b2b4605 commit 760320e
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 2 deletions.
55 changes: 54 additions & 1 deletion src/chigame/users/tests/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@
from typing import Any

from django.contrib.auth import get_user_model
from factory import Faker, post_generation
from django.contrib.contenttypes.models import ContentType
from factory import Faker, LazyAttribute, SubFactory, lazy_attribute, post_generation
from factory.django import DjangoModelFactory

from chigame.users.models import FriendInvitation, Notification


class UserFactory(DjangoModelFactory):
email = Faker("email")
Expand All @@ -29,3 +32,53 @@ def password(self, create: bool, extracted: Sequence[Any], **kwargs):
class Meta:
model = get_user_model()
django_get_or_create = ["email"]


class FriendInvitationFactory(DjangoModelFactory):
class Meta:
model = FriendInvitation

sender = SubFactory(UserFactory)
accepted = Faker("boolean")
timestamp = Faker("date_time_this_year")

@lazy_attribute
def receiver(self):
return FriendInvitationFactory.get_different_user(self.sender)

@staticmethod
def get_different_user(sender):
receiver = sender
while receiver.pk == sender.pk:
receiver = UserFactory()
return receiver


class BaseNotificationFactory(DjangoModelFactory):
class Meta:
model = Notification

receiver = SubFactory(UserFactory)
first_sent = last_sent = Faker("date_time_this_year")
type = Faker(
"random_element",
elements=[
Notification.FRIEND_REQUEST,
Notification.REMINDER,
Notification.UPCOMING_MATCH,
Notification.MATCH_PROPOSAL,
Notification.GROUP_INVITATION,
],
)
read = False
visible = True
message = Faker("sentence")


class FriendInvitationNotificationFactory(BaseNotificationFactory):
class Params:
actor = SubFactory(FriendInvitationFactory)

actor = LazyAttribute(lambda x: x.actor)
actor_content_type = LazyAttribute(lambda x: ContentType.objects.get(model=x.actor._meta.model_name))
actor_object_id = LazyAttribute(lambda x: x.actor.pk)
116 changes: 115 additions & 1 deletion src/chigame/users/tests/test_models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,119 @@
from chigame.users.models import User
import pytest

from chigame.users.models import Notification, User

from .factories import FriendInvitationFactory, FriendInvitationNotificationFactory, UserFactory


def test_user_get_absolute_url(user: User):
assert user.get_absolute_url() == f"/users/{user.pk}/"


@pytest.mark.django_db
def test_friendinvitation_notification_attrs():
notification = FriendInvitationNotificationFactory.create()
assert notification.read is False
assert notification.visible is True
assert (
not notification.first_sent > notification.last_sent
) # not comparing equality because last_sent is created after first_sent
# and they will be different by just a little bit
notification.renew_notification()
assert notification.first_sent < notification.last_sent


@pytest.mark.django_db
def test_friendinvitation_notification_mark_x_methods():
notification = FriendInvitationNotificationFactory.create()

notification.mark_as_read()
assert notification.read is True

notification.mark_as_unread()
assert notification.read is False

notification.mark_as_deleted()
assert notification.visible is False


@pytest.mark.django_db
def test_notificationqueryset_filter_by_receiver():
user1 = UserFactory()
user2 = UserFactory()
user3 = UserFactory()
FriendInvitationNotificationFactory.create_batch(5, receiver=user1)
FriendInvitationNotificationFactory.create_batch(4, receiver=user2)
assert len(Notification.objects.filter_by_receiver(user1)) == 5
assert len(Notification.objects.filter_by_receiver(user2)) == 4
assert len(Notification.objects.filter_by_receiver(user3)) == 0


@pytest.mark.django_db
def test_notificationqueryset_filter_by_actor():
friendinvitation1 = FriendInvitationFactory()
friendinvitation2 = FriendInvitationFactory()
friendinvitation3 = FriendInvitationFactory()

FriendInvitationNotificationFactory.create_batch(5, actor=friendinvitation1)
FriendInvitationNotificationFactory.create_batch(4, actor=friendinvitation2)

assert len(Notification.objects.filter_by_actor(friendinvitation1)) == 5
assert len(Notification.objects.filter_by_actor(friendinvitation2)) == 4
assert len(Notification.objects.filter_by_actor(friendinvitation3)) == 0


@pytest.mark.django_db
def test_notificationqueryset_get_by_actor():
friendinvitation1 = FriendInvitationFactory()
friendinvitation2 = FriendInvitationFactory()
friendinvitation3 = FriendInvitationFactory()

FriendInvitationNotificationFactory.create_batch(5, actor=friendinvitation1)
FriendInvitationNotificationFactory.create_batch(1, actor=friendinvitation2)

with pytest.raises(Exception):
Notification.objects.get_by_actor(friendinvitation1)
Notification.objects.get_by_actor(friendinvitation3)

assert len(Notification.objects.filter_by_actor(friendinvitation2)) == 1


@pytest.mark.django_db
def test_notificationqueryset_mark_x_methods():
FriendInvitationNotificationFactory.create_batch(5)
notifications = Notification.objects.all()

notifications.mark_all_read()
for notification in notifications:
assert notification.read is True

notifications.mark_all_unread()
for notification in notifications:
assert notification.read is False

notifications.mark_all_deleted()
for notification in notifications:
assert notification.visible is False


@pytest.mark.django_db
def test_notificationqueryset_is_x_methods():
FriendInvitationNotificationFactory.create_batch(5)
notifications = Notification.objects.all()

assert len(Notification.objects.is_unread()) == 5
assert len(Notification.objects.is_read()) == 0
assert len(Notification.objects.is_deleted()) == 0
assert len(Notification.objects.is_not_deleted()) == 5

notifications.mark_all_read()
assert len(Notification.objects.is_unread()) == 0
assert len(Notification.objects.is_read()) == 5

notifications.mark_all_deleted()
assert len(Notification.objects.is_deleted()) == 5
assert len(Notification.objects.is_not_deleted()) == 0

notifications.restore_all_deleted()
assert len(Notification.objects.is_deleted()) == 0
assert len(Notification.objects.is_not_deleted()) == 5

0 comments on commit 760320e

Please sign in to comment.