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)
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())