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 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')
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 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])
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')