add contest tests

This commit is contained in:
zhanghedr 2017-02-26 23:18:22 -05:00
parent bb3d4f7f02
commit 60ebece853
2 changed files with 111 additions and 4 deletions

View File

@ -0,0 +1,107 @@
from datetime import datetime, timedelta
import copy
from django.utils import timezone
from utils.api._serializers import DateTimeTZField
from utils.api.tests import APITestCase
from .models import ContestAnnouncement
from .models import ContestRuleType
DEFAULT_CONTEST_DATA = {"title": "test title", "description": "test description",
"start_time": timezone.localtime(timezone.now()),
"end_time": timezone.localtime(timezone.now()) + timedelta(days=1),
"rule_type": ContestRuleType.ACM,
"password": "123",
"visible": True, "real_time_rank": True}
class ContestAPITest(APITestCase):
def setUp(self):
self.create_super_admin()
self.url = self.reverse("contest_api")
self.data = DEFAULT_CONTEST_DATA
def test_create_contest(self):
response = self.client.post(self.url, data=self.data)
self.assertSuccess(response)
return response
def test_update_contest(self):
id = self.test_create_contest().data["data"]["id"]
update_data = {"id": id, "title": "update title",
"description": "update description",
"password": "12345",
"visible": False, "real_time_rank": False}
data = copy.deepcopy(self.data)
data.update(update_data)
response = self.client.put(self.url, data=data)
self.assertSuccess(response)
response_data = response.data["data"]
datetime_tz_field = DateTimeTZField()
for k in data.keys():
if isinstance(data[k], datetime):
data[k] = datetime_tz_field.to_representation(data[k])
self.assertEqual(response_data[k], data[k])
def test_get_contests(self):
self.test_create_contest()
response = self.client.get(self.url)
self.assertSuccess(response)
def test_get_one_contest(self):
id = self.test_create_contest().data["data"]["id"]
response = self.client.get("{}?id={}".format(self.url, id))
self.assertSuccess(response)
class ContestAnnouncementAPITest(APITestCase):
def setUp(self):
self.create_super_admin()
self.url = self.reverse("contest_announcement_admin_api")
contest_id = self.create_contest().data["data"]["id"]
self.data = {"title": "test title", "content": "test content", "contest_id": contest_id}
def create_contest(self):
url = self.reverse("contest_api")
data = DEFAULT_CONTEST_DATA
return self.client.post(url, data=data)
def test_create_contest_announcement(self):
response = self.client.post(self.url, data=self.data)
self.assertSuccess(response)
return response
def test_delete_contest_announcement(self):
id = self.test_create_contest_announcement().data["data"]["id"]
response = self.client.delete("{}?id={}".format(self.url, id))
self.assertSuccess(response)
self.assertFalse(ContestAnnouncement.objects.filter(id=id).exists())
def test_get_contest_announcements(self):
self.test_create_contest_announcement()
response = self.client.get(self.url)
self.assertSuccess(response)
def test_get_one_contest_announcement(self):
id = self.test_create_contest_announcement().data["data"]["id"]
response = self.client.get("{}?id={}".format(self.url, id))
self.assertSuccess(response)
class ContestAnnouncementListAPITest(APITestCase):
def setUp(self):
self.create_super_admin()
self.url = self.reverse("contest_list_api")
def create_contest_announcements(self):
contest_id = self.client.post(self.reverse("contest_api"), data=DEFAULT_CONTEST_DATA).data["data"]["id"]
url = self.reverse("contest_announcement_admin_api")
self.client.post(url, data={"title": "test title1", "content": "test content1", "contest_id": contest_id})
self.client.post(url, data={"title": "test title2", "content": "test content2", "contest_id": contest_id})
return contest_id
def test_get_contest_announcement_list(self):
contest_id = self.create_contest_announcements()
response = self.client.get(self.url, data={"contest_id": contest_id})
self.assertSuccess(response)

View File

@ -1,7 +1,6 @@
import dateutil.parser import dateutil.parser
from utils.api import APIView, validate_serializer from utils.api import APIView, validate_serializer
from ..models import Contest, ContestAnnouncement from ..models import Contest, ContestAnnouncement
from ..serializers import (ContestAnnouncementSerializer, ContestSerializer, from ..serializers import (ContestAnnouncementSerializer, ContestSerializer,
CreateConetestSeriaizer, CreateConetestSeriaizer,
@ -20,8 +19,8 @@ class ContestAPI(APIView):
return self.error("Start time must occur earlier than end time") return self.error("Start time must occur earlier than end time")
if not data["password"]: if not data["password"]:
data["password"] = None data["password"] = None
Contest.objects.create(**data) contest = Contest.objects.create(**data)
return self.success() return self.success(ContestSerializer(contest).data)
@validate_serializer(EditConetestSeriaizer) @validate_serializer(EditConetestSeriaizer)
def put(self, request): def put(self, request):
@ -90,7 +89,8 @@ class ContestAnnouncementAPI(APIView):
contest_announcement_id = request.GET.get("id") contest_announcement_id = request.GET.get("id")
if contest_announcement_id: if contest_announcement_id:
if request.user.is_admin(): if request.user.is_admin():
ContestAnnouncement.objects.filter(id=contest_announcement_id, contest__created_by=request.user).delete() ContestAnnouncement.objects.filter(id=contest_announcement_id,
contest__created_by=request.user).delete()
else: else:
ContestAnnouncement.objects.filter(id=contest_announcement_id).delete() ContestAnnouncement.objects.filter(id=contest_announcement_id).delete()
return self.success() return self.success()