from datetime import datetime
from django.conf import settings
from django.contrib.auth.models import User
from django.test import RequestFactory
from django.test.utils import override_settings
from django.urls import reverse
from oioioi.base.tests import TestCase
from oioioi.contests.models import Contest
from oioioi.contests.utils import (
is_contest_admin,
is_contest_basicadmin,
is_contest_observer,
)
from oioioi.programs.models import ModelProgramSubmission, Test
[docs]class TestUserContestAuthBackend(TestCase):
[docs] fixtures = ['test_users', 'test_usercontest']
[docs] def test_permissions_on(self):
user = User.objects.get(pk=1001)
contest = Contest.objects.get(pk="uc")
self.assertFalse(user.has_perm('contests.contest_admin', contest))
self.assertTrue(user.has_perm('contests.contest_basicadmin', contest))
self.assertFalse(user.has_perm('contests.contest_observer', contest))
@override_settings(
AUTHENTICATION_BACKENDS=[
backend
for backend in settings.AUTHENTICATION_BACKENDS
if backend != 'oioioi.usercontests.auth.UserContestAuthBackend'
]
)
[docs] def test_permissions_off(self):
user = User.objects.get(pk=1001)
contest = Contest.objects.get(pk="uc")
self.assertFalse(user.has_perm('contests.contest_admin', contest))
self.assertFalse(user.has_perm('contests.contest_basicadmin', contest))
self.assertFalse(user.has_perm('contests.contest_observer', contest))
@override_settings(ARCHIVE_USERCONTESTS=True)
[docs] def test_permissions_archived(self):
user = User.objects.get(pk=1001)
contest = Contest.objects.get(pk="uc")
self.assertFalse(user.has_perm('contests.contest_admin', contest))
self.assertFalse(user.has_perm('contests.contest_basicadmin', contest))
self.assertTrue(user.has_perm('contests.contest_observer', contest))
[docs] def test_utils_on(self):
user = User.objects.get(pk=1001)
contest = Contest.objects.get(pk="uc")
request = RequestFactory().request()
request.contest = contest
request.user = user
self.assertFalse(is_contest_admin(request))
self.assertTrue(is_contest_basicadmin(request))
self.assertFalse(is_contest_observer(request))
@override_settings(
AUTHENTICATION_BACKENDS=[
backend
for backend in settings.AUTHENTICATION_BACKENDS
if backend != 'oioioi.usercontests.auth.UserContestAuthBackend'
]
)
[docs] def test_utils_off(self):
user = User.objects.get(pk=1001)
contest = Contest.objects.get(pk="uc")
request = RequestFactory().request()
request.contest = contest
request.user = user
self.assertFalse(is_contest_admin(request))
self.assertFalse(is_contest_basicadmin(request))
self.assertFalse(is_contest_observer(request))
@override_settings(ARCHIVE_USERCONTESTS=True)
[docs] def test_utils_archived(self):
user = User.objects.get(pk=1001)
contest = Contest.objects.get(pk="uc")
request = RequestFactory().request()
request.contest = contest
request.user = user
self.assertFalse(is_contest_admin(request))
self.assertFalse(is_contest_basicadmin(request))
self.assertTrue(is_contest_observer(request))
[docs]class TestUserContestController(TestCase):
[docs] fixtures = ['test_users', 'test_usercontest']
[docs] def test_can_submit(self):
self.assertTrue(self.client.login(username='test_user2'))
url = reverse('submit', kwargs={'contest_id': 'uc'})
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, 'Sorry, there are no problems')
@override_settings(ARCHIVE_USERCONTESTS=True)
[docs] def test_cannot_submit(self):
self.assertTrue(self.client.login(username='test_user2'))
url = reverse('submit', kwargs={'contest_id': 'uc'})
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Sorry, there are no problems')
self.assertTrue(self.client.login(username='test_user'))
url = reverse('submit', kwargs={'contest_id': 'uc'})
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Sorry, there are no problems')
@override_settings(ARCHIVE_USERCONTESTS=True)
[docs]class TestUserContestArchived(TestCase):
[docs] fixtures = ['test_users', 'test_usercontest', 'test_model_submissions']
[docs] def test_can_see_problems(self):
self.assertTrue(self.client.login(username='test_user'))
url = reverse('problemset_my_problems')
response = self.client.get(url, follow=True)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "XYZ")
[docs] def test_can_see_submissions(self):
self.assertTrue(self.client.login(username='test_user'))
self.client.get('/c/c/')
url = reverse('show_submission_source', args=(1,))
response = self.client.get(url)
self.assertEqual(response.status_code, 302)
url = reverse('show_submission_source', args=(2,))
response = self.client.get(url)
self.assertEqual(response.status_code, 302)
[docs] def test_can_see_modelsolutions(self):
self.assertTrue(self.client.login(username='test_user'))
self.client.get('/c/c/')
submission_id = ModelProgramSubmission.objects.first().id
url = reverse('show_submission_source', args=(submission_id,))
response = self.client.get(url, follow=True)
self.assertEqual(response.status_code, 403)
[docs] def test_can_see_tests(self):
self.assertTrue(self.client.login(username='test_user'))
self.client.get('/c/c/')
test_id = Test.objects.first().id
url = reverse('download_input_file', args=(test_id,))
response = self.client.get(url, follow=True)
self.assertEqual(response.status_code, 403)
url = reverse('download_output_file', args=(test_id,))
response = self.client.get(url, follow=True)
self.assertEqual(response.status_code, 403)