def test_invalidate_view(self): contest = Contest.objects.get() url = reverse('ranking_invalidate', kwargs={ 'contest_id': contest.id, 'key': 'key' }) self.assertTrue(self.client.login(username='******')) with fake_time(datetime(2019, 1, 27, tzinfo=utc)): check_not_accessible(self, url) self.assertTrue(self.client.login(username='******')) with fake_time(datetime(2019, 1, 27, tzinfo=utc)): ranking, _ = Ranking.objects.get_or_create( contest=contest, key='admin#key', needs_recalculation=False) ranking.save() self.assertTrue(ranking.is_up_to_date()) recalc = choose_for_recalculation() self.assertIsNone(recalc) response = self.client.post(url, key='key') ranking.refresh_from_db() self.assertFalse(ranking.is_up_to_date()) recalc = choose_for_recalculation() self.assertIsNotNone(recalc)
def test_ranking_csv_view(self): contest = Contest.objects.get() url = reverse("ranking_csv", kwargs={"contest_id": contest.id, "key": "c"}) self.client.login(username="******") with fake_time(datetime(2015, 8, 5, tzinfo=utc)): check_not_accessible(self, url) self.client.login(username="******") with fake_time(datetime(2012, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertContains(response, "User,") # Check that Admin is filtered out. self.assertNotContains(response, "Admin") expected_order = ["Test,User", "Test,User 2"] prev_pos = 0 for user in expected_order: pattern = "%s," % (user,) self.assertIn(user, response.content) pos = response.content.find(pattern) self.assertGreater(pos, prev_pos, msg=("User %s has incorrect " "position" % (user,))) prev_pos = pos for task in ["zad1", "zad2", "zad3", "zad3"]: self.assertContains(response, task) response = self.client.get(reverse("ranking", kwargs={"contest_id": contest.id, "key": "1"})) self.assertContains(response, "zad1") for task in ["zad2", "zad3", "zad3"]: self.assertNotContains(response, task)
def test_simple_mailsubmission(self): contest = Contest.objects.get() problem_instance = ProblemInstance.objects.get() problem_instance.submissions_limit = 0 problem_instance.save() round = Round.objects.get() round.start_date = datetime(2012, 7, 31, tzinfo=utc) round.end_date = datetime(2012, 8, 10, tzinfo=utc) round.save() msc = MailSubmissionConfig( contest=contest, enabled=True, start_date=datetime(2012, 8, 12, tzinfo=utc), end_date=datetime(2012, 8, 14, tzinfo=utc), ) msc.save() with fake_time(datetime(2012, 8, 11, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) self.assertEqual(MailSubmission.objects.count(), 0) with fake_time(datetime(2012, 8, 13, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(200, response.status_code) self.assertEqual(MailSubmission.objects.count(), 1) with fake_time(datetime(2012, 8, 15, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) self.assertEqual(MailSubmission.objects.count(), 1)
def test_user_info_page(self): self.assertTrue(self.client.login(username='******')) user = User.objects.get(username="******") contest = Contest.objects.get() response_callback = lambda: self.client.get(reverse('user_info', kwargs={'contest_id': contest.id, 'user_id': user.id})) with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Ni in code") self.assertContains(response, "ninininini") self.assertNotContains(response, "I cannot tell") self.assertNotContains(response, "Knights of Ni") _disqualify_contestwide() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Ni in code") self.assertContains(response, "ninininini") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni") Disqualification.objects.filter(submission__isnull=False).delete() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertNotContains(response, "Ni in code") self.assertNotContains(response, "ninininini") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni")
def _assert_disqualification_box(self, response_callback): with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Ni in code") self.assertContains(response, "ninininini") self.assertNotContains(response, "Score") self.assertNotIn(">34<", self.remove_whitespaces(response)) self.assertNotIn(">42<", self.remove_whitespaces(response)) _disqualify_contestwide() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Ni in code") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni") self.assertNotIn(">34<", self.remove_whitespaces(response)) self.assertNotIn(">42<", self.remove_whitespaces(response)) Disqualification.objects.filter(submission__isnull=False).delete() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertNotContains(response, "Ni in code") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni") # Even disqualified users can see their score self.assertIn(">34<", self.remove_whitespaces(response))
def test_making_complaint(self): contest = Contest.objects.get() contest.controller_name = 'oioioi.oi.controllers.OIOnsiteContestController' contest.save() user = User.objects.get(username='******') p = Participant(contest=contest, user=user, status='ACTIVE') p.save() with fake_time(datetime(2012, 8, 11, tzinfo=utc)): self.assertTrue(self.client.login(username='******')) response = self.client.post( reverse('add_complaint', kwargs={'contest_id': contest.id}), {'complaint': "I am innocent! It is your fault!"}, follow=True, ) self.assertEqual(response.status_code, 403) cconfig = ComplaintsConfig( contest=contest, enabled=True, start_date=datetime(2012, 8, 10, tzinfo=utc), end_date=datetime(2012, 8, 12, tzinfo=utc), ) cconfig.save() with fake_time(datetime(2012, 8, 9, tzinfo=utc)): response = self.client.get( reverse('add_complaint', kwargs={'contest_id': contest.id})) self.assertEqual(response.status_code, 403) with fake_time(datetime(2012, 8, 13, tzinfo=utc)): response = self.client.get( reverse('add_complaint', kwargs={'contest_id': contest.id})) self.assertEqual(response.status_code, 403) with fake_time(datetime(2012, 8, 11, tzinfo=utc)): response = self.client.post( reverse('add_complaint', kwargs={'contest_id': contest.id}), {'complaint': "I am innocent! It is your fault!"}, follow=True, ) self.assertEqual(response.status_code, 200) self.assertContains(response, "has been sent") jurym = mail.outbox[0].message() userm = mail.outbox[1].message() del mail.outbox[:] # Header class doesn't offer 'in' operator expected = "[oioioi-complaints] Complaint: Test User (test_user)" self.assertEqual(expected, jurym['Subject']) self.assertEqual(expected, userm['Subject']) self.assertEqual("*****@*****.**", jurym['To']) self.assertEqual("*****@*****.**", userm['To']) self.assertEqual(jurym['Message-ID'], userm['References']) self.assertEqual(userm['Message-ID'], jurym['References']) self.assertIn("your fault!", jurym.as_string()) self.assertIn("your fault!", userm.as_string())
def test_output_views(self): self.client.login(username='******') submission = TestRunProgramSubmission.objects.get(pk=1) kwargs = {'contest_id': submission.problem_instance.contest.id, 'submission_id': submission.id} with fake_time(datetime(2011, 8, 5, tzinfo=utc)): show_output = self.client.get(reverse('get_testrun_output', kwargs=kwargs), HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertContains(show_output, '18') self.assertIn(b'Output', show_output.content) download_response = self.client.get(reverse( 'download_testrun_output', kwargs=kwargs)) self.assertContains(download_response, '18\n') self.assertTrue(download_response['Content-Disposition'] .startswith('attachment')) self.assertIn('filename="output.out"', download_response['Content-Disposition']) with fake_time(datetime(2014, 8, 5, tzinfo=utc)): show_output = self.client.get(reverse('get_testrun_output', kwargs=kwargs), HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertContains(show_output, '18')
def test_output_views(self): self.assertTrue(self.client.login(username='******')) submission = TestRunProgramSubmission.objects.get(pk=1) kwargs = {'contest_id': submission.problem_instance.contest.id, 'submission_id': submission.id} with fake_time(datetime(2011, 8, 5, tzinfo=utc)): show_output = self.client.get(reverse('get_testrun_output', kwargs=kwargs), HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertContains(show_output, '18') self.assertContains(show_output, 'Output') download_response = self.client.get(reverse( 'download_testrun_output', kwargs=kwargs)) self.assertContains(download_response, '18\n') self.assertTrue(download_response['Content-Disposition'] .startswith('attachment')) self.assertIn('filename="output.out"', download_response['Content-Disposition']) with fake_time(datetime(2014, 8, 5, tzinfo=utc)): show_output = self.client.get(reverse('get_testrun_output', kwargs=kwargs), HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertContains(show_output, '18')
def _assert_disqualification_box(self, response_callback): with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Ni in code") self.assertContains(response, "ninininini") self.assertContains(response, "Score") self.assertIn(">34<", self.remove_whitespaces(response)) self.assertIn(">42<", self.remove_whitespaces(response)) _disqualify_contestwide() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Ni in code") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni") self.assertIn(">34<", self.remove_whitespaces(response)) self.assertIn(">42<", self.remove_whitespaces(response)) Disqualification.objects.filter(submission__isnull=False).delete() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertNotContains(response, "Ni in code") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni") self.assertIn(">34<", self.remove_whitespaces(response))
def test_new_labels(self): self.assertTrue(self.client.login(username='******')) contest = Contest.objects.get() list_url = reverse('contest_messages', kwargs={'contest_id': contest.id}) timestamp = timezone.make_aware(datetime.utcfromtimestamp(1347025200)) with fake_time(timestamp): response = self.client.get(list_url) self.assertContains(response, '>NEW<', count=2) public_answer = Message.objects.get(topic='public-answer') with fake_time(timestamp): response = self.client.get( reverse( 'message', kwargs={ 'contest_id': contest.id, 'message_id': public_answer.id }, )) self.assertContains(response, 'public-answer-body') self.assertNotContains(response, 'contest-question') self.assertNotContains(response, 'problem-question') with fake_time(timestamp): response = self.client.get(list_url) self.assertContains(response, '>NEW<', count=1)
def test_pdf_report_view(self): contest = Contest.objects.get() url = reverse("oireports", kwargs={"contest_id": contest.id}) post_vars = { "report_round": CONTEST_REPORT_KEY, "report_region": CONTEST_REPORT_KEY, "testgroup[zad1]": ["0", "1", "2", "3"], "form_type": "pdf_report", "single_report_user": "", } # Let's check if report is not available for regular user. self.client.login(username="******") with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.post(url, post_vars) self.assertEqual(response.status_code, 403) self.client.login(username="******") with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.post(url, post_vars) pages = slate.PDF(StringIO(self.streamingContent(response))) self.assertIn("test_user", pages[0]) self.assertIn("Wynik:34", pages[0]) self.assertIn("ZAD1", pages[0]) self.assertIn("1bRuntimeerror0.00s/0.10sprogramexited", pages[0]) self.assertNotIn("test_user2", pages.text())
def test_xml_view(self): contest = Contest.objects.get() url = reverse("oireports", kwargs={"contest_id": contest.id}) post_vars = { "report_round": CONTEST_REPORT_KEY, "report_region": CONTEST_REPORT_KEY, "testgroup[zad1]": ["0", "1", "2", "3"], "form_type": "xml_report", "single_report_user": "", } # Let's check if report is not available for regular user. self.client.login(username="******") with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.post(url, post_vars) self.assertEqual(response.status_code, 403) self.client.login(username="******") with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.post(url, post_vars) content = self.streamingContent(response) self.assertIn("<user>Test User (test_user)", content) self.assertIn("<result>34</result>", content) self.assertIn("<taskid>zad1</taskid>", content) self.assertIn("<code>%23include", content) self.assertIn("<testcomment>program exited with", content) self.assertNotIn("test_user2", content)
def test_exclusive_contest(self): self._assertContestVisible('c1') self._assertContestVisible('c2') self.client.login(username='******') self._assertContestVisible('c1') self._assertContestVisible('c2') ex_conf = ExclusivenessConfig() ex_conf.contest = self.c2 ex_conf.start_date = datetime(2012, 1, 1, 10, tzinfo=utc) ex_conf.end_date = datetime(2012, 1, 1, 14, tzinfo=utc) ex_conf.save() with fake_time(datetime(2012, 1, 1, 9, 59, tzinfo=utc)): self._assertContestVisible('c1') self._assertContestVisible('c2') with fake_time(datetime(2012, 1, 1, 11, tzinfo=utc)): self._assertContestRedirects('c1', '/c/c2/') self._assertContestVisible('c2') with fake_time(datetime(2012, 1, 1, 14, 1, tzinfo=utc)): self._assertContestVisible('c1') self._assertContestVisible('c2')
def test_ranking_csv_view(self): contest = Contest.objects.get() url = reverse('ranking_csv', kwargs={'contest_id': contest.id, 'key': 'c'}) self.client.login(username='******') with fake_time(datetime(2015, 8, 5, tzinfo=utc)): check_not_accessible(self, url) self.client.login(username='******') with fake_time(datetime(2012, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertContains(response, 'User,') # Check that Admin is filtered out. self.assertNotContains(response, 'Admin') expected_order = ['Test,User', 'Test,User 2'] prev_pos = 0 for user in expected_order: pattern = '%s,' % (user,) self.assertIn(user, response.content) pos = response.content.find(pattern) self.assertGreater(pos, prev_pos, msg=('User %s has incorrect ' 'position' % (user,))) prev_pos = pos for task in ['zad1', 'zad2', 'zad3', 'zad3']: self.assertContains(response, task) response = self.client.get(reverse('ranking', kwargs={'contest_id': contest.id, 'key': '1'})) self.assertContains(response, 'zad1') for task in ['zad2', 'zad3', 'zad3']: self.assertNotContains(response, task)
def test_exclusive_contest(self): self._assertContestVisible('c1') self._assertContestVisible('c2') self.assertTrue(self.client.login(username='******')) self._assertContestVisible('c1') self._assertContestVisible('c2') add_ex_conf( self.c2, datetime(2012, 1, 1, 10, tzinfo=utc), datetime(2012, 1, 1, 14, tzinfo=utc), ) with fake_time(datetime(2012, 1, 1, 9, 59, tzinfo=utc)): self._assertContestVisible('c1') self._assertContestVisible('c2') with fake_time(datetime(2012, 1, 1, 11, tzinfo=utc)): self._assertContestRedirects('c1', '/c/c2/') self._assertContestVisible('c2') with fake_time(datetime(2012, 1, 1, 14, 1, tzinfo=utc)): self._assertContestVisible('c1') self._assertContestVisible('c2')
def test_packages_visibility(self): problem = Problem.objects.get() contest = Contest.objects.get() test1 = Test.objects.get(name='0') test2 = Test.objects.get(name='1a') tp = TestsPackage(problem=problem, name='some_name', description='some desc', publish_date=datetime(2012, 8, 5, 0, 11, tzinfo=utc)) tp.full_clean() tp.save() tp.tests.add(test1, test2) tp2 = TestsPackage(problem=problem, name='some_name2', description='some desc2', publish_date=datetime(2012, 8, 5, 1, 11, tzinfo=utc)) tp2.full_clean() tp2.save() tp2.tests.add(test2) self.client.login(username='******') url = reverse('tests', kwargs={'contest_id': contest.id}) with fake_time(datetime(2012, 8, 5, 0, 10, tzinfo=utc)): response = self.client.get(url) self.assertNotIn(b'>Tests<', response.content) self.assertNotIn(b'some_name.zip', response.content) self.assertNotIn(b'some_name2.zip', response.content) self.assertEqual(403, response.status_code) with fake_time(datetime(2012, 8, 5, 0, 12, tzinfo=utc)): response = self.client.get(url) self.assertIn(b'>Tests<', response.content) self.assertIn(b'some_name.zip', response.content) self.assertNotIn(b'some_name2.zip', response.content) self.assertEqual(200, response.status_code) with fake_time(datetime(2012, 8, 5, 1, 12, tzinfo=utc)): response = self.client.get(url) self.assertIn(b'>Tests<', response.content) self.assertIn(b'some_name.zip', response.content) self.assertIn(b'some_name2.zip', response.content) self.assertEqual(200, response.status_code) url = reverse('test', kwargs={ 'contest_id': contest.id, 'package_id': 1 }) with fake_time(datetime(2012, 8, 5, 0, 10, tzinfo=utc)): response = self.client.get(url) self.assertEqual(403, response.status_code) with fake_time(datetime(2012, 8, 5, 0, 12, tzinfo=utc)): response = self.client.get(url) self.assertEqual(200, response.status_code)
def test_xml_view(self): contest = Contest.objects.get() url = reverse('oireports', kwargs={'contest_id': contest.id}) post_vars = { 'report_round': CONTEST_REPORT_KEY, 'report_region': CONTEST_REPORT_KEY, 'testgroup[zad1]': ['0', '1', '2', '3'], 'form_type': 'xml_report', 'single_report_user': '' } # Let's check if report is not available for regular user. self.assertTrue(self.client.login(username='******')) with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.post(url, post_vars) self.assertEqual(response.status_code, 403) self.assertTrue(self.client.login(username='******')) with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.post(url, post_vars) content = self.streamingContent(response).decode('utf-8') self.assertIn("<user>Test User (test_user)", content) self.assertIn("<result>34</result>", content) self.assertIn("<taskid>zad1</taskid>", content) self.assertIn("<code>%23include", content) self.assertIn("<testcomment>program exited with", content) self.assertNotIn("test_user2", content)
def test_submission(self): self.assertTrue(self.client.login(username="******")) submission = Submission.objects.get(id=1) with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = self.client.get( reverse( "submission", kwargs={ "submission_id": submission.id, "contest_id": Contest.objects.get().id, }, ) ) self.assertContains(response, "Ni in code") self.assertContains(response, "ninininini") self.assertIn(">34<", self.remove_whitespaces(response)) # Not disqualified submission submission = Submission.objects.get(id=2) with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = self.client.get( reverse( "submission", kwargs={ "submission_id": submission.id, "contest_id": Contest.objects.get().id, }, ) ) self.assertNotContains(response, "Disqualification") self.assertNotContains(response, "Ni in code") self.assertNotContains(response, "ninininini") self.assertIn(">42<", self.remove_whitespaces(response)) self.assertContains(response, "Submission 2")
def test_user_info_page(self): self.assertTrue(self.client.login(username='******')) user = User.objects.get(username="******") contest = Contest.objects.get() response_callback = lambda: self.client.get( reverse('user_info', kwargs={'contest_id': contest.id, 'user_id': user.id}) ) with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Ni in code") self.assertContains(response, "ninininini") self.assertNotContains(response, "I cannot tell") self.assertNotContains(response, "Knights of Ni") _disqualify_contestwide() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Ni in code") self.assertContains(response, "ninininini") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni") Disqualification.objects.filter(submission__isnull=False).delete() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertNotContains(response, "Ni in code") self.assertNotContains(response, "ninininini") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni")
def test_pdf_report_view(self): contest = Contest.objects.get() url = reverse('oireports', kwargs={'contest_id': contest.id}) post_vars = { 'report_round': CONTEST_REPORT_KEY, 'report_region': CONTEST_REPORT_KEY, 'testgroup[zad1]': ['0', '1', '2', '3'], 'form_type': 'pdf_report', 'single_report_user': '' } # Let's check if report is not available for regular user. self.assertTrue(self.client.login(username='******')) with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.post(url, post_vars) self.assertEqual(response.status_code, 403) self.assertTrue(self.client.login(username='******')) with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.post(url, post_vars) pages = slate.PDF(StringIO(self.streamingContent(response))) self.assertIn("test_user", pages[0]) self.assertIn("Wynik:34", pages[0]) self.assertIn("ZAD1", pages[0]) self.assertIn("1bRuntimeerror0.00s/0.10sprogramexited", pages[0]) self.assertNotIn("test_user2", pages.text())
def test_statistics_view(self): contest = Contest.objects.get() url = reverse('statistics_main', kwargs={'contest_id': contest.id}) self.client.login(username='******') with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertContains(response, 'Results histogram') # Ok, so now we make test_admin a regular user. admin = User.objects.get(username='******') admin.is_superuser = False admin.save() self.client.login(username='******') with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) print response self.assertContains(response, 'Results histogram') self.assertContains(response, "'zad4'") self.assertContains(response, "'zad2'") self.assertContains(response, "'zad3'") self.assertContains(response, "'zad1'") self.assertContains(response, "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]") url = reverse('statistics_view', kwargs={'contest_id': contest.id, 'category': statistics_categories['PROBLEM'][1], 'object_name': 'zad2'}) self.assertContains(response, url)
def test_ranking_csv_view(self): contest = Contest.objects.get() url = reverse('ranking_csv', kwargs={'contest_id': contest.id, 'key': 'c'}) self.assertTrue(self.client.login(username='******')) with fake_time(datetime(2015, 8, 5, tzinfo=utc)): check_not_accessible(self, url) self.assertTrue(self.client.login(username='******')) with fake_time(datetime(2012, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertContains(response, 'User,') # Check that Admin is filtered out. self.assertNotContains(response, 'Admin') expected_order = ['Test,User', 'Test,User 2'] prev_pos = 0 content = response.content.decode('utf-8') for user in expected_order: pattern = '%s,' % (user,) self.assertContains(response, user) pos = content.find(pattern) self.assertGreater(pos, prev_pos, msg=('User %s has incorrect ' 'position' % (user,))) prev_pos = pos for task in ['zad1', 'zad2', 'zad3', 'zad3']: self.assertContains(response, task) response = self.client.get(reverse('ranking', kwargs={'contest_id': contest.id, 'key': '1'})) self.assertContains(response, 'zad1') for task in ['zad2', 'zad3', 'zad3']: self.assertNotContains(response, task)
def test_simple_submission(self): contest = Contest.objects.get() problem_instance = ProblemInstance.objects.get() round = Round.objects.get() round.start_date = datetime(2012, 7, 31, tzinfo=utc) round.end_date = datetime(2012, 8, 10, tzinfo=utc) round.save() with fake_time(datetime(2012, 7, 10, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(200, response.status_code) self.assertIn('Sorry, there are no problems', response.content) with fake_time(datetime(2012, 7, 31, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self._assertSubmitted(contest, response) with fake_time(datetime(2012, 8, 5, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self._assertSubmitted(contest, response) with fake_time(datetime(2012, 8, 10, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self._assertSubmitted(contest, response) with fake_time(datetime(2012, 8, 11, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(200, response.status_code) self.assertIn('Sorry, there are no problems', response.content)
def _assert_disqualification_box(self, response_callback): with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Disqualification") self.assertContains(response, "Ni in code") self.assertContains(response, "ninininini") self.assertNotContains(response, "Score") self.assertNotContains(response, '>34</td>') self.assertNotContains(response, '>42</td>') _disqualify_contestwide() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Disqualification") self.assertContains(response, "Ni in code") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni") self.assertNotContains(response, '>34</td>') self.assertNotContains(response, '>42</td>') Disqualification.objects.filter(submission__isnull=False).delete() with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = response_callback() self.assertContains(response, "Disqualification") self.assertNotContains(response, "Ni in code") self.assertContains(response, "I cannot tell") self.assertContains(response, "Knights of Ni") # Even disqualified users can see their score self.assertContains(response, '>34</td>')
def test_simple_mailsubmission(self): contest = Contest.objects.get() problem_instance = ProblemInstance.objects.get() problem_instance.submissions_limit = 0 problem_instance.save() round = Round.objects.get() round.start_date = datetime(2012, 7, 31, tzinfo=utc) round.end_date = datetime(2012, 8, 10, tzinfo=utc) round.save() msc = MailSubmissionConfig(contest=contest, enabled=True, start_date=datetime(2012, 8, 12, tzinfo=utc), end_date=datetime(2012, 8, 14, tzinfo=utc)) msc.save() with fake_time(datetime(2012, 8, 11, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) self.assertEqual(MailSubmission.objects.count(), 0) with fake_time(datetime(2012, 8, 13, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(200, response.status_code) self.assertEqual(MailSubmission.objects.count(), 1) with fake_time(datetime(2012, 8, 15, tzinfo=utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) self.assertEqual(MailSubmission.objects.count(), 1)
def test_submission(self): self.client.login(username='******') submission = Submission.objects.get(id=1) with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = self.client.get( reverse('submission', kwargs={ 'submission_id': submission.id, 'contest_id': Contest.objects.get().id })) self.assertContains(response, "Disqualification") self.assertContains(response, "Ni in code") self.assertContains(response, "ninininini") self.assertNotContains(response, '>34</td>') # Not disqualified submission submission = Submission.objects.get(id=2) with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = self.client.get( reverse('submission', kwargs={ 'submission_id': submission.id, 'contest_id': Contest.objects.get().id })) self.assertNotContains(response, "Disqualification") self.assertNotContains(response, "Ni in code") self.assertNotContains(response, "ninininini") self.assertNotContains(response, '>42</td>') self.assertContains(response, 'Submission 2')
def test_publish_solutions(self): contest = Contest.objects.get() publish_url = reverse('publish_solutions', kwargs={'contest_id': contest.id}) def submission_url(sub_id): return reverse('submission', kwargs={'contest_id': contest.id, 'submission_id': sub_id}) def show_source_url(sub_id): return reverse('show_submission_source', kwargs={'contest_id': contest.id, 'submission_id': sub_id}) def change_publication_url(way, sub_id): return reverse('publish_solution' if way else 'unpublish_solution', kwargs={'contest_id': contest.id, 'submission_id': sub_id}) def change_publication(way, sub_id): r = self.client.post(change_publication_url(way, sub_id)) self.assertEqual(302, r.status_code) def check_access_forbidden(sub_ids): for id in sub_ids: r = self.client.post(change_publication_url(id % 2, id)) self.assertEqual(403, r.status_code) def check_visibility(good_ids, way): r = self.client.get(publish_url) self.assertEqual(200, r.status_code) for id in range(1, 5): sb = Submission.objects.get(pk=id) if id in good_ids: self.assertContains(r, sb.get_date_display()) self.assertContains(r, self._href(show_source_url(id))) self.assertContains(r, change_publication_url(way, id)) self.assertContains(r, self._href(submission_url(id))) else: self.assertNotContains(r, sb.get_date_display()) with fake_time(self._no_public_rounds()): self.assertTrue(self.client.login(username='******')) r = self.client.get(publish_url) self.assertEqual(403, r.status_code) check_access_forbidden([4]) with fake_time(self._rounds_14()): check_visibility([4], True) change_publication(True, 4) check_visibility([4], False) check_access_forbidden([1, 2]) self.client.logout() self.assertTrue(self.client.login(username='******')) check_visibility([], True) check_access_forbidden([3, 4]) self.client.logout() self.assertTrue(self.client.login(username='******')) change_publication(False, 4) check_visibility([4], True) self.client.logout()
def test_ranking_view(self): contest = Contest.objects.get() url = reverse('default_ranking', kwargs={'contest_id': contest.id}) self.client.login(username='******') with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertContains(response, 'Export to CSV') # Check that Admin is filtered out. self.client.login(username='******') with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertNotIn('<td>Test Admin</td>', response.content) self.assertNotContains(response, 'Export to CSV') # Ok, so now we make test_admin a regular user. admin = User.objects.get(username='******') admin.is_superuser = False admin.save() self.client.login(username='******') with fake_time(datetime(2012, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertIn('rankings/ranking_view.html', [t.name for t in response.templates]) self.assertEqual(len(response.context['choices']), 3) self.assertEqual(response.content.count('<td>Test User'), 1) self.assertNotIn('<td>Test Admin</td>', response.content) with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) expected_order = ['Test User', 'Test User 2', 'Test Admin'] prev_pos = 0 for user in expected_order: pattern = '<td>%s</td>' % (user,) self.assertIn(user, response.content) pos = response.content.find(pattern) self.assertGreater(pos, prev_pos, msg=('User %s has incorrect ' 'position' % (user,))) prev_pos = pos response = self.client.get(reverse('ranking', kwargs={'contest_id': contest.id, 'key': '1'})) self.assertEqual(response.content.count('<td>Test User'), 1) # Test visibility of links to problem statements contest.controller_name = \ 'oioioi.rankings.tests.StatementHiderForContestController' contest.save() with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) for task in VISIBLE_TASKS: self.assertIn(task + '</a></th>', response.content) for task in HIDDEN_TASKS: self.assertIn(task + '</th>', response.content)
def test_cookie_expiry_date(self): url = reverse('balloons_delivery_panel', kwargs=self.c_kwargs) with fake_time(datetime(2012, 8, 5, 0, 5, tzinfo=utc)): self._generate_link_and_set_cookie() with fake_time(datetime(2012, 8, 12, 0, 4, tzinfo=utc)): response = self.client.get(url) self.assertEqual(response.status_code, 200) with fake_time(datetime(2012, 8, 12, 0, 6, tzinfo=utc)): response = self.client.get(url) self.assertEqual(response.status_code, 403)
def test_making_complaint(self): contest = Contest.objects.get() contest.controller_name = \ 'oioioi.oi.controllers.OIOnsiteContestController' contest.save() user = User.objects.get(username='******') p = Participant(contest=contest, user=user, status='ACTIVE') p.save() with fake_time(datetime(2012, 8, 11, tzinfo=utc)): self.client.login(username='******') response = self.client.post(reverse('add_complaint', kwargs={'contest_id': contest.id}), {'complaint': "I am innocent! It is your fault!"}, follow=True) self.assertEqual(response.status_code, 403) cconfig = ComplaintsConfig(contest=contest, enabled=True, start_date=datetime(2012, 8, 10, tzinfo=utc), end_date=datetime(2012, 8, 12, tzinfo=utc)) cconfig.save() with fake_time(datetime(2012, 8, 9, tzinfo=utc)): response = self.client.get(reverse('add_complaint', kwargs={'contest_id': contest.id})) self.assertEqual(response.status_code, 403) with fake_time(datetime(2012, 8, 13, tzinfo=utc)): response = self.client.get(reverse('add_complaint', kwargs={'contest_id': contest.id})) self.assertEqual(response.status_code, 403) with fake_time(datetime(2012, 8, 11, tzinfo=utc)): response = self.client.post(reverse('add_complaint', kwargs={'contest_id': contest.id}), {'complaint': "I am innocent! It is your fault!"}, follow=True) self.assertEqual(response.status_code, 200) self.assertContains(response, "has been sent") jurym = mail.outbox[0].message() userm = mail.outbox[1].message() del mail.outbox # Header class doesn't offer 'in' operator self.assertEqual("[oioioi-complaints] Complaint: Test User (test_user)", jurym['Subject']) self.assertEqual("[oioioi-complaints] Complaint: Test User (test_user)", userm['Subject']) self.assertEquals("*****@*****.**", jurym['To']) self.assertEquals("*****@*****.**", userm['To']) self.assertEquals(jurym['Message-ID'], userm['References']) self.assertEquals(userm['Message-ID'], jurym['References']) self.assertIn("your fault!", jurym.as_string()) self.assertIn("your fault!", userm.as_string())
def test_packages_visibility(self): problem = Problem.objects.get() contest = Contest.objects.get() test1 = Test.objects.get(name='0') test2 = Test.objects.get(name='1a') tp = TestsPackage(problem=problem, name='some_name', description='some desc', publish_date=datetime(2012, 8, 5, 0, 11, tzinfo=utc)) tp.full_clean() tp.save() tp.tests.add(test1, test2) tp2 = TestsPackage(problem=problem, name='some_name2', description='some desc2', publish_date=datetime(2012, 8, 5, 1, 11, tzinfo=utc)) tp2.full_clean() tp2.save() tp2.tests.add(test2) self.client.login(username='******') url = reverse('tests', kwargs={'contest_id': contest.id}) with fake_time(datetime(2012, 8, 5, 0, 10, tzinfo=utc)): response = self.client.get(url) self.assertNotIn('>Tests<', response.content) self.assertNotIn('some_name.zip', response.content) self.assertNotIn('some_name2.zip', response.content) self.assertEqual(403, response.status_code) with fake_time(datetime(2012, 8, 5, 0, 12, tzinfo=utc)): response = self.client.get(url) self.assertIn('>Tests<', response.content) self.assertIn('some_name.zip', response.content) self.assertNotIn('some_name2.zip', response.content) self.assertEqual(200, response.status_code) with fake_time(datetime(2012, 8, 5, 1, 12, tzinfo=utc)): response = self.client.get(url) self.assertIn('>Tests<', response.content) self.assertIn('some_name.zip', response.content) self.assertIn('some_name2.zip', response.content) self.assertEqual(200, response.status_code) url = reverse('test', kwargs={'contest_id': contest.id, 'package_id': 1}) with fake_time(datetime(2012, 8, 5, 0, 10, tzinfo=utc)): response = self.client.get(url) self.assertEqual(403, response.status_code) with fake_time(datetime(2012, 8, 5, 0, 12, tzinfo=utc)): response = self.client.get(url) self.assertEqual(200, response.status_code)
def test_ranking_view(self): contest = Contest.objects.get() url = reverse('default_ranking', kwargs={'contest_id': contest.id}) self.client.login(username='******') with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertContains(response, 'Export to CSV') # Check that Admin is filtered out. self.client.login(username='******') with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertNotIn('<td>Test Admin</td>', response.content) self.assertNotContains(response, 'Export to CSV') # Ok, so now we make test_admin a regular user. admin = User.objects.get(username='******') admin.is_superuser = False admin.save() self.client.login(username='******') with fake_time(datetime(2012, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertIn('rankings/ranking_view.html', [t.name for t in response.templates]) self.assertEqual(len(response.context['choices']), 3) self.assertEqual(response.content.count('<td>Test User'), 1) self.assertNotIn('<td>Test Admin</td>', response.content) with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) expected_order = ['Test User', 'Test User 2', 'Test Admin'] prev_pos = 0 for user in expected_order: pattern = '<td>%s</td>' % (user, ) self.assertIn(user, response.content) pos = response.content.find(pattern) self.assertGreater(pos, prev_pos, msg=('User %s has incorrect ' 'position' % (user, ))) prev_pos = pos response = self.client.get( reverse('ranking', kwargs={ 'contest_id': contest.id, 'key': '1' })) self.assertEqual(response.content.count('<td>Test User'), 1)
def test_after_round(self): contest = Contest.objects.get() with fake_time(datetime(2012, 8, 8, tzinfo=utc)): self.reveal_submit(4) with fake_time(datetime(2012, 8, 11, tzinfo=utc)): kwargs = {'contest_id': contest.id, 'submission_id': 4} response = self.client.get(reverse('submission', kwargs=kwargs)) self.assertEqual(response.status_code, 200) self.assertIn('already used <strong>1</strong> out of 2 reveals.', response.content) self.assertIn('<td>100</td>', response.content) self.reveal_submit(5, success=False)
def test_ranking(self): contest = Contest.objects.get() url = reverse("default_ranking", kwargs={"contest_id": contest.id}) self.assertTrue(self.client.login(username="******")) with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = self.client.get(url) self.assertContains(response, "Test User") self.assertContains(response, "disqualified") self.assertTrue(self.client.login(username="******")) with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = self.client.get(url) self.assertNotContains(response, "Test User")
def test_submissions_visibility(self): contest = Contest.objects.get() url = reverse('my_submissions', kwargs={'contest_id': contest.id}) self.client.login(username='******') with fake_time(datetime(2012, 8, 5, tzinfo=utc)): response = self.client.get(url) for problem_name in ['zad1', 'zad2', 'zad3', 'zad4']: self.assertIn(problem_name, response.content) self.assertIn('contests/my_submissions.html', [t.name for t in response.templates]) self.assertEqual(response.content.count('<td>34</td>'), 2) with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertEqual(response.content.count('<td>34</td>'), 4)
def test_ranking(self): contest = Contest.objects.get() url = reverse('default_ranking', kwargs={'contest_id': contest.id}) self.client.login(username='******') with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = self.client.get(url) self.assertContains(response, "Test User") self.assertContains(response, "disqualified") self.client.login(username='******') with fake_time(datetime(2015, 1, 1, tzinfo=utc)): response = self.client.get(url) self.assertNotContains(response, "Test User")
def test_ranking_view(self): contest = Contest.objects.get() url = reverse('default_ranking', kwargs={'contest_id': contest.id}) self.client.login(username='******') # trial round begins at 11:00, ends at 16:00, results are available # at 19:00 with fake_time(datetime(2013, 12, 13, 10, 59, tzinfo=utc)): response = self.client.get(url) for task in ['trial', 'A', 'sum', 'test']: self.assertTaskNotIn(task, response.content) with fake_time(datetime(2013, 12, 13, 11, 30, tzinfo=utc)): response = self.client.get(url) self.assertTaskIn('trial', response.content) for task in ['A', 'sum', 'test']: self.assertTaskNotIn(task, response.content) with fake_time(datetime(2013, 12, 13, 17, 0, tzinfo=utc)): response = self.client.get(url) self.assertTaskIn('trial', response.content) for task in ['A', 'sum', 'test']: self.assertTaskNotIn(task, response.content) # round 1 starts at 20:40, ends at 01:40, results are available at # 09:00 with fake_time(datetime(2013, 12, 14, 20, 39, tzinfo=utc)): response = self.client.get(url) self.assertTaskIn('trial', response.content) for task in ['A', 'sum', 'test']: self.assertTaskNotIn(task, response.content) with fake_time(datetime(2013, 12, 14, 20, 40, tzinfo=utc)): response = self.client.get(url) self.assertTaskNotIn('trial', response.content) for task in ['A', 'sum', 'test']: self.assertTaskIn(task, response.content) self.assertNotIn('The ranking is frozen.', response.content) with fake_time(datetime(2013, 12, 15, 1, 0, tzinfo=utc)): response = self.client.get(url) self.assertTaskNotIn('trial', response.content) for task in ['A', 'sum', 'test']: self.assertTaskIn(task, response.content) self.assertIn('The ranking is frozen.', response.content) with fake_time(datetime(2013, 12, 15, 7, 0, tzinfo=utc)): response = self.client.get(url) self.assertTaskNotIn('trial', response.content) for task in ['A', 'sum', 'test']: self.assertTaskIn(task, response.content) self.assertIn('The ranking is frozen.', response.content) with fake_time(datetime(2013, 12, 15, 9, 0, tzinfo=utc)): response = self.client.get(url) self.assertTaskNotIn('trial', response.content) for task in ['A', 'sum', 'test']: self.assertTaskIn(task, response.content) self.assertNotIn('The ranking is frozen.', response.content)
def test_exclusive_contests_error(self): self._assertContestVisible('c1') self._assertContestVisible('c2') add_ex_conf( self.c1, datetime(2012, 1, 1, 10, tzinfo=utc), datetime(2012, 1, 1, 14, tzinfo=utc), ) add_ex_conf( self.c2, datetime(2012, 1, 1, 12, tzinfo=utc), datetime(2012, 1, 1, 16, tzinfo=utc), ) with fake_time(datetime(2012, 1, 1, 13, tzinfo=utc)): response = self.client.get('/c/c1/id/') self.assertContains( response, 'participate in more than one contest that exc' ) self.assertEqual(len(mail.outbox), 1) message = mail.outbox[0] self.assertEqual(list(message.to), ['*****@*****.**']) self.assertIn('in more than one exclusive contest', message.body) self.assertIn('c1', message.body) self.assertIn('c2', message.body)
def test_round_time_extension(self): user = User.objects.get(username='******') r1 = Round.objects.get() RoundTimeExtension(user=user, round=r1, extra_time=10).save() with fake_time(datetime(2012, 8, 9, 23, 10, tzinfo=utc)): self.reveal_submit(1)
def test_no_zero_scores_in_ranking(self): self.client.login(username='******') with fake_time(datetime(2013, 1, 1, 0, 0, tzinfo=utc)): response = self.client.get(self._ranking_url(3)) self.assertContains(response, '<td>Test User</td>') # Test User 2 scored 0 points for the only task in the round. self.assertNotContains(response, '<td>Test User 2</td>')
def test_anonymous_participants(self): contest = Contest.objects.get() contest.controller_name = \ "oioioi.participants.tests.AnonymousContestController" contest.save() u1 = User.objects.get(pk=1001) self._register(u1, anonymous=False, possible=True) u2 = User.objects.get(pk=1002) self._register(u2, anonymous=True, possible=True) contest = Contest.objects.get() url = reverse('default_ranking', kwargs={'contest_id': contest.id}) self.client.login(username='******') with fake_time(datetime(2015, 8, 5, tzinfo=utc)): response = self.client.get(url) self.assertNotIn('>test_user</a>', response.content) self.assertIn('>Test User</a>', response.content) self.assertIn('>test_user2</a>', response.content) self.assertNotIn('>Test User 2</a>', response.content) # Edit contest registration self._register(u2, anonymous=False, possible=True) # To see the changes in the ranking we have to clear the cache cache.clear() self.client.login(username='******') response = self.client.get(url) self.assertNotIn('>test_user2</a>', response.content) self.assertIn('>Test User 2</a>', response.content)
def test_contest_admin_with_participant(self): self.c2.controller_name = \ 'oioioi.participants.tests.ParticipantsContestController' self.c2.save() ContestPermission(user=self.user, contest=self.c1, permission='contests.contest_admin').save() Participant(user=self.user, contest=self.c2).save() ex_conf1 = ExclusivenessConfig() ex_conf1.contest = self.c1 ex_conf1.start_date = datetime(2012, 1, 1, 8, tzinfo=utc) ex_conf1.end_date = datetime(2012, 1, 1, 12, tzinfo=utc) ex_conf1.save() ex_conf2 = ExclusivenessConfig() ex_conf2.contest = self.c2 ex_conf2.start_date = datetime(2012, 1, 1, 8, tzinfo=utc) ex_conf2.end_date = datetime(2012, 1, 1, 12, tzinfo=utc) ex_conf2.save() self.client.login(username='******') with fake_time(datetime(2012, 1, 1, 10, tzinfo=utc)): self._assertContestVisible('c2') self._assertContestRedirects('c1', '/c/c2')
def test_submit_permissions(self): contest = Contest.objects.get() contest.controller_name = \ 'oioioi.participants.tests.ParticipantsContestController' contest.save() round = Round.objects.get(pk=1) problem_instance = ProblemInstance.objects.get(pk=1) self.assertTrue(problem_instance.round == round) round.start_date = datetime(2012, 7, 31, tzinfo=utc) round.end_date = datetime(2012, 8, 5, tzinfo=utc) round.save() user = User.objects.get(username='******') p = Participant(contest=contest, user=user, status='BANNED') p.save() with fake_time(datetime(2012, 8, 4, 0, 5, tzinfo=utc)): self.client.login(username='******') response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) self.client.login(username='******') response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) p.status = 'ACTIVE' p.save() self.client.login(username='******') response = self.submit_file(contest, problem_instance) self._assertSubmitted(contest, response)
def test_contest_admin_with_participant(self): self.c2.controller_name = ( 'oioioi.participants.tests.ParticipantsContestController') self.c2.save() ContestPermission(user=self.user, contest=self.c1, permission='contests.contest_admin').save() Participant(user=self.user, contest=self.c2).save() ex_conf1 = ExclusivenessConfig() ex_conf1.contest = self.c1 ex_conf1.start_date = datetime(2012, 1, 1, 8, tzinfo=utc) ex_conf1.end_date = datetime(2012, 1, 1, 12, tzinfo=utc) ex_conf1.save() ex_conf2 = ExclusivenessConfig() ex_conf2.contest = self.c2 ex_conf2.start_date = datetime(2012, 1, 1, 8, tzinfo=utc) ex_conf2.end_date = datetime(2012, 1, 1, 12, tzinfo=utc) ex_conf2.save() self.assertTrue(self.client.login(username='******')) with fake_time(datetime(2012, 1, 1, 10, tzinfo=utc)): self._assertContestVisible('c2') self._assertContestRedirects('c1', '/c/c2')
def _assertBackend(self, user): with fake_time(datetime(2012, 1, 1, 11, tzinfo=utc)): self.client.get('/c/c1/id') session = self.client.session self.assertEqual(session['_auth_user_id'], unicode(user.id)) self.assertEqual(session['_auth_user_backend'], 'oioioi.ipdnsauth.backends.IpDnsBackend')
def test_no_thread(self): contest = get_contest_with_forum() forum = contest.forum category = Category(forum=forum, name='test_category') category.save() self.client.login(username='******') url = reverse('forum_category', kwargs={ 'contest_id': contest.id, 'category_id': category.id }) with fake_time(self.now): response = self.client.get(url, follow=True) # not locked, adding new thread possible self.assertIn('Add new thread', response.content) forum.lock_date = self.past forum.save() self.assertEqual(True, forum.is_locked(self.now)) url = reverse('forum_category', kwargs={ 'contest_id': contest.id, 'category_id': category.id }) response = self.client.get(url, follow=True) # locked, adding new thread not possible self.assertEqual(200, response.status_code) self.assertNotIn('Add new thread', response.content)
def test_exclusive_contests_error(self): self._assertContestVisible('c1') self._assertContestVisible('c2') ex_conf = ExclusivenessConfig() ex_conf.contest = self.c1 ex_conf.start_date = datetime(2012, 1, 1, 10, tzinfo=utc) ex_conf.end_date = datetime(2012, 1, 1, 14, tzinfo=utc) ex_conf.save() ex_conf = ExclusivenessConfig() ex_conf.contest = self.c2 ex_conf.start_date = datetime(2012, 1, 1, 12, tzinfo=utc) ex_conf.end_date = datetime(2012, 1, 1, 16, tzinfo=utc) ex_conf.save() with fake_time(datetime(2012, 1, 1, 13, tzinfo=utc)): response = self.client.get('/c/c1/id/') self.assertContains(response, 'participate in more than one contest that exc') self.assertEqual(len(mail.outbox), 1) message = mail.outbox[0] self.assertEqual(list(message.to), ['*****@*****.**']) self.assertIn('in more than one exclusive contest', message.body) self.assertIn('c1', message.body) self.assertIn('c2', message.body)
def test_reveal_limit(self): with fake_time(datetime(2012, 8, 8, tzinfo=utc)): self.reveal_submit(4) self.reveal_submit(5) response = self.reveal_submit(1, success=False) self.assertContains(response, 'used <strong>2</strong> out of 2 reveals')
def test_lock_forum_with_no_unlock_date(self): contest = get_contest_with_forum() forum = contest.forum self.client.login(username='******') url = reverse('default_contest_view', kwargs={'contest_id': contest.id}) with fake_time(self.now): # locked, no unlock date set forum.lock_date = self.past forum.visible = False forum.save() # locked & not visible, so user does not see forum response = self.client.get(url, follow=True) self.assertNotIn('Forum', response.content) url = reverse('forum', kwargs={'contest_id': contest.id}) response = self.client.get(url, follow=True) self.assertEqual(403, response.status_code) self.assertEqual(True, forum.is_locked(self.now)) forum.visible = True forum.save() # locked & visible, so user sees forum response = self.client.get(url, follow=True) self.assertIn('Forum', response.content) self.assertEqual(True, forum.is_locked(self.now))
def test_lock_forum_with_no_unlock_date(self): contest = get_contest_with_forum() forum = contest.forum self.assertTrue(self.client.login(username='******')) url = reverse('default_contest_view', kwargs={'contest_id': contest.id}) with fake_time(self.now): # locked, no unlock date set forum.lock_date = self.past forum.visible = False forum.save() # locked & not visible, so user does not see forum response = self.client.get(url, follow=True) self.assertNotContains(response, 'Forum') url = reverse('forum', kwargs={'contest_id': contest.id}) response = self.client.get(url, follow=True) self.assertEqual(403, response.status_code) self.assertEqual(True, forum.is_locked(self.now)) forum.visible = True forum.save() # locked & visible, so user sees forum response = self.client.get(url, follow=True) self.assertContains(response, 'Forum') self.assertEqual(True, forum.is_locked(self.now))
def test_submit_permissions(self): contest = Contest.objects.get() contest.controller_name = ( 'oioioi.participants.tests.ParticipantsContestController') contest.save() round = Round.objects.get(pk=1) problem_instance = ProblemInstance.objects.get(pk=1) self.assertTrue(problem_instance.round == round) round.start_date = datetime(2012, 7, 31, tzinfo=utc) round.end_date = datetime(2012, 8, 5, tzinfo=utc) round.save() user = User.objects.get(username='******') p = Participant(contest=contest, user=user, status='BANNED') p.save() with fake_time(datetime(2012, 8, 4, 0, 5, tzinfo=utc)): self.assertTrue(self.client.login(username='******')) response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) self.assertTrue(self.client.login(username='******')) response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) p.status = 'ACTIVE' p.save() self.assertTrue(self.client.login(username='******')) response = self.submit_file(contest, problem_instance) self._assertSubmitted(contest, response)
def test_generate_and_download_user_permission(self): self.client.login(username='******') self.client.get('/c/c/') # 'c' becomes the current contest submission = ProgramSubmission.objects.get(pk=1) gen_url = reverse('generate_user_output', kwargs={'testreport_id': 5}) down_one_url = reverse('download_user_output', kwargs={'testreport_id': 5}) down_all_url = reverse('download_user_output', kwargs={'submission_report_id': 2}) # post required for generate response = self.client.get(gen_url, follow=True) self.assertEqual(response.status_code, 405) response = self.client.post(gen_url, follow=True) self.assertEqual(response.status_code, 403) response = self.client.get(down_one_url, follow=True) self.assertEqual(response.status_code, 403) response = self.client.get(down_all_url, follow=True) self.assertEqual(response.status_code, 403) # test report visibility for user with permission ReportActionsConfig(problem=submission.problem_instance.problem, can_user_generate_outs=True).save() response = self.client.post(gen_url, follow=True) self.assertEqual(response.status_code, 200) response = self.client.get(down_one_url, follow=True) self.assertEqual(response.status_code, 200) response = self.client.get(down_all_url, follow=True) self.assertEqual(response.status_code, 404) # test if results have not been published yet (2012-07-31) with fake_time(datetime(2012, 7, 29, 11, 11, tzinfo=utc)): response = self.client.post(gen_url, follow=True) self.assertEqual(response.status_code, 403)