Beispiel #1
0
class TestPost(TestCase):
    fixtures = ['test_users', 'test_contest']

    def setUp(self):
        delta = timedelta(days=3)
        self.past = timezone.now() - delta
        self.contest = get_contest_with_forum()
        self.user = User.objects.get(username='******')
        self.forum = self.contest.forum
        self.cat = Category(forum=self.forum, name='test_category')
        self.cat.save()
        self.thr = Thread(category=self.cat, name='test_thread')
        self.thr.save()
        self.p = Post(thread=self.thr, content='Test post!',
                      author=self.user, add_date=self.past)
        self.p.save()

    def assertContainsReportOption(self, response):
        self.assertNotContains(response, 'This post was reported')
        self.assertContains(response, 'report')

    def assertContainsApproveOption(self, response):
        self.assertNotContains(response,
                               'This post was approved.')
        self.assertContains(response, 'approve')

    def test_report(self):
        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_post_report',
                      kwargs={'contest_id': self.contest.id,
                              'category_id': self.cat.id,
                              'thread_id': self.thr.id,
                              'post_id': self.p.id})
        name = self.user.first_name
        surname = self.user.last_name
        response = self.client.post(url, follow=True)
        self.assertContains(response, 'This post was reported')
        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_thread', kwargs={'category_id': self.cat.id,
                                              'thread_id': self.thr.id})
        response = self.client.post(url, follow=True)

        reported_pattern = r"was reported\s*by\s*<a[^>]*>\s*%s %s\s*<\/a>" \
                           % (name, surname)
        self.assertTrue(re.search(reported_pattern, response.content.decode('utf-8')))

    def test_approve_after_report(self):
        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_thread', kwargs={'contest_id': self.contest.id,
                                              'category_id': self.cat.id,
                                              'thread_id': self.thr.id})
        response = self.client.get(url, follow=True)
        self.assertContainsReportOption(response)
        self.assertContainsApproveOption(response)

        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_thread', kwargs={'contest_id': self.contest.id,
                                              'category_id': self.cat.id,
                                              'thread_id': self.thr.id})
        response = self.client.get(url, follow=True)
        self.assertContainsReportOption(response)
        self.assertNotContains(response, 'approve')

        url = reverse('forum_post_report',
                      kwargs={'contest_id': self.contest.id,
                              'category_id': self.cat.id,
                              'thread_id': self.thr.id,
                              'post_id': self.p.id})
        response = self.client.post(url, follow=True)
        self.assertContains(response, 'This post was reported')

        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_post_approve',
                      kwargs={'contest_id': self.contest.id,
                              'category_id': self.cat.id,
                              'thread_id': self.thr.id,
                              'post_id': self.p.id})
        response = self.client.post(url, follow=True)
        self.assertContains(response, 'revoke approval')

        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_thread', kwargs={'contest_id': self.contest.id,
                                              'category_id': self.cat.id,
                                              'thread_id': self.thr.id})
        response = self.client.get(url, follow=True)
        self.assertNotContains(response, 'report')
        self.assertContains(response,
                            'This post was approved.')
        self.assertNotContains(response, 'revoke approval')

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_approve_without_report(self):
        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_thread', kwargs={'contest_id': self.contest.id,
                                              'category_id': self.cat.id,
                                              'thread_id': self.thr.id})
        response = self.client.get(url, follow=True)
        self.assertContainsReportOption(response)
        self.assertContainsApproveOption(response)

        url = reverse('forum_post_approve',
                      kwargs={'contest_id': self.contest.id,
                              'category_id': self.cat.id,
                              'thread_id': self.thr.id,
                              'post_id': self.p.id})
        self.client.post(url, follow=True)

        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_thread', kwargs={'contest_id': self.contest.id,
                                              'category_id': self.cat.id,
                                              'thread_id': self.thr.id})
        response = self.client.get(url, follow=True)
        self.assertNotContains(response, 'report')
        self.assertContains(response,
                            'This post was approved.')

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_report_after_approve(self):
        self.p.approved = True
        self.p.save()

        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_post_report',
                      kwargs={'contest_id': self.contest.id,
                              'category_id': self.cat.id,
                              'thread_id': self.thr.id,
                              'post_id': self.p.id})
        self.client.post(url)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_thread', kwargs={'contest_id': self.contest.id,
                                              'category_id': self.cat.id,
                                              'thread_id': self.thr.id})
        response = self.client.get(url, follow=True)
        self.assertNotContains(response, 'report')
        self.assertContains(response,
                            'This post was approved.')

    def test_revoking_approval_after_edit(self):
        self.p.approved = True
        self.p.save()

        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_post_edit',
                      kwargs={'contest_id': self.contest.id,
                              'category_id': self.cat.id,
                              'thread_id': self.thr.id,
                              'post_id': self.p.id})
        self.client.get(url, follow=True)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)

        url = reverse('forum_post_edit',
                      kwargs={'contest_id': self.contest.id,
                              'category_id': self.cat.id,
                              'thread_id': self.thr.id,
                              'post_id': self.p.id})
        self.client.post(url, {'content': 'Test content'})

        self.p.refresh_from_db()
        self.assertFalse(self.p.approved)

    def test_admin_approval_edit(self):
        self.p.reported = True
        self.p.save()

        data = {
            'content': self.p.content,
            'thread': self.thr.id,
            'reported': self.p.reported,
            'approved': True
        }

        self.assertTrue(self.client.login(username='******'))
        self.client.get('/c/c/')  # 'c' becomes the current contest
        url = reverse('oioioiadmin:forum_post_change', args=(self.p.id,))
        self.client.post(url, data)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

        data['reported'] = True
        self.client.post(url, data)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_admin_approve_action(self):
        self.p.reported = True
        self.p.save()

        data = {'_selected_action': (self.p.id, ),
                'action': 'approve_action'}

        self.assertTrue(self.client.login(username='******'))
        self.client.get('/c/c/')  # 'c' becomes the current contest
        url = reverse('oioioiadmin:forum_post_changelist')
        self.client.post(url, data, follow=True)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_admin_revoke_approval_action(self):
        self.p.approved = True
        self.p.save()

        data = {'_selected_action': (self.p.id, ),
                'action': 'revoke_approval_action'}

        self.assertTrue(self.client.login(username='******'))
        self.client.get('/c/c/')  # 'c' becomes the current contest
        url = reverse('oioioiadmin:forum_post_changelist')
        self.client.post(url, data, follow=True)

        self.p.refresh_from_db()
        self.assertFalse(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_revoke_approval(self):
        self.p.approved = True
        self.p.save()

        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_thread', kwargs={'contest_id': self.contest.id,
                                              'category_id': self.cat.id,
                                              'thread_id': self.thr.id})
        response = self.client.get(url, follow=True)
        self.assertNotContains(response, 'revoke approval')

        self.assertTrue(self.client.login(username='******'))
        url = reverse('forum_thread', kwargs={'contest_id': self.contest.id,
                                              'category_id': self.cat.id,
                                              'thread_id': self.thr.id})
        response = self.client.get(url, follow=True)
        self.assertContains(response, 'revoke approval')

        url = reverse('forum_post_revoke_approval',
                      kwargs={'contest_id': self.contest.id,
                              'category_id': self.cat.id,
                              'thread_id': self.thr.id,
                              'post_id': self.p.id})
        response = self.client.post(url, follow=True)
        self.assertNotContains(response, 'revoke approval')

        self.p.refresh_from_db()
        self.assertFalse(self.p.approved)
        self.assertFalse(self.p.reported)
Beispiel #2
0
class TestPost(TestCase):
    fixtures = ['test_users', 'test_contest']

    def setUp(self):
        delta = timedelta(days=3)
        self.past = timezone.now() - delta
        self.contest = get_contest_with_forum()
        self.user = User.objects.get(username='******')
        self.forum = self.contest.forum
        self.cat = Category(forum=self.forum, name='test_category')
        self.cat.save()
        self.thr = Thread(category=self.cat, name='test_thread')
        self.thr.save()
        self.p = Post(thread=self.thr,
                      content='Test post!',
                      author=self.user,
                      add_date=self.past)
        self.p.save()
        self.thread_url = reverse(
            'forum_thread',
            kwargs={
                'contest_id': self.contest.id,
                'category_id': self.cat.id,
                'thread_id': self.thr.id,
            },
        )

    def reverse_post(self, view_name):
        return reverse(
            view_name,
            kwargs={
                'contest_id': self.contest.id,
                'category_id': self.cat.id,
                'thread_id': self.thr.id,
                'post_id': self.p.id,
            },
        )

    def assertContainsReportOption(self, response):
        self.assertNotContains(response, 'This post was reported')
        self.assertContains(response, 'report')

    def assertContainsApproveOption(self, response):
        self.assertNotContains(response, 'This post was approved.')
        self.assertContains(response, 'approve')

    def report_post(self):
        self.p.reported = True
        self.p.reported_by = self.user
        self.p.save()

    def test_report(self):
        self.assertTrue(self.client.login(username='******'))
        url = self.reverse_post('forum_post_report')
        name = self.user.first_name
        surname = self.user.last_name
        response = self.client.get(url, follow=True)
        self.assertContains(response, 'Report confirmation')
        self.report_post()
        self.assertTrue(self.client.login(username='******'))
        url = reverse(
            'forum_thread',
            kwargs={
                'category_id': self.cat.id,
                'thread_id': self.thr.id
            },
        )
        response = self.client.post(url, follow=True)

        reported_pattern = r"was reported\s*by\s*<a[^>]*>\s*%s %s\s*<\/a>" % (
            name,
            surname,
        )
        self.assertTrue(
            re.search(reported_pattern, response.content.decode('utf-8')))

    def test_approve_after_report(self):
        self.assertTrue(self.client.login(username='******'))

        response = self.client.get(self.thread_url, follow=True)
        self.assertContainsReportOption(response)
        self.assertContainsApproveOption(response)

        self.assertTrue(self.client.login(username='******'))

        response = self.client.get(self.thread_url, follow=True)
        self.assertContainsReportOption(response)
        self.assertNotContains(response, 'approve')

        self.report_post()
        response = self.client.post(self.thread_url, follow=True)
        self.assertContains(response, 'This post was reported')

        self.assertTrue(self.client.login(username='******'))
        url = self.reverse_post('forum_post_approve')
        response = self.client.post(url, follow=True)
        self.assertContains(response, 'revoke approval')
        self.assertContains(response, 'This post was approved.')

        self.assertTrue(self.client.login(username='******'))

        response = self.client.get(self.thread_url, follow=True)
        self.assertNotContains(response, 'report')
        self.assertNotContains(response, 'revoke approval')

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_approve_without_report(self):
        self.assertTrue(self.client.login(username='******'))

        response = self.client.get(self.thread_url, follow=True)
        self.assertContainsReportOption(response)
        self.assertContainsApproveOption(response)

        url = self.reverse_post('forum_post_approve')
        self.client.post(url, follow=True)

        self.assertTrue(self.client.login(username='******'))
        response = self.client.get(self.thread_url, follow=True)
        self.assertNotContains(response, 'report')

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_report_after_approve(self):
        self.p.approved = True
        self.p.save()

        self.assertTrue(self.client.login(username='******'))
        url = self.reverse_post('forum_post_report')
        self.client.post(url)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

        self.assertTrue(self.client.login(username='******'))
        response = self.client.get(self.thread_url, follow=True)
        self.assertNotContains(response, 'report')

    def test_revoking_approval_after_edit(self):
        self.p.approved = True
        self.p.save()

        self.assertTrue(self.client.login(username='******'))
        url = self.reverse_post('forum_post_edit')
        self.client.get(url, follow=True)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)

        self.client.post(url, {'content': 'Test content'})

        self.p.refresh_from_db()
        self.assertFalse(self.p.approved)

    def test_admin_approval_edit(self):
        self.p.reported = True
        self.p.save()

        data = {
            'content': self.p.content,
            'thread': self.thr.id,
            'reported': self.p.reported,
            'approved': True,
        }

        self.assertTrue(self.client.login(username='******'))
        self.client.get('/c/c/')  # 'c' becomes the current contest
        url = reverse('oioioiadmin:forum_post_change', args=(self.p.id, ))
        self.client.post(url, data)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

        data['reported'] = True
        self.client.post(url, data)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_admin_approve_action(self):
        self.p.reported = True
        self.p.save()

        data = {'_selected_action': (self.p.id, ), 'action': 'approve_action'}

        self.assertTrue(self.client.login(username='******'))
        self.client.get('/c/c/')  # 'c' becomes the current contest
        url = reverse('oioioiadmin:forum_post_changelist')
        self.client.post(url, data, follow=True)

        self.p.refresh_from_db()
        self.assertTrue(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_admin_revoke_approval_action(self):
        self.p.approved = True
        self.p.save()

        data = {
            '_selected_action': (self.p.id, ),
            'action': 'revoke_approval_action'
        }

        self.assertTrue(self.client.login(username='******'))
        self.client.get('/c/c/')  # 'c' becomes the current contest
        url = reverse('oioioiadmin:forum_post_changelist')
        self.client.post(url, data, follow=True)

        self.p.refresh_from_db()
        self.assertFalse(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_revoke_approval(self):
        self.p.approved = True
        self.p.save()

        self.assertTrue(self.client.login(username='******'))
        response = self.client.get(self.thread_url, follow=True)
        self.assertNotContains(response, 'revoke approval')

        self.assertTrue(self.client.login(username='******'))
        response = self.client.get(self.thread_url, follow=True)
        self.assertContains(response, 'revoke approval')

        url = self.reverse_post('forum_post_revoke_approval')
        response = self.client.post(url, follow=True)
        self.assertNotContains(response, 'revoke approval')

        self.p.refresh_from_db()
        self.assertFalse(self.p.approved)
        self.assertFalse(self.p.reported)

    def test_reactions_visible_only_if_enabled(self):
        self.cat.reactions_enabled = False
        self.cat.save()
        response = self.client.get(self.thread_url, follow=True)
        self.assertNotContains(response, 'post_reactions')

        self.cat.reactions_enabled = True
        self.cat.save()
        response = self.client.get(self.thread_url, follow=True)
        self.assertContains(response, 'post_reactions')

    def test_reactions_not_clickable_for_anon(self):
        react_url = self.reverse_post('forum_post_toggle_reaction')
        downvote_url = react_url + '?reaction=downvote'

        self.cat.reactions_enabled = True
        self.cat.save()

        response = self.client.get(self.thread_url, follow=True)
        self.assertEqual(200, response.status_code)
        self.assertNotContains(response, downvote_url)
        self.assertTrue(self.client.login(username='******'))
        response = self.client.get(self.thread_url, follow=True)
        self.assertEqual(200, response.status_code)
        self.assertContains(response, downvote_url)

    def test_reactions_from_multiple_users(self):
        react_url = self.reverse_post('forum_post_toggle_reaction')
        downvote_url = react_url + '?reaction=downvote'

        self.cat.reactions_enabled = True
        self.cat.save()

        self.assertTrue(self.client.login(username='******'))
        response = self.client.post(downvote_url, follow=True)
        self.assertEqual(200, response.status_code)
        self.assertTrue(self.client.login(username='******'))
        response = self.client.post(downvote_url, follow=True)
        self.assertEqual(200, response.status_code)

        self.assertEqual(
            2,
            self.p.reactions.filter(type_of_reaction='DOWNVOTE').count())
        self.assertEqual(2, self.p.reactions.count())

    def test_remove_reaction(self):
        react_url = self.reverse_post('forum_post_toggle_reaction')
        downvote_url = react_url + '?reaction=downvote'
        self.cat.reactions_enabled = True
        self.cat.save()
        self.assertTrue(self.client.login(username='******'))

        def count_reactions(r):
            return self.p.reactions.filter(type_of_reaction=r).count()

        self.assertEqual(0, count_reactions('DOWNVOTE'))
        self.assertEqual(0, self.p.reactions.count())

        self.client.post(downvote_url, follow=True)
        self.assertEqual(1, count_reactions('DOWNVOTE'))
        self.assertEqual(1, self.p.reactions.count())

        self.client.post(downvote_url, follow=True)
        self.assertEqual(0, count_reactions('DOWNVOTE'))
        self.assertEqual(0, self.p.reactions.count())

    def test_switch_reaction(self):
        react_url = self.reverse_post('forum_post_toggle_reaction')
        downvote_url = react_url + '?reaction=downvote'
        upvote_url = react_url + '?reaction=upvote'
        self.cat.reactions_enabled = True
        self.cat.save()
        self.assertTrue(self.client.login(username='******'))

        def count_reactions(r):
            return self.p.reactions.filter(type_of_reaction=r).count()

        self.assertEqual(0, self.p.reactions.count())

        self.client.post(upvote_url, follow=True)
        self.assertEqual(1, count_reactions('UPVOTE'))
        self.assertEqual(0, count_reactions('DOWNVOTE'))
        self.assertEqual(1, self.p.reactions.count())

        self.client.post(downvote_url, follow=True)
        self.assertEqual(0, count_reactions('UPVOTE'))
        self.assertEqual(1, count_reactions('DOWNVOTE'))
        self.assertEqual(1, self.p.reactions.count())