view kallithea/tests/models/test_notifications.py @ 5912:7483b3f3bea5

pytest migration: models: switch to standard assert statements Use unittest2pytest to replace unittest-style assert statements (e.g. assertEqual) with standard Python assert statements to benefit from pytest's improved reporting on assert failures. The conversion by unittest2pytest was correct except for: - 'import pytest' is not automatically added when needed - line wrapping in string formatting caused a syntax error in the transformed code. Reported upstream at https://github.com/pytest-dev/unittest2pytest/issues/3 . - in assertRaises with a lambda, the lambda needs to be removed
author Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
date Mon, 09 May 2016 17:44:34 +0200
parents be1d20bfd2dd
children fed129fb8533
line wrap: on
line source

from kallithea.tests import *

from kallithea.model.db import User, Notification, UserNotification
from kallithea.model.user import UserModel

from kallithea.model.meta import Session
from kallithea.model.notification import NotificationModel


class TestNotifications(TestControllerPytest):

    def setup_method(self, method):
        Session.remove()
        self.u1 = UserModel().create_or_update(username=u'u1',
                                        password=u'qweqwe',
                                        email=u'u1@example.com',
                                        firstname=u'u1', lastname=u'u1')
        Session().commit()
        self.u1 = self.u1.user_id

        self.u2 = UserModel().create_or_update(username=u'u2',
                                        password=u'qweqwe',
                                        email=u'u2@example.com',
                                        firstname=u'u2', lastname=u'u3')
        Session().commit()
        self.u2 = self.u2.user_id

        self.u3 = UserModel().create_or_update(username=u'u3',
                                        password=u'qweqwe',
                                        email=u'u3@example.com',
                                        firstname=u'u3', lastname=u'u3')
        Session().commit()
        self.u3 = self.u3.user_id

        remove_all_notifications()
        assert [] == Notification.query().all()
        assert [] == UserNotification.query().all()

    def test_create_notification(self):
        usrs = [self.u1, self.u2]
        notification = NotificationModel().create(created_by=self.u1,
                                           subject=u'subj', body=u'hi there',
                                           recipients=usrs)
        Session().commit()
        u1 = User.get(self.u1)
        u2 = User.get(self.u2)
        u3 = User.get(self.u3)
        notifications = Notification.query().all()
        assert len(notifications) == 1

        assert notifications[0].recipients == [u1, u2]
        assert notification.notification_id == notifications[0].notification_id

        unotification = UserNotification.query() \
            .filter(UserNotification.notification == notification).all()

        assert len(unotification) == len(usrs)
        assert set([x.user.user_id for x in unotification]) == set(usrs)

    def test_user_notifications(self):
        notification1 = NotificationModel().create(created_by=self.u1,
                                            subject=u'subj', body=u'hi there1',
                                            recipients=[self.u3])
        Session().commit()
        notification2 = NotificationModel().create(created_by=self.u1,
                                            subject=u'subj', body=u'hi there2',
                                            recipients=[self.u3])
        Session().commit()
        u3 = Session().query(User).get(self.u3)

        assert sorted([x.notification for x in u3.notifications]) == sorted([notification2, notification1])

    def test_delete_notifications(self):
        notification = NotificationModel().create(created_by=self.u1,
                                           subject=u'title', body=u'hi there3',
                                    recipients=[self.u3, self.u1, self.u2])
        Session().commit()
        notifications = Notification.query().all()
        assert notification in notifications

        Notification.delete(notification.notification_id)
        Session().commit()

        notifications = Notification.query().all()
        assert not notification in notifications

        un = UserNotification.query().filter(UserNotification.notification
                                             == notification).all()
        assert un == []

    def test_delete_association(self):
        notification = NotificationModel().create(created_by=self.u1,
                                           subject=u'title', body=u'hi there3',
                                    recipients=[self.u3, self.u1, self.u2])
        Session().commit()

        unotification = UserNotification.query() \
                            .filter(UserNotification.notification ==
                                    notification) \
                            .filter(UserNotification.user_id == self.u3) \
                            .scalar()

        assert unotification.user_id == self.u3

        NotificationModel().delete(self.u3,
                                   notification.notification_id)
        Session().commit()

        u3notification = UserNotification.query() \
                            .filter(UserNotification.notification ==
                                    notification) \
                            .filter(UserNotification.user_id == self.u3) \
                            .scalar()

        assert u3notification == None

        # notification object is still there
        assert Notification.query().all() == [notification]

        #u1 and u2 still have assignments
        u1notification = UserNotification.query() \
                            .filter(UserNotification.notification ==
                                    notification) \
                            .filter(UserNotification.user_id == self.u1) \
                            .scalar()
        assert u1notification != None
        u2notification = UserNotification.query() \
                            .filter(UserNotification.notification ==
                                    notification) \
                            .filter(UserNotification.user_id == self.u2) \
                            .scalar()
        assert u2notification != None

    def test_notification_counter(self):
        NotificationModel().create(created_by=self.u1,
                            subject=u'title', body=u'hi there_delete',
                            recipients=[self.u3, self.u1])
        Session().commit()

        assert NotificationModel().get_unread_cnt_for_user(self.u1) == 0
        assert NotificationModel().get_unread_cnt_for_user(self.u2) == 0
        assert NotificationModel().get_unread_cnt_for_user(self.u3) == 1

        notification = NotificationModel().create(created_by=self.u1,
                                           subject=u'title', body=u'hi there3',
                                    recipients=[self.u3, self.u1, self.u2])
        Session().commit()

        assert NotificationModel().get_unread_cnt_for_user(self.u1) == 0
        assert NotificationModel().get_unread_cnt_for_user(self.u2) == 1
        assert NotificationModel().get_unread_cnt_for_user(self.u3) == 2