Source code for oioioi.clock.tests

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

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.contests.current_contest import ContestMode
from oioioi.contests.models import Contest, Round, RoundTimeExtension


[docs]class TestClock(TestCase):
[docs] fixtures = ['test_contest', 'test_users']
@override_settings(CONTEST_MODE=ContestMode.neutral)
[docs] def test_clock(self): response = self.client.get(reverse('get_status')).json() response_time = response['time'] now = time.time() self.assertLessEqual(response_time, now) self.assertGreater(response_time, now - 10)
[docs] def test_countdown(self): contest = Contest.objects.get() now = time.time() r1_start = datetime.fromtimestamp(now - 5) r1_end = datetime.fromtimestamp(now + 10) r2_start = datetime.fromtimestamp(now - 10) r2_end = datetime.fromtimestamp(now + 5) r1 = Round(contest=contest, start_date=r1_start, end_date=r1_end) r2 = Round(contest=contest, start_date=r2_start, end_date=r2_end) r1.save() r2.save() response = self.client.get( reverse('get_status', kwargs={'contest_id': contest.id}) ).json() round_start_date = response['round_start_date'] round_end_date = response['round_end_date'] self.assertEqual(round_start_date, time.mktime(r2_start.timetuple())) self.assertEqual(round_end_date, time.mktime(r2_end.timetuple()))
[docs] def test_countdown_with_extended_rounds(self): contest = Contest.objects.get() now = time.time() r1_start = datetime.fromtimestamp(now - 5) r1_end = datetime.fromtimestamp(now + 10) r1 = Round(contest=contest, start_date=r1_start, end_date=r1_end) r1.save() user = User.objects.get(username='test_user') RoundTimeExtension(user=user, round=r1, extra_time=10).save() self.assertTrue(self.client.login(username='test_user')) response = self.client.get( reverse('get_status', kwargs={'contest_id': contest.id}) ).json() round_start_date = response['round_start_date'] round_end_date = response['round_end_date'] self.assertEqual(round_start_date, time.mktime(r1_start.timetuple())) self.assertEqual(round_end_date, time.mktime(r1_end.timetuple()) + 600)
@override_settings(CONTEST_MODE=ContestMode.neutral)
[docs] def test_admin_time(self): self.assertTrue(self.client.login(username='test_admin')) # As seconds since the epoch changed_time = datetime(2012, 12, 12, tzinfo=timezone.utc).timestamp() response = self.client.get(reverse('get_status')).json() current_time = response['time'] post_data = {'ok-button': '', 'admin-time': '2012-12-12+0:0:0'} post_url = reverse('admin_time') response = self.client.post(post_url, post_data, follow=True) self.assertEqual(response.status_code, 200) response = self.client.get(reverse('get_status')).json() self.assertTrue(response['is_admin_time_set']) self.assertEqual(response['time'], changed_time) post_data = {'reset-button': '', 'admin-time': '2012-12-12+0:0:0'} response = self.client.post(post_url, post_data, follow=True) self.assertEqual(response.status_code, 200) response = self.client.get(reverse('get_status')).json() self.assertFalse(response['is_admin_time_set']) # This test shouldn't take more than a minute. self.assertLess(abs(response['time'] - current_time), 60)