Source code for oioioi.balloons.tests

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

from django.contrib.admin.utils import quote
from django.contrib.auth.models import User
from django.urls import reverse

from oioioi.balloons.models import BalloonDelivery, BalloonsDeliveryAccessData
from oioioi.base.tests import TestCase, fake_time
from oioioi.contests.models import Contest, ProblemInstance, Submission
from oioioi.participants.models import Participant
from oioioi.sinolpack.tests import get_test_filename


[docs]class TestBalloons(TestCase):
[docs] fixtures = [ 'test_users', 'test_contest', 'test_full_package', 'test_problem_instance', ]
[docs] def setUp(self): self.contest = Contest.objects.get() self.c_kwargs = {'contest_id': self.contest.id} self.pi = ProblemInstance.objects.get()
[docs] def test_balloons_access(self): url = reverse('balloons_delivery_panel', kwargs=self.c_kwargs) response = self.client.get(url) self.assertEqual(response.status_code, 403) self.assertTrue(self.client.login(username='test_user')) response = self.client.get(url) self.assertEqual(response.status_code, 403) self.assertTrue(self.client.login(username='test_admin')) response = self.client.get(url) self.assertEqual(response.status_code, 403) self._generate_link_and_set_cookie() response = self.client.get(url) self.assertEqual(response.status_code, 200)
[docs] def _submit_solution(self, user, source_file): url = reverse('submit', kwargs=self.c_kwargs) data = { 'problem_instance_id': self.pi.id, 'file': open(get_test_filename(source_file), 'rb'), 'user': user.username, 'kind': 'NORMAL', } return self.client.post(url, data)
[docs] def _check_delivery(self, delivery, user, first=False): self.assertEqual(delivery.user, user) self.assertEqual(delivery.problem_instance, ProblemInstance.objects.get()) self.assertFalse(delivery.delivered) self.assertEqual(delivery.first_accepted_solution, first)
[docs] def test_balloon_request_creation(self): self.assertTrue(self.client.login(username='test_user')) user = User.objects.get(username='test_user') self.contest.controller_name = 'oioioi.acm.controllers.ACMContestController' self.contest.save() Participant.objects.create(user=user, contest=self.contest) response = self._submit_solution(user, 'sum-various-results.cpp') self.assertEqual(response.status_code, 302) self.assertEqual(Submission.objects.count(), 1) self.assertEqual(BalloonDelivery.objects.count(), 0) response = self._submit_solution(user, 'sum-correct.cpp') self.assertEqual(response.status_code, 302) self.assertEqual(Submission.objects.count(), 2) self.assertEqual(BalloonDelivery.objects.count(), 1) balloon_delivery = BalloonDelivery.objects.get(id=1) self._check_delivery(balloon_delivery, user, True) response = self._submit_solution(user, 'sum-correct.cpp') self.assertEqual(response.status_code, 302) self.assertEqual(Submission.objects.count(), 3) self.assertEqual(BalloonDelivery.objects.count(), 1) self.assertTrue(self.client.login(username='test_user2')) user = User.objects.get(username='test_user2') Participant.objects.create(user=user, contest=self.contest) response = self._submit_solution(user, 'sum-correct.cpp') self.assertEqual(response.status_code, 302) self.assertEqual(Submission.objects.count(), 4) self.assertEqual(BalloonDelivery.objects.count(), 2) balloon_delivery = BalloonDelivery.objects.get(id=2) self._check_delivery(balloon_delivery, user)
[docs] def _check_balloon_requests(self, response, expected_number, all_number): response_data = response.json() self.assertEqual(len(response_data['new_requests']), expected_number) self.assertEqual(response_data['new_last_id'], all_number) for attr in ['id', 'team', 'problem_name', 'color', 'first_accepted']: for balloon_request in response_data['new_requests']: self.assertTrue(attr in balloon_request)
[docs] def test_getting_new_balloon_requests(self): users = User.objects.all() requests = [ BalloonDelivery(user=user, problem_instance=self.pi) for user in users ] BalloonDelivery.objects.bulk_create(requests) url = reverse('balloons_delivery_new', kwargs=self.c_kwargs) self._generate_link_and_set_cookie() response = self.client.get(url, {'last_id': -1}) self._check_balloon_requests(response, len(users), len(users)) for i in range(1, len(users) + 1): response = self.client.get(url, {'last_id': i}) self._check_balloon_requests(response, len(users) - i, len(users))
[docs] def test_setting_delivered_status(self): user = User.objects.get(username='test_user') BalloonDelivery.objects.create(user=user, problem_instance=self.pi) url = reverse('balloons_set_delivered', kwargs=self.c_kwargs) self._generate_link_and_set_cookie() response = self.client.post(url, {'id': 1, 'new_delivered': True}) self.assertEqual(response.status_code, 200) self.assertTrue(BalloonDelivery.objects.get(id=1).delivered) response = self.client.post(url, {'id': 1, 'new_delivered': False}) self.assertEqual(response.status_code, 200) self.assertFalse(BalloonDelivery.objects.get(id=1).delivered)