[后台]修复contestAdmin,比赛和问题API的逻辑问题,主要针对超级管理员和普通管理员的差别.写了测试,是两个api测试覆盖率达100%

This commit is contained in:
esp
2015-08-24 17:46:33 +08:00
parent f2c12ed4e0
commit 7a46d26646
2 changed files with 84 additions and 14 deletions

View File

@@ -28,6 +28,9 @@ class ContestAdminAPITest(APITestCase):
self.group = Group.objects.create(name="group1", description="des0", self.group = Group.objects.create(name="group1", description="des0",
join_group_setting=0, visible=True, join_group_setting=0, visible=True,
admin=user2) admin=user2)
self.group2 = Group.objects.create(name="group2", description="des0",
join_group_setting=0, visible=True,
admin=user1)
self.global_contest = Contest.objects.create(title="titlex", description="descriptionx", mode=1, self.global_contest = Contest.objects.create(title="titlex", description="descriptionx", mode=1,
contest_type=2, show_rank=True, show_user_submission=True, contest_type=2, show_rank=True, show_user_submission=True,
start_time="2015-08-15T10:00:00.000Z", start_time="2015-08-15T10:00:00.000Z",
@@ -78,7 +81,7 @@ class ContestAdminAPITest(APITestCase):
response = self.client.post(self.url, data=data) response = self.client.post(self.url, data=data)
self.assertEqual(response.data["code"], 0) self.assertEqual(response.data["code"], 0)
def test_group_contest_successfully(self): def test_group_contest_super_admin_successfully(self):
self.client.login(username="test1", password="testaa") self.client.login(username="test1", password="testaa")
data = {"title": "title3", "description": "description3", "mode": 1, "contest_type": 0, data = {"title": "title3", "description": "description3", "mode": 1, "contest_type": 0,
"show_rank": True, "show_user_submission": True, "start_time": "2015-08-15T10:00:00.000Z", "show_rank": True, "show_user_submission": True, "start_time": "2015-08-15T10:00:00.000Z",
@@ -86,6 +89,14 @@ class ContestAdminAPITest(APITestCase):
response = self.client.post(self.url, data=data) response = self.client.post(self.url, data=data)
self.assertEqual(response.data["code"], 0) self.assertEqual(response.data["code"], 0)
def test_group_contest_admin_successfully(self):
self.client.login(username="test2", password="testbb")
data = {"title": "title6", "description": "description6", "mode": 2, "contest_type": 0,
"show_rank": True, "show_user_submission": True, "start_time": "2015-08-15T10:00:00.000Z",
"end_time": "2015-08-15T12:00:00.000Z", "groups": [self.group.id], "visible": True}
response = self.client.post(self.url, data=data)
self.assertEqual(response.data["code"], 0)
def test_time_error(self): def test_time_error(self):
self.client.login(username="test1", password="testaa") self.client.login(username="test1", password="testaa")
data = {"title": "title2", "description": "description2", "mode": 1, "contest_type": 2, data = {"title": "title2", "description": "description2", "mode": 1, "contest_type": 2,
@@ -141,6 +152,15 @@ class ContestAdminAPITest(APITestCase):
self.assertEqual(response.data["data"]["end_time"], "2015-08-15T13:00:00Z") self.assertEqual(response.data["data"]["end_time"], "2015-08-15T13:00:00Z")
self.assertEqual(response.data["data"]["visible"], False) self.assertEqual(response.data["data"]["visible"], False)
def test_edit_group_contest_unsuccessfully(self):
self.client.login(username="test2", password="testbb")
data = {"id": self.group_contest.id, "title": "titleyyy", "description": "descriptionyyyy", "mode": 1,
"contest_type": 0, "show_rank": True, "show_user_submission": True,
"start_time": "2015-08-15T10:00:00.000Z", "end_time": "2015-08-15T13:00:00.000Z",
"groups": [self.group.id], "visible": False}
response = self.client.put(self.url, data=data)
self.assertEqual(response.data["code"], 1)
def test_edit_group_at_least_one(self): def test_edit_group_at_least_one(self):
self.client.login(username="test1", password="testaa") self.client.login(username="test1", password="testaa")
data = {"id": self.group_contest.id, "title": "titleyyy", "description": "descriptionyyyy", "mode": 1, data = {"id": self.group_contest.id, "title": "titleyyy", "description": "descriptionyyyy", "mode": 1,
@@ -169,7 +189,8 @@ class ContestAdminAPITest(APITestCase):
def test_edit_global_contest_password_exists(self): def test_edit_global_contest_password_exists(self):
self.client.login(username="test1", password="testaa") self.client.login(username="test1", password="testaa")
data = {"id": self.global_contest.id, "title": "title0", "description": "description0", "mode": 1, "contest_type": 2, data = {"id": self.global_contest.id, "title": "title0", "description": "description0", "mode": 1,
"contest_type": 2,
"show_rank": True, "show_user_submission": True, "start_time": "2015-08-15T10:00:00.000Z", "show_rank": True, "show_user_submission": True, "start_time": "2015-08-15T10:00:00.000Z",
"end_time": "2015-08-15T12:00:00.000Z", "visible": True} "end_time": "2015-08-15T12:00:00.000Z", "visible": True}
response = self.client.put(self.url, data=data) response = self.client.put(self.url, data=data)
@@ -189,6 +210,10 @@ class ContestAdminAPITest(APITestCase):
self.client.login(username="test1", password="testaa") self.client.login(username="test1", password="testaa")
self.assertEqual(self.client.get(self.url).data["code"], 0) self.assertEqual(self.client.get(self.url).data["code"], 0)
def test_get_data_successfully_by_normal_admin(self):
self.client.login(username="test2", password="testbb")
self.assertEqual(self.client.get(self.url).data["code"], 0)
def test_keyword_contest(self): def test_keyword_contest(self):
self.client.login(username="test1", password="testaa") self.client.login(username="test1", password="testaa")
response = self.client.get(self.url + "?visible=true") response = self.client.get(self.url + "?visible=true")
@@ -209,6 +234,12 @@ class ContestProblemAdminAPItEST(APITestCase):
self.user = User.objects.create(username="test1", admin_type=SUPER_ADMIN) self.user = User.objects.create(username="test1", admin_type=SUPER_ADMIN)
self.user.set_password("testaa") self.user.set_password("testaa")
self.user.save() self.user.save()
self.user2 = User.objects.create(username="test2", admin_type=ADMIN)
self.user2.set_password("testaa")
self.user2.save()
self.user3 = User.objects.create(username="test3", admin_type=ADMIN)
self.user3.set_password("testaa")
self.user3.save()
self.client.login(username="test1", password="testaa") self.client.login(username="test1", password="testaa")
self.global_contest = Contest.objects.create(title="titlex", description="descriptionx", mode=1, self.global_contest = Contest.objects.create(title="titlex", description="descriptionx", mode=1,
contest_type=2, show_rank=True, show_user_submission=True, contest_type=2, show_rank=True, show_user_submission=True,
@@ -311,6 +342,10 @@ class ContestProblemAdminAPItEST(APITestCase):
self.client.login(username="test1", password="testaa") self.client.login(username="test1", password="testaa")
self.assertEqual(self.client.get(self.url).data["code"], 0) self.assertEqual(self.client.get(self.url).data["code"], 0)
def test_get_data_unsuccessfully(self):
self.client.login(username="test1", password="testaa")
self.assertEqual(self.client.get(self.url+"?contest_id=12").data["code"], 1)
def test_keyword_contest(self): def test_keyword_contest(self):
self.client.login(username="test1", password="testaa") self.client.login(username="test1", password="testaa")
response = self.client.get(self.url + "?visible=true") response = self.client.get(self.url + "?visible=true")
@@ -333,4 +368,33 @@ class ContestProblemAdminAPItEST(APITestCase):
response = self.client.get(self.url, data=data) response = self.client.get(self.url, data=data)
self.assertEqual(response.data["code"], 0) self.assertEqual(response.data["code"], 0)
def test_query_contest_problem_exists_by_contest_id(self):
self.client.login(username="test3", password="testaa")
response = self.client.get(self.url + "?contest_id=1")
self.assertEqual(response.data["code"], 0)
self.assertEqual(len(response.data["data"]), 0)
def test_query_contest_problem_exists_by_normal_admin(self):
self.client.login(username="test2", password="testaa")
data = {"contest_problem_id": self.contest_problem.id}
response = self.client.get(self.url, data=data)
self.assertEqual(response.data["code"], 0)
def test_edit_problem_unsuccessfully_can_not_access(self):
self.client.login(username="test2", password="testaa")
data = {"id": self.contest_problem.id,
"title": "title2222222",
"description": "description22222222",
"input_description": "input_description2",
"output_description": "output_description2",
"test_case_id": "1",
"source": "source1",
"samples": [{"input": "1 1", "output": "2"}],
"time_limit": "100",
"memory_limit": "1000",
"hint": "hint1",
"sort_index": "b",
"visible": True}
response = self.client.put(self.url, data=data)
self.assertEqual(response.data["code"], 1)

View File

@@ -107,6 +107,8 @@ class ContestAdminAPIView(APIView):
return error_response(u"请至少选择一个小组") return error_response(u"请至少选择一个小组")
if data["start_time"] >= data["end_time"]: if data["start_time"] >= data["end_time"]:
return error_response(u"比赛的开始时间不能晚于或等于比赛结束的时间") return error_response(u"比赛的开始时间不能晚于或等于比赛结束的时间")
if request.user.admin_type != SUPER_ADMIN and request.user != contest.created_by:
return error_response(u"你无权修改该比赛!")
contest.title = data["title"] contest.title = data["title"]
contest.description = data["description"] contest.description = data["description"]
contest.mode = data["mode"] contest.mode = data["mode"]
@@ -187,10 +189,14 @@ class ContestProblemAdminAPIView(APIView):
serializer = EditContestProblemSerializer(data=request.data) serializer = EditContestProblemSerializer(data=request.data)
if serializer.is_valid(): if serializer.is_valid():
data = serializer.data data = serializer.data
try: try:
contest_problem = ContestProblem.objects.get(id=data["id"]) contest_problem = ContestProblem.objects.get(id=data["id"])
except ContestProblem.DoesNotExist: except ContestProblem.DoesNotExist:
return error_response(u"该比赛题目不存在!") return error_response(u"该比赛题目不存在!")
contest = Contest.objects.get(id=contest_problem.contest_id)
if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user:
return error_response(u"你无权修改该题目!")
contest_problem.title = data["title"] contest_problem.title = data["title"]
contest_problem.description = data["description"] contest_problem.description = data["description"]
contest_problem.input_description = data["input_description"] contest_problem.input_description = data["input_description"]