class TestResourceHandling(ActivityTestCase):

    def setUp(self):
        super(TestResourceHandling, self).setUp()
        self.center = NotificationCenter()

    def test_add_watcher_to_a_resource(self):
        hugo = create(Builder('watcher').having(actorid='hugo'))
        create(Builder('watcher').having(actorid='peter'))
        res = create(Builder('resource').oguid('fd:1234'))

        res.add_watcher('hugo', TASK_ISSUER_ROLE)
        self.assertEquals([hugo], res.watchers)

    def test_fetch_return_resource_by_means_of_oguid(self):
        resource_a = create(Builder('resource').oguid('fd:123'))
        resource_b = create(Builder('resource').oguid('fd:456'))

        self.assertEquals(resource_a,
                          self.center.fetch_resource(Oguid('fd', '123')))
        self.assertEquals(resource_b,
                          self.center.fetch_resource(Oguid('fd', '456')))

    def test_fetch_return_none_when_resource_not_exists(self):
        self.assertEquals(None,
                          self.center.fetch_resource(Oguid('fd', '123')))

    def test_adding(self):
        resource = self.center.add_resource(Oguid('fd', '123'))

        self.assertEquals(1, len(Resource.query.all()))
        resource = Resource.query.first()
        self.assertEquals(Oguid('fd', '123'), resource.oguid)
        self.assertEquals('fd', resource.admin_unit_id)
        self.assertEquals(123, resource.int_id)
Esempio n. 2
0
    def setUp(self):
        super(TestNotificationHandling, self).setUp()

        self.center = NotificationCenter()

        self.peter = create(Builder('ogds_user').id('peter'))
        self.peter = create(Builder('watcher').having(actorid='peter'))
        self.hugo = create(Builder('ogds_user').id('hugo'))
        self.hugo = create(Builder('watcher').having(actorid='hugo'))

        self.resource_a = create(
            Builder('resource').oguid('fd:123').watchers(
                [self.hugo, self.peter]))
        self.resource_b = create(
            Builder('resource').oguid('fd:456').watchers([self.hugo]))
        self.resource_c = create(
            Builder('resource').oguid('fd:789').watchers([self.peter]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'), 'task-added', {
                'en': 'Kennzahlen 2014 erfassen'
            }, {
                'en': 'Task added'
            }, {
                'en': 'Task bla added by Peter'
            }, 'hugo.boss', {
                'en': None
            }).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'), 'task-transition-open-in-progress', {
                'en': 'Kennzahlen 2015 erfassen'
            }, {
                'en': 'Task accepted'
            }, {
                'en': 'Task bla accepted by Peter'
            }, 'peter.mueller', {
                'en': None
            }).get('activity')

        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'), 'task-added', {
                'en': 'Besprechung Gesuch'
            }, {
                'en': 'Task added'
            }, {
                'en': 'Task for added by Peter'
            }, 'peter.mueller', {
                'en': None
            }).get('activity')

        self.activity_4 = self.center.add_activity(
            Oguid('fd', '789'), 'task-added', {
                'en': 'Vorbereitung Besprechung'
            }, {
                'en': 'Task added'
            }, {
                'en': 'Task bla accepted by Franz'
            }, 'franz.meier', {
                'en': None
            }).get('activity')
Esempio n. 3
0
    def setUp(self):
        super(TestMarkAsRead, self).setUp()
        with self.login(self.regular_user):
            self.center = NotificationCenter()
            self.watcher = create(
                Builder('watcher').having(actorid=self.regular_user.id))
            oguid = Oguid.for_object(self.task)
            self.resource = create(
                Builder('resource').oguid(oguid.id).watchers([self.watcher]))

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_FIRST):
                self.activity_1 = create(
                    Builder('activity').having(resource=self.resource,
                                               created=FREEZE_TIME_FIRST))
                create(
                    Builder('notification').id(1).having(
                        activity=self.activity_1,
                        userid=self.regular_user.id,
                    ))

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_SECOND):
                self.activity_2 = create(
                    Builder('activity').having(resource=self.resource,
                                               created=FREEZE_TIME_SECOND))
                create(
                    Builder('notification').id(2).having(
                        activity=self.activity_2,
                        userid=self.regular_user.id,
                    ))

            self.notifications = self.center.get_users_notifications(
                self.regular_user.id)
Esempio n. 4
0
class TestResourceHandling(ActivityTestCase):

    def setUp(self):
        super(TestResourceHandling, self).setUp()
        self.center = NotificationCenter()

    def test_add_watcher_to_a_resource(self):
        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))
        res = create(Builder('resource').oguid('fd:1234'))

        res.add_watcher('hugo', TASK_ISSUER_ROLE)
        self.assertEquals([hugo], res.watchers)

    def test_fetch_return_resource_by_means_of_oguid(self):
        resource_a = create(Builder('resource').oguid('fd:123'))
        resource_b = create(Builder('resource').oguid('fd:456'))

        self.assertEquals(resource_a,
                          self.center.fetch_resource(Oguid('fd', '123')))
        self.assertEquals(resource_b,
                          self.center.fetch_resource(Oguid('fd', '456')))

    def test_fetch_return_none_when_resource_not_exists(self):
        self.assertEquals(None,
                          self.center.fetch_resource(Oguid('fd', '123')))

    def test_adding(self):
        resource = self.center.add_resource(Oguid('fd', '123'))

        self.assertEquals(1, len(Resource.query.all()))
        resource = Resource.query.first()
        self.assertEquals(Oguid('fd', '123'), resource.oguid)
        self.assertEquals('fd', resource.admin_unit_id)
        self.assertEquals(123, resource.int_id)
Esempio n. 5
0
    def setUp(self):
        super(TestMarkAsRead, self).setUp()

        self.center = NotificationCenter()
        self.test_user = create(
            Builder('watcher').having(actorid=TEST_USER_ID))
        self.resource_a = create(
            Builder('resource').oguid('fd:123').watchers([self.test_user]))

        with freeze(pytz.UTC.localize(datetime(2014, 5, 7, 12, 30))):
            self.activity_1 = self.center.add_activity(
                Oguid('fd', '123'), 'task-added', {
                    'en': 'Kennzahlen 2014 erfassen'
                }, {
                    'en': 'Task added'
                }, {
                    'en': 'Task bla added by Hugo'
                }, 'hugo.boss', {
                    'en': None
                }).get('activity')

            self.activity_2 = self.center.add_activity(
                Oguid('fd', '123'), 'task-transition-open-in-progress', {
                    'en': 'Kennzahlen 2014 erfassen'
                }, {
                    'en': 'Task accepted'
                }, {
                    'en': 'Task bla accepted'
                }, 'hugo.boss', {
                    'en': None
                }).get('activity')

            self.notifications = self.center.get_users_notifications(
                TEST_USER_ID)
Esempio n. 6
0
    def setUp(self):
        super(TestMyNotifications, self).setUp()

        setting = NotificationDefault.query.filter_by(kind='task-added').one()
        setting.badge_notification_roles = [
            WATCHER_ROLE,
        ]
        setting = NotificationDefault.query.filter_by(
            kind='task-transition-open-in-progress').one()
        setting.badge_notification_roles = [
            WATCHER_ROLE,
        ]

        self.center = NotificationCenter(dispatchers=[BadgeIconDispatcher()])

        self.test_watcher = create(
            Builder('watcher').having(actorid=self.regular_user.getId()))

        self.resource_a = create(
            Builder('resource').oguid('fd:123').watchers([self.test_watcher]))
        self.resource_b = create(
            Builder('resource').oguid('fd:456').watchers([self.test_watcher]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'), u'task-added', {
                'de': u'Kennzahlen 2014 \xfcbertragen'
            }, {
                'de': u'Aufgabe hinzugef\xfcgt'
            }, {
                'de': u'Neue Aufgabe hinzugef\xfcgt durch  B\xf6ss'
            }, self.dossier_responsible.getId(), {
                'de': None
            }).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'), u'task-transition-open-in-progress', {
                'de': u'Kennzahlen 2014 \xfcbertragen'
            }, {
                'de': u'Aufgabe akzeptiert'
            }, {
                'de': u'Aufgabe akzeptiert durch Hugo B\xf6ss'
            }, self.secretariat_user.getId(), {
                'de': None
            }).get('activity')
        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'), u'task-added', {
                'de': u'Kennzahlen 2014 \xfcbertragen'
            }, {
                'de': u'Aufgabe hinzugef\xfcgt'
            }, {
                'de': u'Neue Aufgabe hinzugef\xfcgt durch Peter M\xfcller'
            }, self.dossier_responsible.getId(), {
                'de': None
            }).get('activity')
    def setUp(self):
        super(TestDispatchers, self).setUp()

        self.dispatcher = FakeMailDispatcher()
        self.center = NotificationCenter([self.dispatcher])

        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))
        create(Builder('subscription')
               .having(resource=resource, watcher=hugo, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource,
                       watcher=peter,
                       role=TASK_RESPONSIBLE_ROLE))
Esempio n. 8
0
    def setUp(self):
        super(TestMarkAsRead, self).setUp()

        self.center = NotificationCenter()
        self.test_user = create(Builder('watcher')
                                .having(actorid=TEST_USER_ID))
        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.test_user]))

        with freeze(pytz.UTC.localize(datetime(2014, 5, 7, 12, 30))):
            self.activity_1 = self.center.add_activity(
                Oguid('fd', '123'),
                'task-added',
                {'en': 'Kennzahlen 2014 erfassen'},
                {'en': 'Task added'},
                {'en': 'Task bla added by Hugo'},
                'hugo.boss',
                {'en': None}).get('activity')

            self.activity_2 = self.center.add_activity(
                Oguid('fd', '123'),
                'task-transition-open-in-progress',
                {'en': 'Kennzahlen 2014 erfassen'},
                {'en': 'Task accepted'},
                {'en': 'Task bla accepted'},
                'hugo.boss',
                {'en': None}).get('activity')

            self.notifications = self.center.get_users_notifications(TEST_USER_ID)
    def setUp(self):
        super(TestMyNotifications, self).setUp()

        create(Builder('ogds_user').having(userid=u'peter.mueller',
                                           firstname=u'Peter',
                                           lastname=u'M\xfcller'))
        create(Builder('ogds_user').having(userid=u'hugo.boss',
                                           firstname=u'Hugo',
                                           lastname=u'B\xf6ss'))

        self.center = NotificationCenter()
        self.test_user = create(Builder('watcher')
                                .having(actorid=TEST_USER_ID))

        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.test_user]))
        self.resource_b = create(Builder('resource')
                                 .oguid('fd:456')
                                 .watchers([self.test_user]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Hugo B\xf6ss'},
            'hugo.boss',
            {'de': None}).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-transition-open-in-progress',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe akzeptiert'},
            {'de': u'Aufgabe akzeptiert durch Hugo B\xf6ss'},
            'peter.mueller',
            {'de': None}).get('activity')
        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Peter M\xfcller'},
            'peter.mueller',
            {'de': None}).get('activity')
        transaction.commit()
Esempio n. 10
0
    def setUp(self):
        super(TestNotificationHandling, self).setUp()

        self.center = NotificationCenter()

        self.peter = create(Builder('ogds_user').id('peter'))
        self.peter = create(Builder('watcher').having(actorid='peter'))
        self.hugo = create(Builder('ogds_user').id('hugo'))
        self.hugo = create(Builder('watcher').having(actorid='hugo'))

        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.hugo, self.peter]))
        self.resource_b = create(Builder('resource')
                                 .oguid('fd:456')
                                 .watchers([self.hugo]))
        self.resource_c = create(Builder('resource')
                                 .oguid('fd:789')
                                 .watchers([self.peter]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla added by Peter'},
            'hugo.boss',
            {'en': None}).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'),
            'task-transition-open-in-progress',
            {'en': 'Kennzahlen 2015 erfassen'},
            {'en': 'Task accepted'},
            {'en': 'Task bla accepted by Peter'},
            'peter.mueller',
            {'en': None}).get('activity')

        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'),
            'task-added',
            {'en': 'Besprechung Gesuch'},
            {'en': 'Task added'},
            {'en': 'Task for added by Peter'},
            'peter.mueller',
            {'en': None}).get('activity')

        self.activity_4 = self.center.add_activity(
            Oguid('fd', '789'),
            'task-added',
            {'en': 'Vorbereitung Besprechung'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Franz'},
            'franz.meier',
            {'en': None}).get('activity')
Esempio n. 11
0
    def setUp(self):
        super(TestListNotifications, self).setUp()
        with self.login(self.regular_user), freeze(FREEZE_TIME):
            self.center = NotificationCenter()
            self.watcher = create(
                Builder('watcher').having(actorid=self.regular_user.id))
            oguid = Oguid.for_object(self.task)
            self.resource = create(
                Builder('resource').oguid(oguid.id).watchers([self.watcher]))

            self.activity = create(
                Builder('activity').having(resource=self.resource,
                                           created=FREEZE_TIME))
Esempio n. 12
0
class TestAddActivity(ActivityTestCase):
    def setUp(self):
        super(TestAddActivity, self).setUp()
        self.center = NotificationCenter()

    def test_add_resource_if_not_exists(self):
        self.center.add_activity(Oguid('fd', '123'), 'task_added',
                                 {'en': 'Kennzahlen 2014 erfassen'},
                                 {'en': 'Task added'},
                                 {'en': 'Task bla added by Hugo'}, 'hugo.boss',
                                 {'en': None})

        resource = self.center.fetch_resource(Oguid('fd', '123'))
        self.assertEquals('fd', resource.admin_unit_id)
        self.assertEquals(123, resource.int_id)

    def test_creates_notifications_for_each_resource_watcher(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))

        resource_a = create(
            Builder('resource').oguid('fd:123').watchers([hugo, peter]))

        activity = self.center.add_activity(Oguid('fd', '123'), 'TASK_ADDED', {
            'en': 'Kennzahlen 2014 erfassen'
        }, {
            'en': 'Task bla added'
        }, {
            'en': 'Task bla added by Hugo'
        }, 'hugo.boss', {
            'en': None
        }).get('activity')

        notification = Notification.query.by_user('peter').first()
        self.assertEquals(activity, notification.activity)
        self.assertEquals(resource_a, notification.activity.resource)
        self.assertFalse(notification.is_read)

        notification = Notification.query.by_user('hugo').first()
        self.assertEquals(activity, notification.activity)
        self.assertEquals(resource_a, notification.activity.resource)
        self.assertFalse(notification.is_read)

    def test_does_not_create_an_notification_for_the_actor(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))

        create(Builder('resource').oguid('fd:123').watchers([hugo, peter]))

        self.center.add_activity(Oguid('fd', '123'), 'TASK_ADDED',
                                 {'en': 'Kennzahlen 2014 erfassen'},
                                 {'en': 'Task accepted'},
                                 {'en': 'Task bla added by Peter'}, 'peter',
                                 {'en': None})

        self.assertEquals(1, Notification.query.by_user('hugo').count())
        self.assertEquals(0, Notification.query.by_user('peter').count())
Esempio n. 13
0
    def setUp(self):
        super(TestDispatchers, self).setUp()

        self.dispatcher = FakeMailDispatcher()
        self.center = NotificationCenter([self.dispatcher])

        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))
        create(Builder('subscription')
               .having(resource=resource, watcher=hugo, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource,
                       watcher=peter,
                       role=TASK_RESPONSIBLE_ROLE))
Esempio n. 14
0
    def setUp(self):
        super(TestMarkAsRead, self).setUp()
        with self.login(self.regular_user):
            self.center = NotificationCenter()
            self.watcher = create(
                Builder('watcher')
                .having(actorid=self.regular_user.id)
            )
            oguid = Oguid.for_object(self.task)
            self.resource = create(
                Builder('resource')
                .oguid(oguid.id)
                .watchers([self.watcher])
            )

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_FIRST):
                self.activity_1 = create(
                    Builder('activity')
                    .having(resource=self.resource, created=FREEZE_TIME_FIRST)
                )
                create(
                    Builder('notification')
                    .id(1)
                    .having(
                        activity=self.activity_1,
                        userid=self.regular_user.id,
                    )
                )

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_SECOND):
                self.activity_2 = create(
                    Builder('activity')
                    .having(resource=self.resource, created=FREEZE_TIME_SECOND)
                )
                create(
                    Builder('notification')
                    .id(2)
                    .having(
                        activity=self.activity_2,
                        userid=self.regular_user.id,
                    )
                )

            self.notifications = self.center.get_users_notifications(
                self.regular_user.id)
Esempio n. 15
0
    def setUp(self):
        super(TestListNotifications, self).setUp()
        self.center = NotificationCenter()
        self.test_user = create(
            Builder('watcher').having(actorid=TEST_USER_ID))
        self.resource_a = create(
            Builder('resource').oguid('fd:123').watchers([self.test_user]))

        created = pytz.UTC.localize(datetime(2014, 5, 7, 12, 30))
        self.activity = create(
            Builder('activity').having(resource=self.resource_a,
                                       created=created,
                                       actor_id='hugo.boss',
                                       kind='task-added',
                                       title=u'Kennzahlen 2014 erfassen',
                                       label=u'Task added',
                                       summary=u'Task bla added by Hugo'))
Esempio n. 16
0
    def setUp(self):
        super(TestMyNotifications, self).setUp()

        setting = NotificationDefault.query.filter_by(kind='task-added').one()
        setting.badge_notification_roles = [WATCHER_ROLE, ]
        setting = NotificationDefault.query.filter_by(
            kind='task-transition-open-in-progress').one()
        setting.badge_notification_roles = [WATCHER_ROLE, ]

        self.center = NotificationCenter(dispatchers=[BadgeIconDispatcher()])

        self.test_watcher = create(Builder('watcher')
                                .having(actorid=self.regular_user.getId()))

        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.test_watcher]))
        self.resource_b = create(Builder('resource')
                                 .oguid('fd:456')
                                 .watchers([self.test_watcher]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch  B\xf6ss'},
            self.dossier_responsible.getId(),
            {'de': None}).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-transition-open-in-progress',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe akzeptiert'},
            {'de': u'Aufgabe akzeptiert durch Hugo B\xf6ss'},
            self.secretariat_user.getId(),
            {'de': None}).get('activity')
        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Peter M\xfcller'},
            self.dossier_responsible.getId(),
            {'de': None}).get('activity')
Esempio n. 17
0
    def setUp(self):
        super(TestMyNotifications, self).setUp()

        create(Builder('ogds_user').having(userid=u'peter.mueller',
                                           firstname=u'Peter',
                                           lastname=u'M\xfcller'))
        create(Builder('ogds_user').having(userid=u'hugo.boss',
                                           firstname=u'Hugo',
                                           lastname=u'B\xf6ss'))

        self.center = NotificationCenter()
        self.test_user = create(Builder('watcher')
                                .having(actorid=TEST_USER_ID))

        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.test_user]))
        self.resource_b = create(Builder('resource')
                                 .oguid('fd:456')
                                 .watchers([self.test_user]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Hugo B\xf6ss'},
            'hugo.boss',
            {'de': None}).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-transition-open-in-progress',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe akzeptiert'},
            {'de': u'Aufgabe akzeptiert durch Hugo B\xf6ss'},
            'peter.mueller',
            {'de': None}).get('activity')
        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Peter M\xfcller'},
            'peter.mueller',
            {'de': None}).get('activity')
Esempio n. 18
0
class TestMarkAsRead(IntegrationTestCase):
    def setUp(self):
        super(TestMarkAsRead, self).setUp()
        with self.login(self.regular_user):
            self.center = NotificationCenter()
            self.watcher = create(
                Builder('watcher').having(actorid=self.regular_user.id))
            oguid = Oguid.for_object(self.task)
            self.resource = create(
                Builder('resource').oguid(oguid.id).watchers([self.watcher]))

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_FIRST):
                self.activity_1 = create(
                    Builder('activity').having(resource=self.resource,
                                               created=FREEZE_TIME_FIRST))
                create(
                    Builder('notification').id(1).having(
                        activity=self.activity_1,
                        userid=self.regular_user.id,
                    ))

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_SECOND):
                self.activity_2 = create(
                    Builder('activity').having(resource=self.resource,
                                               created=FREEZE_TIME_SECOND))
                create(
                    Builder('notification').id(2).having(
                        activity=self.activity_2,
                        userid=self.regular_user.id,
                    ))

            self.notifications = self.center.get_users_notifications(
                self.regular_user.id)

    @browsing
    def test_mark_all_notifications_as_read(self, browser):
        self.login(self.regular_user, browser)
        # Now is always after both FREEZE_TIME_FIRST and FREEZE_TIME_SECOND
        browser.open(view='notifications/read',
                     data={'timestamp': int(time())})

        notifications = self.center.get_users_notifications(
            self.regular_user.id)
        self.assertTrue(notifications[0].is_read)
        self.assertTrue(notifications[1].is_read)

    @browsing
    def test_mark_some_notifications_as_read(self, browser):
        self.login(self.regular_user, browser)
        # This is testing a race condition of more notifications after render
        with freeze(FREEZE_TIME_BETWEEN):
            browser.open(view='notifications/read',
                         data={'timestamp': int(time())})

        notifications = self.center.get_users_notifications(
            self.regular_user.id)
        self.assertFalse(notifications[0].is_read)
        self.assertTrue(notifications[1].is_read)

    @browsing
    def test_mark_no_notifications_as_read(self, browser):
        self.login(self.regular_user, browser)
        # This is testing a race condition of more notifications after render
        with freeze(FREEZE_TIME_BEFORE):
            browser.open(view='notifications/read',
                         data={'timestamp': int(time())})

        notifications = self.center.get_users_notifications(
            self.regular_user.id)
        self.assertFalse(notifications[0].is_read)
        self.assertFalse(notifications[1].is_read)

    @browsing
    def test_read_raise_exception_when_parameter_is_missing(self, browser):
        self.login(self.regular_user, browser)
        with browser.expect_http_error():
            browser.open(self.portal, view='notifications/read')
class TestWatcherHandling(ActivityTestCase):

    def setUp(self):
        super(TestWatcherHandling, self).setUp()
        self.center = NotificationCenter()

    def test_fetch_returns_watcher_by_means_of_actor_id(self):
        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))

        self.assertEquals(hugo, self.center.fetch_watcher('hugo'))
        self.assertEquals(peter, self.center.fetch_watcher('peter'))

    def test_return_none_when_watcher_not_exists(self):
        self.assertEquals(None, self.center.fetch_watcher('peter'))

    def test_adding(self):
        self.center.add_watcher('peter')

        self.assertEquals(1, len(Watcher.query.all()))
        self.assertEquals('peter', Watcher.query.first().actorid)

    def test_add_watcher_twice_raise_integrity_error(self):
        self.center.add_watcher('peter')
        with self.assertRaises(IntegrityError):
            self.center.add_watcher('peter')
            transaction.commit()

        transaction.abort()

    def test_add_watcher_to_resource(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        self.assertEquals([peter], list(resource.watchers))

    def test_adding_watcher_twice_to_resource_is_ignored(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')
        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        self.assertEquals([peter], list(resource.watchers))

    def test_add_watcher_to_resource_creates_resource_when_not_exitst(self):
        peter = create(Builder('watcher').having(actorid='peter'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        resource = peter.resources[0]
        self.assertEquals('fd:123', resource.oguid)

    def test_add_watcher_to_resource_creates_watcher_when_not_exitst(self):
        resource = create(Builder('resource').oguid('fd:123'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        watcher = list(resource.watchers)[0]
        self.assertEquals('peter', watcher.actorid)

    def test_get_watchers_returns_a_list_of_resource_watchers(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))
        fritz = create(Builder('watcher').having(actorid='fritz'))

        resource_1 = create(Builder('resource')
                            .oguid('fd:123').watchers([hugo, fritz]))
        resource_2 = create(Builder('resource')
                            .oguid('fd:456').watchers([peter]))

        # A weakref gets reaped unless we keep a reference to the resources.
        # https://stackoverflow.com/questions/30044069/stale-association-proxy-parent-object-has-gone-out-of-scope-with-flask-sqlalc
        # So to squelch pyflakes we do trivial asserts on them here.
        self.assertEquals(123, resource_1.int_id)
        self.assertEquals(456, resource_2.int_id)

        self.assertEquals((hugo, fritz), self.center.get_watchers(Oguid('fd', '123')))
        self.assertEquals((peter,),
                          self.center.get_watchers(Oguid('fd', '456')))

    def test_get_watchers_returns_empty_list_when_resource_not_exists(self):
        self.assertEquals((), self.center.get_watchers(Oguid('fd', '123')))

    def test_remove_watcher_from_resource_will_be_ignored_when_watcher_not_exists(self):
        create(Builder('resource').oguid('fd:123'))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

    def test_remove_watcher_from_resource_will_remove_subscription_if_no_roles_left(self):
        resource = create(Builder('resource').oguid('fd:123'))
        watcher = create(Builder('watcher').having(actorid=u'peter'))
        create(Builder('subscription')
               .having(resource=resource, watcher=watcher, role=WATCHER_ROLE))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

        self.assertEquals([], resource.watchers)

    def test_remove_watcher_from_resource_will_be_ignored_when_resource_not_exists(self):
        create(Builder('watcher').having(actorid='peter'))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

    def test_remove_watcher_from_resource(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))
        resource = create(Builder('resource')
                          .oguid('fd:123')
                          .watchers([hugo, peter]))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

        self.assertEquals([hugo], resource.watchers)

    def test_remove_watchers_from_resource_by_role(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))
        marie = create(Builder('watcher').having(actorid='marie'))
        resource = create(Builder('resource').oguid('fd:123'))
        create(Builder('subscription')
               .having(resource=resource, watcher=peter, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource, watcher=marie, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource, watcher=peter, role=TASK_ISSUER_ROLE))
        create(Builder('subscription')
               .having(resource=resource, watcher=hugo, role=TASK_ISSUER_ROLE))

        self.center.remove_watchers_from_resource_by_role(
            Oguid('fd', '123'), WATCHER_ROLE)

        self.assertEqual(
            set([TASK_ISSUER_ROLE]),
            set([subscription.role for subscription in Subscription.query.all()]))

        self.assertEquals([peter, hugo], resource.watchers)

    def test_remove_watchers_from_resource_by_role_does_not_affect_other_resources(self):
        hugo = create(Builder('watcher').having(actorid='hugo'))

        create(Builder('resource').oguid('fd:123').watchers([hugo]))
        create(Builder('resource').oguid('fd:234').watchers([hugo]))

        self.assertEqual(2, Subscription.query.count())
        self.assertEqual(
            ['fd:123', 'fd:234'],
            [subscription.resource.oguid.id for subscription in Subscription.query.all()])

        self.center.remove_watchers_from_resource_by_role(
            Oguid('fd', '234'), WATCHER_ROLE)
Esempio n. 20
0
class TestNotificationHandling(ActivityTestCase):

    def setUp(self):
        super(TestNotificationHandling, self).setUp()

        self.center = NotificationCenter()

        self.peter = create(Builder('ogds_user').id('peter'))
        self.peter = create(Builder('watcher').having(actorid='peter'))
        self.hugo = create(Builder('ogds_user').id('hugo'))
        self.hugo = create(Builder('watcher').having(actorid='hugo'))

        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.hugo, self.peter]))
        self.resource_b = create(Builder('resource')
                                 .oguid('fd:456')
                                 .watchers([self.hugo]))
        self.resource_c = create(Builder('resource')
                                 .oguid('fd:789')
                                 .watchers([self.peter]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla added by Peter'},
            'hugo.boss',
            {'en': None}).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'),
            'task-transition-open-in-progress',
            {'en': 'Kennzahlen 2015 erfassen'},
            {'en': 'Task accepted'},
            {'en': 'Task bla accepted by Peter'},
            'peter.mueller',
            {'en': None}).get('activity')

        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'),
            'task-added',
            {'en': 'Besprechung Gesuch'},
            {'en': 'Task added'},
            {'en': 'Task for added by Peter'},
            'peter.mueller',
            {'en': None}).get('activity')

        self.activity_4 = self.center.add_activity(
            Oguid('fd', '789'),
            'task-added',
            {'en': 'Vorbereitung Besprechung'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Franz'},
            'franz.meier',
            {'en': None}).get('activity')

    def test_get_users_notifications_lists_only_users_notifications(self):
        peters_notifications = self.center.get_users_notifications('peter')
        hugos_notifications = self.center.get_users_notifications('hugo')

        self.assertEquals(
            [self.activity_4, self.activity_2, self.activity_1],
            [notification.activity for notification in peters_notifications])

        self.assertEquals(
            [self.activity_3, self.activity_2, self.activity_1],
            [notification.activity for notification in hugos_notifications])

    def test_get_users_notifications_only_unread_parameter(self):
        notifications = self.center.get_users_notifications('peter')
        self.center.mark_notification_as_read(notifications[0].notification_id)

        peters_notifications = self.center.get_users_notifications('peter', only_unread=True)
        self.assertEquals(2, len(peters_notifications))

    def test_get_users_notifications_retuns_empty_list_when_no_notifications_for_this_user_exists(self):
        create(Builder('watcher').having(actorid='franz'))

        self.assertEquals([],
                          self.center.get_users_notifications('franz'))

    def test_mark_notification_as_read(self):
        notification = Notification.query.by_user('peter').first()
        self.center.mark_notification_as_read(notification.notification_id)
        self.assertTrue(Notification.get(notification.notification_id).is_read)

    def test_mark_notifications_as_read(self):
        notification_1, notification_2, notification_3 = Notification.query.by_user(
            'peter').all()

        self.center.mark_notifications_as_read(
            [notification_1.notification_id, notification_3.notification_id])

        self.assertTrue(notification_1.is_read)
        self.assertFalse(notification_2.is_read)
        self.assertTrue(notification_3.is_read)

    def test_mark_an_already_read_notification_is_ignored(self):
        notification = Notification.query.by_user('peter').first()
        notification_id = notification.notification_id

        self.center.mark_notification_as_read(notification_id)
        self.assertTrue(Notification.get(notification_id).is_read)

        self.center.mark_notification_as_read(notification_id)
        self.assertTrue(Notification.get(notification_id).is_read)

    def test_list_notifications_by_userid(self):
        notifications = self.center.list_notifications(userid='peter')
        self.assertEquals(
            [self.activity_1, self.activity_2, self.activity_4],
            [notification.activity for notification in notifications])

    def test_list_notifications_with_sorting(self):
        notifications = self.center.list_notifications(userid='peter', sort_on='kind')

        self.assertEquals(
            ['task-added', 'task-added', 'task-transition-open-in-progress'],
            [notification.activity.kind for notification in notifications])

    def test_list_notifications_with_reverse_sorting(self):
        notifications = self.center.list_notifications(
            userid='peter', sort_on='kind', sort_reverse=True)

        self.assertEquals(
            ['task-transition-open-in-progress', 'task-added', 'task-added'],
            [notification.activity.kind for notification in notifications])

    @unittest.skip('Textfilter not implemented yet')
    def test_list_notifications_with_text_filter_on_title(self):
        notifications = self.center.list_notifications(
            userid='peter', sort_on='kind', filters=['kennzahlen'])

        self.assertEquals(
            [self.activity_1, self.activity_2],
            [notification.activity for notification in notifications])

    @unittest.skip('Textfilter not implemented yet')
    def test_list_notifications_with_text_filter_on_kind(self):
        notifications = self.center.list_notifications(
            userid='peter', sort_on='kind', filters=['Task', 'added'])

        self.assertEquals(
            ['task-added', 'task-added'],
            [notification.activity.kind for notification in notifications])
Esempio n. 21
0
class TestMyNotifications(FunctionalTestCase):

    def setUp(self):
        super(TestMyNotifications, self).setUp()

        create(Builder('ogds_user').having(userid=u'peter.mueller',
                                           firstname=u'Peter',
                                           lastname=u'M\xfcller'))
        create(Builder('ogds_user').having(userid=u'hugo.boss',
                                           firstname=u'Hugo',
                                           lastname=u'B\xf6ss'))

        self.center = NotificationCenter()
        self.test_user = create(Builder('watcher')
                                .having(actorid=TEST_USER_ID))

        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.test_user]))
        self.resource_b = create(Builder('resource')
                                 .oguid('fd:456')
                                 .watchers([self.test_user]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Hugo B\xf6ss'},
            'hugo.boss',
            {'de': None}).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-transition-open-in-progress',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe akzeptiert'},
            {'de': u'Aufgabe akzeptiert durch Hugo B\xf6ss'},
            'peter.mueller',
            {'de': None}).get('activity')
        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Peter M\xfcller'},
            'peter.mueller',
            {'de': None}).get('activity')

    @browsing
    def test_lists_only_notifications_of_current_user(self, browser):
        browser.login().open(self.portal,
                             view='tabbedview_view-mynotifications')

        links = [link.get('href') for link in browser.css('.listing a')]
        self.assertEquals(
            ['http://example.com/@@resolve_notification?notification_id=1',
             'http://example.com/@@resolve_notification?notification_id=2'],
            links)

    @browsing
    def test_listing_content(self, browser):
        browser.login().open(self.portal,
                             view='tabbedview_view-mynotifications')

        self.assertEquals(
            [{'Actor': u'B\xf6ss Hugo (hugo.boss)',
              'Created': api.portal.get_localized_time(
                  self.activity_1.created, long_format=True),
              'Kind': u'Aufgabe hinzugef\xfcgt',
              'Title': u'Kennzahlen 2014 \xfcbertragen'},
             {'Actor': u'M\xfcller Peter (peter.mueller)',
              'Created': api.portal.get_localized_time(
                  self.activity_2.created, long_format=True),
              'Kind': u'Aufgabe akzeptiert',
              'Title': u'Kennzahlen 2014 \xfcbertragen'}],
            browser.css('.listing').first.dicts())

    @browsing
    def test_title_is_linked_to_resolve_notification_view(self, browser):
        browser.login().open(self.portal,
                             view='tabbedview_view-mynotifications')

        row = browser.css('.listing tr')[1]
        link = row.css('a').first

        self.assertEquals(u'Kennzahlen 2014 \xfcbertragen', link.text)
        self.assertEquals(
            'http://example.com/@@resolve_notification?notification_id=1',
            link.get('href'))
Esempio n. 22
0
class TestMarkAsRead(FunctionalTestCase):

    layer = OPENGEVER_FUNCTIONAL_ACTIVITY_LAYER

    def setUp(self):
        super(TestMarkAsRead, self).setUp()

        self.center = NotificationCenter()
        self.test_user = create(
            Builder('watcher').having(actorid=TEST_USER_ID))
        self.resource_a = create(
            Builder('resource').oguid('fd:123').watchers([self.test_user]))

        with freeze(pytz.UTC.localize(datetime(2014, 5, 7, 12, 30))):
            self.activity_1 = self.center.add_activity(
                Oguid('fd', '123'), 'task-added', {
                    'en': 'Kennzahlen 2014 erfassen'
                }, {
                    'en': 'Task added'
                }, {
                    'en': 'Task bla added by Hugo'
                }, 'hugo.boss', {
                    'en': None
                }).get('activity')

            self.activity_2 = self.center.add_activity(
                Oguid('fd', '123'), 'task-transition-open-in-progress', {
                    'en': 'Kennzahlen 2014 erfassen'
                }, {
                    'en': 'Task accepted'
                }, {
                    'en': 'Task bla accepted'
                }, 'hugo.boss', {
                    'en': None
                }).get('activity')

            self.notifications = self.center.get_users_notifications(
                TEST_USER_ID)

    @browsing
    def test_mark_single_notification_as_read(self, browser):
        notification_id = self.notifications[0].notification_id
        browser.login().open(
            self.portal,
            view='notifications/read',
            data={'notification_ids': json.dumps([notification_id])})

        notifications = self.center.get_users_notifications(TEST_USER_ID)
        self.assertTrue(notifications[0].is_read)
        self.assertFalse(notifications[1].is_read)

    @browsing
    def test_mark_multiple_notifications_as_read(self, browser):
        ids = [
            self.notifications[0].notification_id,
            self.notifications[1].notification_id
        ]

        browser.login().open(self.portal,
                             view='notifications/read',
                             data={'notification_ids': json.dumps(ids)})

        notifications = self.center.get_users_notifications(TEST_USER_ID)
        self.assertTrue(notifications[0].is_read)
        self.assertTrue(notifications[1].is_read)

    @browsing
    def test_mark_already_read_or_invalid_notification_as_read_is_ignored(
            self, browser):
        invalid = 123
        notification_id = self.notifications[0].notification_id

        self.notifications[0].is_read = True

        browser.login().open(
            self.portal,
            view='notifications/read',
            data={'notification_ids': json.dumps([invalid, notification_id])})

    @browsing
    def test_read_raise_exception_when_parameter_is_missing(self, browser):
        with browser.expect_http_error():
            browser.login().open(self.portal, view='notifications/read')
Esempio n. 23
0
class TestMarkAsRead(IntegrationTestCase):

    def setUp(self):
        super(TestMarkAsRead, self).setUp()
        with self.login(self.regular_user):
            self.center = NotificationCenter()
            self.watcher = create(
                Builder('watcher')
                .having(actorid=self.regular_user.id)
            )
            oguid = Oguid.for_object(self.task)
            self.resource = create(
                Builder('resource')
                .oguid(oguid.id)
                .watchers([self.watcher])
            )

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_FIRST):
                self.activity_1 = create(
                    Builder('activity')
                    .having(resource=self.resource, created=FREEZE_TIME_FIRST)
                )
                create(
                    Builder('notification')
                    .id(1)
                    .having(
                        activity=self.activity_1,
                        userid=self.regular_user.id,
                    )
                )

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_SECOND):
                self.activity_2 = create(
                    Builder('activity')
                    .having(resource=self.resource, created=FREEZE_TIME_SECOND)
                )
                create(
                    Builder('notification')
                    .id(2)
                    .having(
                        activity=self.activity_2,
                        userid=self.regular_user.id,
                    )
                )

            self.notifications = self.center.get_users_notifications(
                self.regular_user.id)

    @browsing
    def test_mark_all_notifications_as_read(self, browser):
        self.login(self.regular_user, browser)
        # Now is always after both FREEZE_TIME_FIRST and FREEZE_TIME_SECOND
        browser.open(view='notifications/read', data={'timestamp': int(time())})

        notifications = self.center.get_users_notifications(
            self.regular_user.id)
        self.assertTrue(notifications[0].is_read)
        self.assertTrue(notifications[1].is_read)

    @browsing
    def test_mark_some_notifications_as_read(self, browser):
        self.login(self.regular_user, browser)
        # This is testing a race condition of more notifications after render
        with freeze(FREEZE_TIME_BETWEEN):
            browser.open(
                view='notifications/read', data={'timestamp': int(time())})

        notifications = self.center.get_users_notifications(
            self.regular_user.id)
        self.assertFalse(notifications[0].is_read)
        self.assertTrue(notifications[1].is_read)

    @browsing
    def test_mark_no_notifications_as_read(self, browser):
        self.login(self.regular_user, browser)
        # This is testing a race condition of more notifications after render
        with freeze(FREEZE_TIME_BEFORE):
            browser.open(
                view='notifications/read', data={'timestamp': int(time())})

        notifications = self.center.get_users_notifications(
            self.regular_user.id)
        self.assertFalse(notifications[0].is_read)
        self.assertFalse(notifications[1].is_read)

    @browsing
    def test_read_raise_exception_when_parameter_is_missing(self, browser):
        self.login(self.regular_user, browser)
        with browser.expect_http_error():
            browser.open(self.portal, view='notifications/read')
 def setUp(self):
     super(TestResourceHandling, self).setUp()
     self.center = NotificationCenter()
class TestNotificationHandling(ActivityTestCase):

    def setUp(self):
        super(TestNotificationHandling, self).setUp()

        self.center = NotificationCenter()

        self.peter = create(Builder('ogds_user').id('peter'))
        self.peter = create(Builder('watcher').having(actorid='peter'))
        self.hugo = create(Builder('ogds_user').id('hugo'))
        self.hugo = create(Builder('watcher').having(actorid='hugo'))

        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.hugo, self.peter]))
        self.resource_b = create(Builder('resource')
                                 .oguid('fd:456')
                                 .watchers([self.hugo]))
        self.resource_c = create(Builder('resource')
                                 .oguid('fd:789')
                                 .watchers([self.peter]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla added by Peter'},
            'hugo.boss',
            {'en': None}).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'),
            'task-transition-open-in-progress',
            {'en': 'Kennzahlen 2015 erfassen'},
            {'en': 'Task accepted'},
            {'en': 'Task bla accepted by Peter'},
            'peter.mueller',
            {'en': None}).get('activity')

        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'),
            'task-added',
            {'en': 'Besprechung Gesuch'},
            {'en': 'Task added'},
            {'en': 'Task for added by Peter'},
            'peter.mueller',
            {'en': None}).get('activity')

        self.activity_4 = self.center.add_activity(
            Oguid('fd', '789'),
            'task-added',
            {'en': 'Vorbereitung Besprechung'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Franz'},
            'franz.meier',
            {'en': None}).get('activity')

    def test_get_users_notifications_lists_only_users_notifications(self):
        peters_notifications = self.center.get_users_notifications('peter')
        hugos_notifications = self.center.get_users_notifications('hugo')

        self.assertEquals(
            [self.activity_4, self.activity_2, self.activity_1],
            [notification.activity for notification in peters_notifications])

        self.assertEquals(
            [self.activity_3, self.activity_2, self.activity_1],
            [notification.activity for notification in hugos_notifications])

    def test_get_users_notifications_only_unread_parameter(self):
        notifications = self.center.get_users_notifications('peter')
        self.center.mark_notification_as_read(notifications[0].notification_id)

        peters_notifications = self.center.get_users_notifications('peter', only_unread=True)
        self.assertEquals(2, len(peters_notifications))

    def test_get_users_notifications_retuns_empty_list_when_no_notifications_for_this_user_exists(self):
        create(Builder('watcher').having(actorid='franz'))

        self.assertEquals([],
                          self.center.get_users_notifications('franz'))

    def test_mark_notification_as_read(self):
        notification = Notification.query.by_user('peter').first()
        self.center.mark_notification_as_read(notification.notification_id)
        self.assertTrue(Notification.get(notification.notification_id).is_read)

    def test_mark_notifications_as_read(self):
        notification_1, notification_2, notification_3 = Notification.query.by_user(
            'peter').all()

        self.center.mark_notifications_as_read(
            [notification_1.notification_id, notification_3.notification_id])

        self.assertTrue(notification_1.is_read)
        self.assertFalse(notification_2.is_read)
        self.assertTrue(notification_3.is_read)

    def test_mark_an_already_read_notification_is_ignored(self):
        notification = Notification.query.by_user('peter').first()
        notification_id = notification.notification_id

        self.center.mark_notification_as_read(notification_id)
        self.assertTrue(Notification.get(notification_id).is_read)

        self.center.mark_notification_as_read(notification_id)
        self.assertTrue(Notification.get(notification_id).is_read)

    def test_list_notifications_by_userid(self):
        notifications = self.center.list_notifications(userid='peter')
        self.assertEquals(
            [self.activity_1, self.activity_2, self.activity_4],
            [notification.activity for notification in notifications])

    def test_list_notifications_with_sorting(self):
        notifications = self.center.list_notifications(userid='peter', sort_on='kind')

        self.assertEquals(
            ['task-added', 'task-added', 'task-transition-open-in-progress'],
            [notification.activity.kind for notification in notifications])

    def test_list_notifications_with_reverse_sorting(self):
        notifications = self.center.list_notifications(
            userid='peter', sort_on='kind', sort_reverse=True)

        self.assertEquals(
            ['task-transition-open-in-progress', 'task-added', 'task-added'],
            [notification.activity.kind for notification in notifications])

    @unittest.skip('Textfilter not implemented yet')
    def test_list_notifications_with_text_filter_on_title(self):
        notifications = self.center.list_notifications(
            userid='peter', sort_on='kind', filters=['kennzahlen'])

        self.assertEquals(
            [self.activity_1, self.activity_2],
            [notification.activity for notification in notifications])

    @unittest.skip('Textfilter not implemented yet')
    def test_list_notifications_with_text_filter_on_kind(self):
        notifications = self.center.list_notifications(
            userid='peter', sort_on='kind', filters=['Task', 'added'])

        self.assertEquals(
            ['task-added', 'task-added'],
            [notification.activity.kind for notification in notifications])
Esempio n. 26
0
class TestAddActivity(ActivityTestCase):

    def setUp(self):
        super(TestAddActivity, self).setUp()
        self.center = NotificationCenter()

    def test_add_resource_if_not_exists(self):
        self.center.add_activity(
            Oguid('fd', '123'),
            'task_added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla added by Hugo'},
            'hugo.boss',
            {'en': None})


        resource = self.center.fetch_resource(Oguid('fd', '123'))
        self.assertEquals('fd', resource.admin_unit_id)
        self.assertEquals(123, resource.int_id)

    def test_creates_notifications_for_each_resource_watcher(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))

        resource_a = create(Builder('resource').oguid('fd:123')
                            .watchers([hugo, peter]))

        activity = self.center.add_activity(
            Oguid('fd', '123'),
            'TASK_ADDED',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task bla added'},
            {'en': 'Task bla added by Hugo'},
            'hugo.boss',
            {'en': None}).get('activity')

        notification = Notification.query.by_user('peter').first()
        self.assertEquals(activity, notification.activity)
        self.assertEquals(resource_a, notification.activity.resource)
        self.assertFalse(notification.is_read)

        notification = Notification.query.by_user('hugo').first()
        self.assertEquals(activity, notification.activity)
        self.assertEquals(resource_a, notification.activity.resource)
        self.assertFalse(notification.is_read)

    def test_does_not_create_an_notification_for_the_actor(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))

        create(Builder('resource').oguid('fd:123').watchers([hugo, peter]))

        self.center.add_activity(
            Oguid('fd', '123'),
            'TASK_ADDED',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task accepted'},
            {'en': 'Task bla added by Peter'},
            'peter',
            {'en': None})

        self.assertEquals(1, Notification.query.by_user('hugo').count())
        self.assertEquals(0, Notification.query.by_user('peter').count())
 def setUp(self):
     super(TestAddActivity, self).setUp()
     self.center = NotificationCenter()
Esempio n. 28
0
 def setUp(self):
     super(TestAddActivity, self).setUp()
     self.center = NotificationCenter()
Esempio n. 29
0
class TestMyNotifications(FunctionalTestCase):

    def setUp(self):
        super(TestMyNotifications, self).setUp()

        create(Builder('ogds_user').having(userid=u'peter.mueller',
                                           firstname=u'Peter',
                                           lastname=u'M\xfcller'))
        create(Builder('ogds_user').having(userid=u'hugo.boss',
                                           firstname=u'Hugo',
                                           lastname=u'B\xf6ss'))

        self.center = NotificationCenter()
        self.test_user = create(Builder('watcher')
                                .having(actorid=TEST_USER_ID))

        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.test_user]))
        self.resource_b = create(Builder('resource')
                                 .oguid('fd:456')
                                 .watchers([self.test_user]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Hugo B\xf6ss'},
            'hugo.boss',
            {'de': None}).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-transition-open-in-progress',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe akzeptiert'},
            {'de': u'Aufgabe akzeptiert durch Hugo B\xf6ss'},
            'peter.mueller',
            {'de': None}).get('activity')
        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Peter M\xfcller'},
            'peter.mueller',
            {'de': None}).get('activity')
        transaction.commit()

    @browsing
    def test_lists_only_notifications_of_current_user(self, browser):
        browser.login().open(self.portal,
                             view='tabbedview_view-mynotifications')

        links = [link.get('href') for link in browser.css('.listing a')]
        self.assertEquals(
            ['http://example.com/@@resolve_notification?notification_id=1',
             'http://example.com/@@resolve_notification?notification_id=2',
             'http://example.com/@@resolve_notification?notification_id=3'],
            links)

    @browsing
    def test_listing_content(self, browser):
        browser.login().open(self.portal,
                             view='tabbedview_view-mynotifications')

        self.maxDiff = None
        self.assertEquals(
            [{'Actor': u'B\xf6ss Hugo (hugo.boss)',
              'Created': api.portal.get_localized_time(
                  self.activity_1.created, long_format=True),
              'Kind': u'Aufgabe hinzugef\xfcgt',
              'Title': u'Kennzahlen 2014 \xfcbertragen'},
             {'Actor': u'M\xfcller Peter (peter.mueller)',
              'Created': api.portal.get_localized_time(
                  self.activity_2.created, long_format=True),
              'Kind': u'Aufgabe akzeptiert',
              'Title': u'Kennzahlen 2014 \xfcbertragen'},
             {'Actor': u'M\xfcller Peter (peter.mueller)',
              'Created': api.portal.get_localized_time(
                  self.activity_3.created, long_format=True),
              'Kind': u'Aufgabe hinzugef\xfcgt',
              'Title': u'Kennzahlen 2014 \xfcbertragen'}],
            browser.css('.listing').first.dicts())

    @browsing
    def test_title_is_linked_to_resolve_notification_view(self, browser):
        browser.login().open(self.portal,
                             view='tabbedview_view-mynotifications')

        row = browser.css('.listing tr')[1]
        link = row.css('a').first

        self.assertEquals(u'Kennzahlen 2014 \xfcbertragen', link.text)
        self.assertEquals(
            'http://example.com/@@resolve_notification?notification_id=1',
            link.get('href'))
Esempio n. 30
0
 def setUp(self):
     super(TestResourceHandling, self).setUp()
     self.center = NotificationCenter()
class TestDispatchers(ActivityTestCase):

    def setUp(self):
        super(TestDispatchers, self).setUp()

        self.dispatcher = FakeMailDispatcher()
        self.center = NotificationCenter(
            [self.dispatcher, BadgeIconDispatcher(), DigestDispatcher()])

        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))
        create(Builder('subscription')
               .having(resource=resource, watcher=hugo, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource,
                       watcher=peter,
                       role=TASK_RESPONSIBLE_ROLE))

    def test_uses_personal_setting_if_exists(self):
        create(Builder('notification_default_setting')
               .having(kind='task-added',
                       mail_notification_roles=[WATCHER_ROLE,
                                                TASK_RESPONSIBLE_ROLE]))

        create(Builder('notification_setting')
               .having(kind='task-added', userid='hugo'))


        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(1, len(self.dispatcher.notified))
        self.assertEquals(
            ['peter'],
            [note.userid for note in self.dispatcher.notified])

    def test_uses_notification_default_as_fallback(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 mail_notification_roles=[
                                     WATCHER_ROLE, TASK_RESPONSIBLE_ROLE]))

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(2, len(self.dispatcher.notified))

    def test_only_watchers_with_configured_roles_are_dispatched(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 mail_notification_roles=[WATCHER_ROLE]))

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(1, len(self.dispatcher.notified))
        self.assertEquals(u'hugo', self.dispatcher.notified[0].userid)

    def test_if_setting_for_kind_does_not_exist_dispatcher_is_ignored(self):
        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})


        self.assertEquals(0, len(self.dispatcher.notified))

    def test_badge_dispatcher_sets_badge_flag_depending_on_the_setting(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 badge_notification_roles=[TASK_RESPONSIBLE_ROLE]))

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        peters_note = Notification.query.filter_by(userid='peter').one()
        hugos_note = Notification.query.filter_by(userid='hugo').one()

        self.assertFalse(hugos_note.is_badge)
        self.assertTrue(peters_note.is_badge)

    def test_digest_dispatcher_sets_digest_flag_depending_on_the_setting(self):
        create(Builder('notification_default_setting')
               .having(kind='task-added',
                       digest_notification_roles=[TASK_RESPONSIBLE_ROLE]))

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        peters_note = Notification.query.filter_by(userid='peter').one()
        hugos_note = Notification.query.filter_by(userid='hugo').one()

        self.assertFalse(hugos_note.is_digest)
        self.assertTrue(peters_note.is_digest)
Esempio n. 32
0
class TestMyNotifications(IntegrationTestCase):

    def setUp(self):
        super(TestMyNotifications, self).setUp()

        setting = NotificationDefault.query.filter_by(kind='task-added').one()
        setting.badge_notification_roles = [WATCHER_ROLE, ]
        setting = NotificationDefault.query.filter_by(
            kind='task-transition-open-in-progress').one()
        setting.badge_notification_roles = [WATCHER_ROLE, ]

        self.center = NotificationCenter(dispatchers=[BadgeIconDispatcher()])

        self.test_watcher = create(Builder('watcher')
                                .having(actorid=self.regular_user.getId()))

        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.test_watcher]))
        self.resource_b = create(Builder('resource')
                                 .oguid('fd:456')
                                 .watchers([self.test_watcher]))

        self.activity_1 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch  B\xf6ss'},
            self.dossier_responsible.getId(),
            {'de': None}).get('activity')
        self.activity_2 = self.center.add_activity(
            Oguid('fd', '123'),
            u'task-transition-open-in-progress',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe akzeptiert'},
            {'de': u'Aufgabe akzeptiert durch Hugo B\xf6ss'},
            self.secretariat_user.getId(),
            {'de': None}).get('activity')
        self.activity_3 = self.center.add_activity(
            Oguid('fd', '456'),
            u'task-added',
            {'de': u'Kennzahlen 2014 \xfcbertragen'},
            {'de': u'Aufgabe hinzugef\xfcgt'},
            {'de': u'Neue Aufgabe hinzugef\xfcgt durch Peter M\xfcller'},
            self.dossier_responsible.getId(),
            {'de': None}).get('activity')

    @browsing
    def test_lists_only_notifications_of_current_user(self, browser):
        self.login(self.regular_user, browser=browser)
        browser.open(self.portal, view='tabbedview_view-mynotifications')

        links = [link.get('href') for link in browser.css('.listing a')]
        self.assertEquals(
            ['http://nohost/plone/@@resolve_notification?notification_id=1',
             'http://nohost/plone/@@resolve_notification?notification_id=2',
             'http://nohost/plone/@@resolve_notification?notification_id=3'],
            links)

    @browsing
    def test_listing_content(self, browser):
        self.login(self.regular_user, browser=browser)
        browser.open(self.portal, view='tabbedview_view-mynotifications')

        self.maxDiff = None
        self.assertEquals(
            [{'Actor': u'Ziegler Robert (robert.ziegler)',
              'Created': api.portal.get_localized_time(
                  self.activity_1.created, long_format=True),
              'Kind': u'Aufgabe hinzugef\xfcgt',
              'Title': u'Kennzahlen 2014 \xfcbertragen'},
             {'Actor': u'K\xf6nig J\xfcrgen (jurgen.konig)',
              'Created': api.portal.get_localized_time(
                  self.activity_2.created, long_format=True),
              'Kind': u'Aufgabe akzeptiert',
              'Title': u'Kennzahlen 2014 \xfcbertragen'},
             {'Actor': u'Ziegler Robert (robert.ziegler)',
              'Created': api.portal.get_localized_time(
                  self.activity_3.created, long_format=True),
              'Kind': u'Aufgabe hinzugef\xfcgt',
              'Title': u'Kennzahlen 2014 \xfcbertragen'}],
            browser.css('.listing').first.dicts())

    @browsing
    def test_title_is_linked_to_resolve_notification_view(self, browser):
        self.login(self.regular_user, browser=browser)
        browser.open(self.portal, view='tabbedview_view-mynotifications')

        row = browser.css('.listing tr')[1]
        link = row.css('a').first

        self.assertEquals(u'Kennzahlen 2014 \xfcbertragen', link.text)
        self.assertEquals(
            'http://nohost/plone/@@resolve_notification?notification_id=1',
            link.get('href'))

    @browsing
    def test_my_notification_lists_only_badge_notifications(self, browser):
        self.login(self.regular_user, browser=browser)
        browser.open(self.portal, view='tabbedview_view-mynotifications')

        self.assertEquals(4, len(browser.css('.listing').first.rows))

        notifications = Notification.query.filter_by(userid=self.regular_user.getId())
        notifications[0].is_badge = False

        browser.open(self.portal, view='tabbedview_view-mynotifications')
        self.assertEquals(3, len(browser.css('.listing').first.rows))

    @browsing
    def test_hide_system_actor_id(self, browser):
        self.login(self.regular_user, browser=browser)

        self.activity_2.actor_id = SYSTEM_ACTOR_ID

        browser.open(self.portal, view='tabbedview_view-mynotifications')
        self.assertEquals(
            [u'Ziegler Robert (robert.ziegler)',
             u'',
             u'Ziegler Robert (robert.ziegler)'],
            [row.get('Actor') for row in browser.css('.listing').first.dicts()])
Esempio n. 33
0
class TestWatcherHandling(ActivityTestCase):

    def setUp(self):
        super(TestWatcherHandling, self).setUp()
        self.center = NotificationCenter()

    def test_fetch_returns_watcher_by_means_of_actor_id(self):
        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))

        self.assertEquals(hugo, self.center.fetch_watcher('hugo'))
        self.assertEquals(peter, self.center.fetch_watcher('peter'))

    def test_return_none_when_watcher_not_exists(self):
        self.assertEquals(None, self.center.fetch_watcher('peter'))

    def test_adding(self):
        self.center.add_watcher('peter')

        self.assertEquals(1, len(Watcher.query.all()))
        self.assertEquals('peter', Watcher.query.first().actorid)

    def test_add_watcher_twice_raise_integrity_error(self):
        self.center.add_watcher('peter')
        with self.assertRaises(IntegrityError):
            self.center.add_watcher('peter')
            transaction.commit()

        transaction.abort()

    def test_add_watcher_to_resource(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        self.assertEquals([peter], list(resource.watchers))

    def test_adding_watcher_twice_to_resource_is_ignored(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')
        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        self.assertEquals([peter], list(resource.watchers))

    def test_add_watcher_to_resource_creates_resource_when_not_exitst(self):
        peter = create(Builder('watcher').having(actorid='peter'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        resource = peter.resources[0]
        self.assertEquals('fd:123', resource.oguid)

    def test_add_watcher_to_resource_creates_watcher_when_not_exitst(self):
        resource = create(Builder('resource').oguid('fd:123'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        watcher = list(resource.watchers)[0]
        self.assertEquals('peter', watcher.actorid)

    def test_get_watchers_returns_a_list_of_resource_watchers(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))
        fritz = create(Builder('watcher').having(actorid='fritz'))

        resource_1 = create(Builder('resource')
                            .oguid('fd:123').watchers([hugo, fritz]))
        resource_2 = create(Builder('resource')
                            .oguid('fd:456').watchers([peter]))

        self.assertEquals([hugo, fritz], self.center.get_watchers(Oguid('fd', '123')))
        self.assertEquals([peter],
                          self.center.get_watchers(Oguid('fd', '456')))

    def test_get_watchers_returns_empty_list_when_resource_not_exists(self):
        self.assertEquals([], self.center.get_watchers(Oguid('fd', '123')))

    def test_remove_watcher_from_resource_will_be_ignored_when_watcher_not_exists(self):
        create(Builder('resource').oguid('fd:123'))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

    def test_remove_watcher_from_resource_will_remove_subscription_if_no_roles_left(self):
        resource = create(Builder('resource').oguid('fd:123'))
        watcher = create(Builder('watcher').having(actorid=u'peter'))
        create(Builder('subscription')
               .having(resource=resource, watcher=watcher, role=WATCHER_ROLE))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

        self.assertEquals([], resource.watchers)

    def test_remove_watcher_from_resource_will_be_ignored_when_resource_not_exists(self):
        create(Builder('watcher').having(actorid='peter'))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

    def test_remove_watcher_from_resource(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))
        resource = create(Builder('resource')
                          .oguid('fd:123')
                          .watchers([hugo, peter]))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

        self.assertEquals([hugo], resource.watchers)
Esempio n. 34
0
 def setUp(self):
     super(TestWatcherHandling, self).setUp()
     self.center = NotificationCenter()
Esempio n. 35
0
class TestMarkAsRead(FunctionalTestCase):

    layer = OPENGEVER_FUNCTIONAL_ACTIVITY_LAYER

    def setUp(self):
        super(TestMarkAsRead, self).setUp()

        self.center = NotificationCenter()
        self.test_user = create(Builder('watcher')
                                .having(actorid=TEST_USER_ID))
        self.resource_a = create(Builder('resource')
                                 .oguid('fd:123')
                                 .watchers([self.test_user]))

        with freeze(pytz.UTC.localize(datetime(2014, 5, 7, 12, 30))):
            self.activity_1 = self.center.add_activity(
                Oguid('fd', '123'),
                'task-added',
                {'en': 'Kennzahlen 2014 erfassen'},
                {'en': 'Task added'},
                {'en': 'Task bla added by Hugo'},
                'hugo.boss',
                {'en': None}).get('activity')

            self.activity_2 = self.center.add_activity(
                Oguid('fd', '123'),
                'task-transition-open-in-progress',
                {'en': 'Kennzahlen 2014 erfassen'},
                {'en': 'Task accepted'},
                {'en': 'Task bla accepted'},
                'hugo.boss',
                {'en': None}).get('activity')

            self.notifications = self.center.get_users_notifications(TEST_USER_ID)

    @browsing
    def test_mark_single_notification_as_read(self, browser):
        notification_id = self.notifications[0].notification_id
        browser.login().open(self.portal, view='notifications/read',
                             data={'notification_ids': json.dumps([notification_id])})

        notifications = self.center.get_users_notifications(TEST_USER_ID)
        self.assertTrue(notifications[0].is_read)
        self.assertFalse(notifications[1].is_read)

    @browsing
    def test_mark_multiple_notifications_as_read(self, browser):
        ids = [self.notifications[0].notification_id,
               self.notifications[1].notification_id]

        browser.login().open(self.portal, view='notifications/read',
                             data={'notification_ids': json.dumps(ids)})

        notifications = self.center.get_users_notifications(TEST_USER_ID)
        self.assertTrue(notifications[0].is_read)
        self.assertTrue(notifications[1].is_read)

    @browsing
    def test_mark_already_read_or_invalid_notification_as_read_is_ignored(self, browser):
        invalid = 123
        notification_id = self.notifications[0].notification_id

        self.notifications[0].is_read = True

        browser.login().open(
            self.portal, view='notifications/read',
            data={'notification_ids': json.dumps([invalid, notification_id])})

    @browsing
    def test_read_raise_exception_when_parameter_is_missing(self, browser):
        with self.assertRaises(Exception):
            browser.login().open(self.portal, view='notifications/read')
 def setUp(self):
     super(TestWatcherHandling, self).setUp()
     self.center = NotificationCenter()
class TestDispatchers(ActivityTestCase):

    def setUp(self):
        super(TestDispatchers, self).setUp()

        self.dispatcher = FakeMailDispatcher()
        self.center = NotificationCenter(
            [self.dispatcher, BadgeIconDispatcher(), DigestDispatcher()])

        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))
        create(Builder('subscription')
               .having(resource=resource, watcher=hugo, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource,
                       watcher=peter,
                       role=TASK_RESPONSIBLE_ROLE))

    def test_uses_personal_setting_if_exists(self):
        create(Builder('notification_default_setting')
               .having(kind='task-added',
                       mail_notification_roles=[WATCHER_ROLE,
                                                TASK_RESPONSIBLE_ROLE]))

        create(Builder('notification_setting')
               .having(kind='task-added', userid='hugo'))


        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(1, len(self.dispatcher.notified))
        self.assertEquals(
            ['peter'],
            [note.userid for note in self.dispatcher.notified])

    def test_uses_notification_default_as_fallback(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 mail_notification_roles=[
                                     WATCHER_ROLE, TASK_RESPONSIBLE_ROLE]))

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(2, len(self.dispatcher.notified))

    def test_only_watchers_with_configured_roles_are_dispatched(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 mail_notification_roles=[WATCHER_ROLE]))

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(1, len(self.dispatcher.notified))
        self.assertEquals(u'hugo', self.dispatcher.notified[0].userid)

    def test_if_setting_for_kind_does_not_exist_dispatcher_is_ignored(self):
        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})


        self.assertEquals(0, len(self.dispatcher.notified))

    def test_badge_dispatcher_sets_badge_flag_depending_on_the_setting(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 badge_notification_roles=[TASK_RESPONSIBLE_ROLE]))

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        peters_note = Notification.query.filter_by(userid='peter').one()
        hugos_note = Notification.query.filter_by(userid='hugo').one()

        self.assertFalse(hugos_note.is_badge)
        self.assertTrue(peters_note.is_badge)

    def test_digest_dispatcher_sets_digest_flag_depending_on_the_setting(self):
        create(Builder('notification_default_setting')
               .having(kind='task-added',
                       digest_notification_roles=[TASK_RESPONSIBLE_ROLE]))

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        peters_note = Notification.query.filter_by(userid='peter').one()
        hugos_note = Notification.query.filter_by(userid='hugo').one()

        self.assertFalse(hugos_note.is_digest)
        self.assertTrue(peters_note.is_digest)
class TestDispatchers(ActivityTestCase):

    def setUp(self):
        super(TestDispatchers, self).setUp()

        self.dispatcher = FakeMailDispatcher()
        self.center = NotificationCenter([self.dispatcher])

        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))
        create(Builder('subscription')
               .having(resource=resource, watcher=hugo, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource,
                       watcher=peter,
                       role=TASK_RESPONSIBLE_ROLE))

    def test_check_for_notification_default(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 mail_notification=False))
        setting.set_mail_notification_roles(
            [WATCHER_ROLE, TASK_RESPONSIBLE_ROLE])

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(0, len(self.dispatcher.notified))

        setting.mail_notification = True
        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(2, len(self.dispatcher.notified))

    def test_only_watchers_with_configured_roles_are_dispatched(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 mail_notification=True))
        setting.set_mail_notification_roles([WATCHER_ROLE])

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(1, len(self.dispatcher.notified))
        self.assertEquals(u'hugo', self.dispatcher.notified[0].userid)

    def test_if_setting_for_kind_does_not_exist_dispatcher_is_ignored(self):
        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})


        self.assertEquals(0, len(self.dispatcher.notified))
class TestWatcherHandling(ActivityTestCase):

    def setUp(self):
        super(TestWatcherHandling, self).setUp()
        self.center = NotificationCenter()

    def test_fetch_returns_watcher_by_means_of_actor_id(self):
        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))

        self.assertEquals(hugo, self.center.fetch_watcher('hugo'))
        self.assertEquals(peter, self.center.fetch_watcher('peter'))

    def test_return_none_when_watcher_not_exists(self):
        self.assertEquals(None, self.center.fetch_watcher('peter'))

    def test_adding(self):
        self.center.add_watcher('peter')

        self.assertEquals(1, len(Watcher.query.all()))
        self.assertEquals('peter', Watcher.query.first().actorid)

    def test_add_watcher_twice_raise_integrity_error(self):
        self.center.add_watcher('peter')
        with self.assertRaises(IntegrityError):
            self.center.add_watcher('peter')
            transaction.commit()

        transaction.abort()

    def test_add_watcher_to_resource(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        self.assertEquals([peter], list(resource.watchers))

    def test_adding_watcher_twice_to_resource_is_ignored(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')
        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        self.assertEquals([peter], list(resource.watchers))

    def test_add_watcher_to_resource_creates_resource_when_not_exitst(self):
        peter = create(Builder('watcher').having(actorid='peter'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        resource = peter.resources[0]
        self.assertEquals('fd:123', resource.oguid)

    def test_add_watcher_to_resource_creates_watcher_when_not_exitst(self):
        resource = create(Builder('resource').oguid('fd:123'))

        self.center.add_watcher_to_resource(Oguid('fd', '123'), 'peter')

        watcher = list(resource.watchers)[0]
        self.assertEquals('peter', watcher.actorid)

    def test_get_watchers_returns_a_list_of_resource_watchers(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))
        fritz = create(Builder('watcher').having(actorid='fritz'))

        resource_1 = create(Builder('resource')
                            .oguid('fd:123').watchers([hugo, fritz]))
        resource_2 = create(Builder('resource')
                            .oguid('fd:456').watchers([peter]))

        # A weakref gets reaped unless we keep a reference to the resources.
        # https://stackoverflow.com/questions/30044069/stale-association-proxy-parent-object-has-gone-out-of-scope-with-flask-sqlalc
        # So to squelch pyflakes we do trivial asserts on them here.
        self.assertEquals(123, resource_1.int_id)
        self.assertEquals(456, resource_2.int_id)

        self.assertEquals((hugo, fritz), self.center.get_watchers(Oguid('fd', '123')))
        self.assertEquals((peter,),
                          self.center.get_watchers(Oguid('fd', '456')))

    def test_get_watchers_returns_empty_list_when_resource_not_exists(self):
        self.assertEquals((), self.center.get_watchers(Oguid('fd', '123')))

    def test_remove_watcher_from_resource_will_be_ignored_when_watcher_not_exists(self):
        create(Builder('resource').oguid('fd:123'))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

    def test_remove_watcher_from_resource_will_remove_subscription_if_no_roles_left(self):
        resource = create(Builder('resource').oguid('fd:123'))
        watcher = create(Builder('watcher').having(actorid=u'peter'))
        create(Builder('subscription')
               .having(resource=resource, watcher=watcher, role=WATCHER_ROLE))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

        self.assertEquals([], resource.watchers)

    def test_remove_watcher_from_resource_will_be_ignored_when_resource_not_exists(self):
        create(Builder('watcher').having(actorid='peter'))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

    def test_remove_watcher_from_resource(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))
        resource = create(Builder('resource')
                          .oguid('fd:123')
                          .watchers([hugo, peter]))

        self.center.remove_watcher_from_resource(
            Oguid('fd', '123'), 'peter', WATCHER_ROLE)

        self.assertEquals([hugo], resource.watchers)

    def test_remove_watchers_from_resource_by_role(self):
        peter = create(Builder('watcher').having(actorid='peter'))
        hugo = create(Builder('watcher').having(actorid='hugo'))
        marie = create(Builder('watcher').having(actorid='marie'))
        resource = create(Builder('resource').oguid('fd:123'))
        create(Builder('subscription')
               .having(resource=resource, watcher=peter, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource, watcher=marie, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource, watcher=peter, role=TASK_ISSUER_ROLE))
        create(Builder('subscription')
               .having(resource=resource, watcher=hugo, role=TASK_ISSUER_ROLE))

        self.center.remove_watchers_from_resource_by_role(
            Oguid('fd', '123'), WATCHER_ROLE)

        self.assertEqual(
            set([TASK_ISSUER_ROLE]),
            set([subscription.role for subscription in Subscription.query.all()]))

        self.assertEquals([peter, hugo], resource.watchers)

    def test_remove_watchers_from_resource_by_role_does_not_affect_other_resources(self):
        hugo = create(Builder('watcher').having(actorid='hugo'))

        create(Builder('resource').oguid('fd:123').watchers([hugo]))
        create(Builder('resource').oguid('fd:234').watchers([hugo]))

        self.assertEqual(2, Subscription.query.count())
        self.assertEqual(
            ['fd:123', 'fd:234'],
            [subscription.resource.oguid.id for subscription in Subscription.query.all()])

        self.center.remove_watchers_from_resource_by_role(
            Oguid('fd', '234'), WATCHER_ROLE)
Esempio n. 40
0
class TestDispatchers(ActivityTestCase):

    def setUp(self):
        super(TestDispatchers, self).setUp()

        self.dispatcher = FakeMailDispatcher()
        self.center = NotificationCenter([self.dispatcher])

        hugo = create(Builder('watcher').having(actorid='hugo'))
        peter = create(Builder('watcher').having(actorid='peter'))
        resource = create(Builder('resource').oguid('fd:123'))
        create(Builder('subscription')
               .having(resource=resource, watcher=hugo, role=WATCHER_ROLE))
        create(Builder('subscription')
               .having(resource=resource,
                       watcher=peter,
                       role=TASK_RESPONSIBLE_ROLE))

    def test_check_for_notification_default(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 mail_notification=False))
        setting.set_mail_notification_roles(
            [WATCHER_ROLE, TASK_RESPONSIBLE_ROLE])

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(0, len(self.dispatcher.notified))

        setting.mail_notification = True
        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(2, len(self.dispatcher.notified))

    def test_only_watchers_with_configured_roles_are_dispatched(self):
        setting = create(Builder('notification_default_setting')
                         .having(kind='task-added',
                                 mail_notification=True))
        setting.set_mail_notification_roles([WATCHER_ROLE])

        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})

        self.assertEquals(1, len(self.dispatcher.notified))
        self.assertEquals(u'hugo', self.dispatcher.notified[0].userid)

    def test_if_setting_for_kind_does_not_exist_dispatcher_is_ignored(self):
        self.center.add_activity(
            Oguid('fd', '123'),
            'task-added',
            {'en': 'Kennzahlen 2014 erfassen'},
            {'en': 'Task added'},
            {'en': 'Task bla accepted by Peter'},
            'hugo.boss',
            {'en': None})


        self.assertEquals(0, len(self.dispatcher.notified))