Source code for oioioi.mailsubmit.tests

from datetime import datetime, timezone  # pylint: disable=E0611

from django.contrib.auth.models import User
from django.core.files.base import ContentFile
from django.urls import reverse

from oioioi.base.tests import TestCase, fake_time
from oioioi.contests.models import Contest, ProblemInstance, Round, Submission
from oioioi.mailsubmit.models import MailSubmission, MailSubmissionConfig
from oioioi.mailsubmit.utils import mail_submission_hashes
from oioioi.participants.models import Participant
from oioioi.problems.models import Problem


[docs]class MailSubmitFileMixin(object):
[docs] def submit_file( self, contest, problem_instance, file_size=1024, file_name='submission.cpp', kind='NORMAL', user=None, ): url = reverse('mailsubmit', kwargs={'contest_id': contest.id}) file = ContentFile('a' * file_size, name=file_name) post_data = { 'problem_instance_id': problem_instance.id, 'file': file, } if user: post_data.update( { 'kind': kind, 'user': user, } ) return self.client.post(url, post_data)
[docs]class TestMailSubmission(TestCase, MailSubmitFileMixin):
[docs] fixtures = [ 'test_users', 'test_contest', 'test_full_package', 'test_problem_instance', ]
[docs] def setUp(self): self.assertTrue(self.client.login(username='test_user'))
[docs] 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=timezone.utc) round.end_date = datetime(2012, 8, 10, tzinfo=timezone.utc) round.save() msc = MailSubmissionConfig( contest=contest, enabled=True, start_date=datetime(2012, 8, 12, tzinfo=timezone.utc), end_date=datetime(2012, 8, 14, tzinfo=timezone.utc), ) msc.save() with fake_time(datetime(2012, 8, 11, tzinfo=timezone.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=timezone.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=timezone.utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) self.assertEqual(MailSubmission.objects.count(), 1)
[docs] def test_accepting_mailsubmissions(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=timezone.utc) round.end_date = datetime(2012, 8, 10, tzinfo=timezone.utc) round.save() msc = MailSubmissionConfig( contest=contest, enabled=True, start_date=datetime(2012, 8, 12, tzinfo=timezone.utc), end_date=datetime(2012, 8, 14, tzinfo=timezone.utc), ) msc.save() with fake_time(datetime(2012, 8, 13, tzinfo=timezone.utc)): response = self.submit_file(contest, problem_instance) self.assertEqual(200, response.status_code) self.assertEqual(MailSubmission.objects.count(), 1) ms = MailSubmission.objects.get() _ms_source_hash, ms_submission_hash = mail_submission_hashes(ms) self.assertEqual(Submission.objects.count(), 0) url = reverse( 'accept_mailsubmission_default', kwargs={'contest_id': contest.id} ) valid_post_data = { 'mailsubmission_id': ms.id, 'submission_hash': ms_submission_hash, } invalid_post_data = {'mailsubmission_id': ms.id, 'submission_hash': 'ABCDE'} response = self.client.post(url, valid_post_data) self.assertEqual(403, response.status_code) self.assertEqual(Submission.objects.count(), 0) self.assertTrue(self.client.login(username='test_admin')) response = self.client.post(url, invalid_post_data) self.assertEqual(200, response.status_code) self.assertContains(response, 'Invalid confirmation code') self.assertEqual(Submission.objects.count(), 0) response = self.client.post(url, valid_post_data, follow=True) self.assertEqual(200, response.status_code) self.assertEqual(Submission.objects.count(), 1) response = self.client.post(url, valid_post_data, follow=True) self.assertEqual(200, response.status_code) self.assertContains(response, 'already accepted') ms = MailSubmission.objects.get() self.assertEqual(ms.accepted_by, User.objects.get(username='test_admin'))
[docs] def test_mailsubmit_permissions(self): contest = Contest.objects.get() contest.controller_name = ( 'oioioi.participants.tests.ParticipantsContestController' ) contest.save() 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=timezone.utc) round.end_date = datetime(2012, 8, 10, tzinfo=timezone.utc) round.save() msc = MailSubmissionConfig( contest=contest, enabled=True, start_date=datetime(2012, 8, 12, tzinfo=timezone.utc), end_date=datetime(2012, 8, 14, tzinfo=timezone.utc), ) msc.save() user = User.objects.get(username='test_user') p = Participant(contest=contest, user=user, status='BANNED') p.save() with fake_time(datetime(2012, 8, 13, 0, 5, tzinfo=timezone.utc)): self.assertTrue(self.client.login(username='test_user2')) response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) self.assertTrue(self.client.login(username='test_user')) response = self.submit_file(contest, problem_instance) self.assertEqual(403, response.status_code) p.status = 'ACTIVE' p.save() self.assertEqual(MailSubmission.objects.count(), 0) self.assertTrue(self.client.login(username='test_user')) response = self.submit_file(contest, problem_instance) self.assertEqual(200, response.status_code) self.assertEqual(MailSubmission.objects.count(), 1)
[docs] def test_mailsubmissions_list(self): c1 = Contest( id='contest1', name='Contest1', controller_name='oioioi.participants.' 'tests.ParticipantsContestController', ) c1.save() c2 = Contest( id='contest2', name='Contest2', controller_name='oioioi.participants.' 'tests.ParticipantsContestController', ) c2.save() p = Problem.objects.get() pi1 = ProblemInstance(contest=c1, problem=p, short_name='problem_instance1') pi1.save() pi2 = ProblemInstance(contest=c2, problem=p, short_name='problem_instance2') pi2.save() u = User.objects.get(username='test_user') f = ContentFile(b'aaa', name='bbbb.cpp') ms1 = MailSubmission(problem_instance=pi1, user=u) ms1.source_file.save(f.name, f) ms1.save() ms2 = MailSubmission(problem_instance=pi2, user=u) ms2.source_file.save(f.name, f) ms2.save() self.assertTrue(self.client.login(username='test_admin')) url = reverse( 'oioioiadmin:mailsubmit_mailsubmission_changelist', kwargs={'contest_id': 'contest1'}, ) response = self.client.get(url) self.assertContains(response, 'problem_instance1') self.assertNotContains(response, 'problem_instance2') url = reverse( 'oioioiadmin:mailsubmit_mailsubmission_changelist', kwargs={'contest_id': 'contest2'}, ) response = self.client.get(url) self.assertContains(response, 'problem_instance2') self.assertNotContains(response, 'problem_instance1')