# coding: utf-8
import pytest
from django.contrib.auth.models import User
from django.test.utils import override_settings
from django.urls import reverse
from oioioi.base.tests import TestCase
from oioioi.base.utils.test_migrations import TestCaseMigrations
from oioioi.contests.current_contest import ContestMode
from oioioi.contests.models import Contest, ProblemInstance
from oioioi.problems.models import (
Problem,
ProblemSite,
ProblemStatement,
make_problem_filename,
)
from oioioi.problems.tests.utilities import TestProblemController, get_test_filename
from oioioi.problemsharing.models import Friendship
[docs]class TestModels(TestCase):
[docs] def test_problem_controller_property(self):
problem = Problem(controller_name='oioioi.problems.tests.TestProblemController')
self.assertIsInstance(problem.controller, TestProblemController)
[docs] def test_make_problem_filename(self):
p12 = Problem(pk=12)
self.assertEqual(make_problem_filename(p12, 'a/hej.txt'), 'problems/12/hej.txt')
ps = ProblemStatement(pk=22, problem=p12)
self.assertEqual(make_problem_filename(ps, 'a/hej.txt'), 'problems/12/hej.txt')
[docs]class TestProblemsharing(TestCase):
[docs] fixtures = ['test_users', 'teachers', 'test_contest']
[docs] def test_shared_with_me_view(self):
Problem.objects.all().delete()
Friendship.objects.all().delete()
ProblemSite.objects.all().delete()
author_user = User.objects.get(username='test_user')
teacher = User.objects.get(username='test_user2')
Problem(
author=author_user,
visibility=Problem.VISIBILITY_FRIENDS,
legacy_name='problem1',
short_name='prob1',
controller_name='oioioi.problems.tests.TestProblemController',
).save()
self.assertEqual(Problem.objects.all().count(), 1)
ProblemSite(
problem=Problem.objects.get(legacy_name='problem1'),
url_key='przykladowyurl',
).save()
self.assertEqual(ProblemSite.objects.all().count(), 1)
Friendship(
creator=User.objects.get(username='test_user'),
receiver=User.objects.get(username='test_user2'),
).save()
self.assertEqual(Friendship.objects.all().count(), 1)
self.assertTrue(self.client.login(username='test_user2'))
url = reverse('problemset_shared_with_me')
response = self.client.get(url, follow=True)
self.assertEqual(response.status_code, 200)
friends = Friendship.objects.filter(receiver=teacher).values_list(
'creator', flat=True
)
self.assertEqual(friends.count(), 1)
problems = Problem.objects.filter(
visibility=Problem.VISIBILITY_FRIENDS,
author__in=friends,
problemsite__isnull=False,
)
self.assertEqual(problems.count(), 1)
for problem in problems:
self.assertContains(response, problem.name)
# User with no administered contests doesn't see the button
self.assertNotContains(response, "Add to contest")
[docs] def test_visibility_field_present(self):
self.assertTrue(self.client.login(username='test_user'))
url = reverse('problemset_add_or_update')
response = self.client.get(url, follow=True)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Visibility")
self.assertContains(response, "Add problem")
[docs] def test_visibility_default_preference(self):
Problem.objects.all().delete()
ProblemSite.objects.all().delete()
ProblemInstance.objects.all().delete()
contest = Contest.objects.get()
self.assertTrue(self.client.login(username='test_admin'))
url = reverse('oioioiadmin:problems_problem_add')
response = self.client.get(url, {'contest_id': contest.id}, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.context['form'].initial['visibility'], Problem.VISIBILITY_FRIENDS
)
filename = get_test_filename('test_simple_package.zip')
user = User.objects.filter(username='test_admin').first()
url = response.redirect_chain[-1][0]
self.assertIn(
'problems/add-or-update.html',
[getattr(t, 'name', None) for t in response.templates],
)
response = self.client.post(
url,
{
'package_file': open(filename, 'rb'),
'visibility': Problem.VISIBILITY_PRIVATE,
'user': user,
},
follow=True,
)
self.assertEqual(response.status_code, 200)
self.assertEqual(Problem.objects.count(), 1)
self.assertEqual(ProblemInstance.objects.count(), 2)
problem = (
Problem.objects.filter(contest=contest, author=user).order_by('-id').first()
)
self.assertEqual(problem.visibility, Problem.VISIBILITY_PRIVATE)
# now the last uploaded problem (for this contest)
# has private visibility, so the form.initial['visibility'] should be set to private too
url = reverse('oioioiadmin:problems_problem_add')
response = self.client.get(url, {'contest_id': contest.id}, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.context['form'].initial['visibility'], Problem.VISIBILITY_PRIVATE
)
[docs]class TestNavigationBarItems(TestCase):
[docs] fixtures = ['test_users']
[docs] def test_navigation_bar_items_anonymous(self):
url_main = reverse('problemset_main')
response = self.client.get(url_main, follow=True)
self.assertContains(response, 'Problemset')
self.assertContains(response, 'Task archive')
# Regression test for SIO-2278
@override_settings(CONTEST_MODE=ContestMode.neutral)
[docs] def test_navigation_bar_items_translation(self):
response = self.client.get(
reverse('problemset_main'), follow=True, HTTP_ACCEPT_LANGUAGE='en'
)
self.assertContains(response, 'Problemset')
self.assertContains(response, 'Task archive')
response = self.client.get(
reverse('problemset_main'), follow=True, HTTP_ACCEPT_LANGUAGE='pl'
)
self.assertContains(response, 'Baza zadań')
self.assertContains(response, 'Archiwum zadań')
[docs] def test_navigation_bar_items_admin(self):
url_main = reverse('problemset_main')
url_my = reverse('problemset_my_problems')
url_all = reverse('problemset_all_problems')
url_add = reverse('problemset_add_or_update')
self.assertTrue(self.client.login(username='test_admin'))
for url in [url_main, url_my, url_all, url_add]:
response = self.client.get(url, follow=True)
self.assertContains(response, 'Problemset')
self.assertContains(response, 'Task archive')
@pytest.mark.skip(reason="Migrations have already been applied at the production")
[docs]class TestVisibilityMigration(TestCaseMigrations):
[docs] migrate_from = '0013_newtags'
[docs] migrate_to = '0016_visibility_part3'
[docs] def setUpBeforeMigration(self, apps):
Problem = apps.get_model('problems', 'Problem')
self.public_problem_id = Problem.objects.create(is_public=True).id
self.private_problem_id = Problem.objects.create(is_public=False).id
[docs] def test(self):
self.assertEqual(
Problem.objects.get(id=self.public_problem_id).visibility,
Problem.VISIBILITY_PUBLIC,
)
self.assertEqual(
Problem.objects.get(id=self.private_problem_id).visibility,
Problem.VISIBILITY_FRIENDS,
)
@pytest.mark.skip(reason="Migrations have already been applied at the production")
[docs]class TestVisibilityMigrationReverse(TestCaseMigrations):
[docs] migrate_from = '0016_visibility_part3'
[docs] migrate_to = '0013_newtags'
[docs] def setUpBeforeMigration(self, apps):
Problem = apps.get_model('problems', 'Problem')
self.public_problem_id = Problem.objects.create(visibility='PU').id
self.friends_problem_id = Problem.objects.create(visibility='FR').id
self.private_problem_id = Problem.objects.create(visibility='PR').id
[docs] def test(self):
Problem = self.apps.get_model('problems', 'Problem')
self.assertEqual(Problem.objects.get(id=self.public_problem_id).is_public, True)
self.assertEqual(
Problem.objects.get(id=self.friends_problem_id).is_public, False
)
self.assertEqual(
Problem.objects.get(id=self.private_problem_id).is_public, False
)