fix tests

This commit is contained in:
zema1 2017-10-21 10:51:35 +08:00
parent f5566148bc
commit d8bf33a12d
8 changed files with 80 additions and 46 deletions

View File

@ -11,6 +11,7 @@ from utils.shortcuts import rand_str
from options.options import SysOptions from options.options import SysOptions
from .models import AdminType, ProblemPermission, User from .models import AdminType, ProblemPermission, User
from utils.constants import ContestRuleType
class PermissionDecoratorTest(APITestCase): class PermissionDecoratorTest(APITestCase):
@ -134,7 +135,7 @@ class UserLoginAPITest(APITestCase):
self.user.save() self.user.save()
resp = self.client.post(self.login_url, data={"username": self.username, resp = self.client.post(self.login_url, data={"username": self.username,
"password": self.password}) "password": self.password})
self.assertDictEqual(resp.data, {"error": "error", "data": "Your account have been disabled"}) self.assertDictEqual(resp.data, {"error": "error", "data": "Your account has been disabled"})
class CaptchaTest(APITestCase): class CaptchaTest(APITestCase):
@ -159,7 +160,7 @@ class UserRegisterAPITest(CaptchaTest):
def test_website_config_limit(self): def test_website_config_limit(self):
SysOptions.allow_register = False SysOptions.allow_register = False
resp = self.client.post(self.register_url, data=self.data) resp = self.client.post(self.register_url, data=self.data)
self.assertDictEqual(resp.data, {"error": "error", "data": "Register have been disabled by admin"}) self.assertDictEqual(resp.data, {"error": "error", "data": "Register function has been disabled by admin"})
def test_invalid_captcha(self): def test_invalid_captcha(self):
self.data["captcha"] = "****" self.data["captcha"] = "****"
@ -220,7 +221,7 @@ class UserProfileAPITest(APITestCase):
def test_get_profile_without_login(self): def test_get_profile_without_login(self):
resp = self.client.get(self.url) resp = self.client.get(self.url)
self.assertDictEqual(resp.data, {"error": None, "data": {}}) self.assertDictEqual(resp.data, {"error": None, "data": None})
def test_get_profile(self): def test_get_profile(self):
self.create_user("test", "test123") self.create_user("test", "test123")
@ -335,14 +336,14 @@ class ResetPasswordAPITest(CaptchaTest):
def test_reset_password_with_invalid_token(self): def test_reset_password_with_invalid_token(self):
self.data["token"] = "aaaaaaaaaaa" self.data["token"] = "aaaaaaaaaaa"
resp = self.client.post(self.url, data=self.data) resp = self.client.post(self.url, data=self.data)
self.assertDictEqual(resp.data, {"error": "error", "data": "Token dose not exist"}) self.assertDictEqual(resp.data, {"error": "error", "data": "Token does not exist"})
def test_reset_password_with_expired_token(self): def test_reset_password_with_expired_token(self):
user = User.objects.first() user = User.objects.first()
user.reset_password_token_expire_time = now() - timedelta(seconds=30) user.reset_password_token_expire_time = now() - timedelta(seconds=30)
user.save() user.save()
resp = self.client.post(self.url, data=self.data) resp = self.client.post(self.url, data=self.data)
self.assertDictEqual(resp.data, {"error": "error", "data": "Token have expired"}) self.assertDictEqual(resp.data, {"error": "error", "data": "Token has expired"})
class UserChangePasswordAPITest(CaptchaTest): class UserChangePasswordAPITest(CaptchaTest):
@ -473,14 +474,14 @@ class UserRankAPITest(APITestCase):
profile2.save() profile2.save()
def test_get_acm_rank(self): def test_get_acm_rank(self):
resp = self.client.get(self.url, data={"rule": "acm"}) resp = self.client.get(self.url, data={"rule": ContestRuleType.ACM})
self.assertSuccess(resp) self.assertSuccess(resp)
data = resp.data["data"] data = resp.data["data"]
self.assertEqual(data[0]["user"]["username"], "test1") self.assertEqual(data[0]["user"]["username"], "test1")
self.assertEqual(data[1]["user"]["username"], "test2") self.assertEqual(data[1]["user"]["username"], "test2")
def test_get_oi_rank(self): def test_get_oi_rank(self):
resp = self.client.get(self.url, data={"rule": "oi"}) resp = self.client.get(self.url, data={"rule": ContestRuleType.OI})
self.assertSuccess(resp) self.assertSuccess(resp)
data = resp.data["data"] data = resp.data["data"]
self.assertEqual(data[0]["user"]["username"], "test2") self.assertEqual(data[0]["user"]["username"], "test2")

View File

@ -4,7 +4,6 @@ from django.utils import timezone
from options.options import SysOptions from options.options import SysOptions
from utils.api.tests import APITestCase from utils.api.tests import APITestCase
from utils.cache import default_cache
from utils.constants import CacheKey from utils.constants import CacheKey
from .models import JudgeServer from .models import JudgeServer
@ -70,9 +69,6 @@ class WebsiteConfigAPITest(APITestCase):
resp = self.client.get(url) resp = self.client.get(url)
self.assertSuccess(resp) self.assertSuccess(resp)
def tearDown(self):
default_cache.delete(CacheKey.website_config)
class JudgeServerHeartbeatTest(APITestCase): class JudgeServerHeartbeatTest(APITestCase):
def setUp(self): def setUp(self):

View File

@ -79,7 +79,7 @@ class ContestAPITest(APITestCase):
self.create_user("test", "test123") self.create_user("test", "test123")
url = self.reverse("contest_password_api") url = self.reverse("contest_password_api")
resp = self.client.post(url, {"contest_id": contest_id, "password": "error_password"}) resp = self.client.post(url, {"contest_id": contest_id, "password": "error_password"})
self.assertDictEqual(resp.data, {"error": "error", "data": "Password doesn't match."}) self.assertDictEqual(resp.data, {"error": "error", "data": "Wrong password"})
resp = self.client.post(url, {"contest_id": contest_id, "password": DEFAULT_CONTEST_DATA["password"]}) resp = self.client.post(url, {"contest_id": contest_id, "password": DEFAULT_CONTEST_DATA["password"]})
self.assertSuccess(resp) self.assertSuccess(resp)
@ -89,7 +89,7 @@ class ContestAPITest(APITestCase):
self.create_user("test", "test123") self.create_user("test", "test123")
url = self.reverse("contest_access_api") url = self.reverse("contest_access_api")
resp = self.client.get(url + "?contest_id=" + str(contest_id)) resp = self.client.get(url + "?contest_id=" + str(contest_id))
self.assertFalse(resp.data["data"]["Access"]) self.assertFalse(resp.data["data"]["access"])
password_url = self.reverse("contest_password_api") password_url = self.reverse("contest_password_api")
resp = self.client.post(password_url, {"contest_id": contest_id, "password": DEFAULT_CONTEST_DATA["password"]}) resp = self.client.post(password_url, {"contest_id": contest_id, "password": DEFAULT_CONTEST_DATA["password"]})

View File

@ -163,6 +163,12 @@ LOGGING = {
} }
}, },
} }
REST_FRAMEWORK = {
'TEST_REQUEST_DEFAULT_FORMAT': 'json',
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
REDIS_URL = "redis://127.0.0.1:6379" REDIS_URL = "redis://127.0.0.1:6379"

View File

@ -1,4 +1,5 @@
import copy import copy
import hashlib
import os import os
import shutil import shutil
from datetime import timedelta from datetime import timedelta
@ -9,6 +10,7 @@ from django.conf import settings
from utils.api.tests import APITestCase from utils.api.tests import APITestCase
from .models import ProblemTag from .models import ProblemTag
from .models import Problem, ProblemRuleType
from .views.admin import TestCaseUploadAPI from .views.admin import TestCaseUploadAPI
from contest.models import Contest from contest.models import Contest
from contest.tests import DEFAULT_CONTEST_DATA from contest.tests import DEFAULT_CONTEST_DATA
@ -23,6 +25,40 @@ DEFAULT_PROBLEM_DATA = {"_id": "A-110", "title": "test", "description": "<p>test
"input_size": 0, "score": 0}], "input_size": 0, "score": 0}],
"rule_type": "ACM", "hint": "<p>test</p>", "source": "test"} "rule_type": "ACM", "hint": "<p>test</p>", "source": "test"}
class ProblemCreateTestBase(APITestCase):
@staticmethod
def add_problem(problem_data, created_by):
data = copy.deepcopy(problem_data)
if data["spj"]:
if not data["spj_language"] or not data["spj_code"]:
raise ValueError("Invalid spj")
data["spj_version"] = hashlib.md5((data["spj_language"] + ":" + data["spj_code"]).encode("utf-8")).hexdigest()
else:
data["spj_language"] = None
data["spj_code"] = None
if data["rule_type"] == ProblemRuleType.OI:
total_score = 0
for item in data["test_case_score"]:
if item["score"] <= 0:
raise ValueError("invalid score")
else:
total_score += item["score"]
data["total_score"] = total_score
data["created_by"] = created_by
tags = data.pop("tags")
data["languages"] = list(data["languages"])
problem = Problem.objects.create(**data)
for item in tags:
try:
tag = ProblemTag.objects.get(name=item)
except ProblemTag.DoesNotExist:
tag = ProblemTag.objects.create(name=item)
problem.tags.add(tag)
return problem
class ProblemTagListAPITest(APITestCase): class ProblemTagListAPITest(APITestCase):
def test_get_tag_list(self): def test_get_tag_list(self):
@ -96,7 +132,7 @@ class ProblemAdminAPITest(APITestCase):
def setUp(self): def setUp(self):
self.url = self.reverse("problem_admin_api") self.url = self.reverse("problem_admin_api")
self.create_super_admin() self.create_super_admin()
self.data = DEFAULT_PROBLEM_DATA self.data = copy.deepcopy(DEFAULT_PROBLEM_DATA)
def test_create_problem(self): def test_create_problem(self):
resp = self.client.post(self.url, data=self.data) resp = self.client.post(self.url, data=self.data)
@ -138,23 +174,19 @@ class ProblemAdminAPITest(APITestCase):
self.assertSuccess(resp) self.assertSuccess(resp)
class ProblemAPITest(APITestCase): class ProblemAPITest(ProblemCreateTestBase):
def setUp(self): def setUp(self):
self.url = self.reverse("problem_api") self.url = self.reverse("problem_api")
self.create_admin() admin = self.create_admin(login=False)
self.problem = self.add_problem(DEFAULT_PROBLEM_DATA, admin)
def create_problem(self): self.create_user("test", "test123")
url = self.reverse("problem_admin_api")
return self.client.post(url, data=DEFAULT_PROBLEM_DATA)
def test_get_problem_list(self): def test_get_problem_list(self):
self.create_problem()
resp = self.client.get(f"{self.url}?limit=10") resp = self.client.get(f"{self.url}?limit=10")
self.assertSuccess(resp) self.assertSuccess(resp)
def get_one_problem(self): def get_one_problem(self):
problem_id = self.create_problem().data["data"]["_id"] resp = self.client.get(self.url + "?id=" + self.problem._id)
resp = self.client.get(self.url + "?id=" + str(problem_id))
self.assertSuccess(resp) self.assertSuccess(resp)
@ -169,51 +201,49 @@ class ContestProblemAdminTest(APITestCase):
def test_create_contest_problem(self): def test_create_contest_problem(self):
contest = self.create_contest() contest = self.create_contest()
data = DEFAULT_PROBLEM_DATA data = copy.deepcopy(DEFAULT_PROBLEM_DATA)
data["contest_id"] = contest.data["data"]["id"] data["contest_id"] = contest.data["data"]["id"]
resp = self.client.post(self.url, data=data) resp = self.client.post(self.url, data=data)
self.assertSuccess(resp) self.assertSuccess(resp)
return resp return contest, resp
def test_get_contest_problem(self): def test_get_contest_problem(self):
contest = self.test_create_contest_problem() contest, contest_problem = self.test_create_contest_problem()
contest_id = contest.data["data"]["id"] contest_id = contest.data["data"]["id"]
resp = self.client.get(self.url + "?contest_id=" + str(contest_id)) resp = self.client.get(self.url + "?contest_id=" + str(contest_id))
self.assertSuccess(resp) self.assertSuccess(resp)
self.assertEqual(len(resp.data["data"]), 1) self.assertEqual(len(resp.data["data"]), 1)
def test_get_one_contest_problem(self): def test_get_one_contest_problem(self):
contest = self.test_create_contest_problem() contest, contest_problem = self.test_create_contest_problem()
contest_id = contest.data["data"]["id"] contest_id = contest.data["data"]["id"]
resp = self.client.get(self.url + "?id=" + str(contest_id)) problem_id = contest_problem.data["data"]["id"]
resp = self.client.get(f"{self.url}?contest_id={contest_id}&id={problem_id}")
self.assertSuccess(resp) self.assertSuccess(resp)
class ContestProblemTest(APITestCase): class ContestProblemTest(ProblemCreateTestBase):
def setUp(self): def setUp(self):
self.url = self.reverse("contest_problem_api") admin = self.create_admin()
self.create_admin()
url = self.reverse("contest_admin_api") url = self.reverse("contest_admin_api")
contest_data = copy.deepcopy(DEFAULT_CONTEST_DATA) contest_data = copy.deepcopy(DEFAULT_CONTEST_DATA)
contest_data["password"] = "" contest_data["password"] = ""
contest_data["start_time"] = contest_data["start_time"] + timedelta(hours=1) contest_data["start_time"] = contest_data["start_time"] + timedelta(hours=1)
self.contest = self.client.post(url, data=contest_data).data["data"] self.contest = self.client.post(url, data=contest_data).data["data"]
self.problem = self.add_problem(DEFAULT_PROBLEM_DATA, admin)
self.problem.contest_id = self.contest["id"]
self.problem.save()
self.url = self.reverse("contest_problem_api")
problem_data = copy.deepcopy(DEFAULT_PROBLEM_DATA) def test_admin_get_contest_problem_list(self):
problem_data["contest"] = self.contest["id"]
url = self.reverse("contest_problem_admin_api")
self.problem = self.client.post(url, problem_data).data["data"]
def test_get_contest_problem_list(self):
contest_id = self.contest["id"] contest_id = self.contest["id"]
resp = self.client.get(self.url + "?contest_id=" + str(contest_id)) resp = self.client.get(self.url + "?contest_id=" + str(contest_id))
self.assertSuccess(resp) self.assertSuccess(resp)
self.assertEqual(len(resp.data["data"]), 1) self.assertEqual(len(resp.data["data"]), 1)
def test_get_one_contest_problem(self): def test_admin_get_one_contest_problem(self):
contest_id = self.contest["id"] contest_id = self.contest["id"]
problem_id = self.problem["_id"] problem_id = self.problem._id
resp = self.client.get("{}?contest_id={}&problem_id={}".format(self.url, contest_id, problem_id)) resp = self.client.get("{}?contest_id={}&problem_id={}".format(self.url, contest_id, problem_id))
self.assertSuccess(resp) self.assertSuccess(resp)

View File

@ -223,6 +223,7 @@ class ProblemAPI(APIView):
data["total_score"] = total_score data["total_score"] = total_score
# todo check filename and score info # todo check filename and score info
tags = data.pop("tags") tags = data.pop("tags")
data["languages"] = list(data["languages"])
for k, v in data.items(): for k, v in data.items():
setattr(problem, k, v) setattr(problem, k, v)

View File

@ -71,10 +71,8 @@ class ProblemAPI(APIView):
class ContestProblemAPI(APIView): class ContestProblemAPI(APIView):
def _add_problem_status(self, request, queryset_values): def _add_problem_status(self, request, queryset_values):
print("checking")
if self.contest.rule_type == ContestRuleType.OI and not self.contest.check_oi_permission(request.user): if self.contest.rule_type == ContestRuleType.OI and not self.contest.check_oi_permission(request.user):
return return
print('here')
if request.user.is_authenticated(): if request.user.is_authenticated():
profile = request.user.userprofile profile = request.user.userprofile
if self.contest.rule_type == ContestRuleType.ACM: if self.contest.rule_type == ContestRuleType.ACM:

View File

@ -32,14 +32,16 @@ class SubmissionPrepare(APITestCase):
def _create_problem_and_submission(self): def _create_problem_and_submission(self):
user = self.create_admin("test", "test123", login=False) user = self.create_admin("test", "test123", login=False)
problem_data = deepcopy(DEFAULT_PROBLEM_DATA) problem_data = deepcopy(DEFAULT_PROBLEM_DATA)
problem_data.pop("tags") tags = problem_data.pop("tags")
problem_data["created_by"] = user problem_data["created_by"] = user
self.problem = Problem.objects.create(**problem_data) self.problem = Problem.objects.create(**problem_data)
for tag in DEFAULT_PROBLEM_DATA["tags"]: for tag in tags:
tag = ProblemTag.objects.create(name=tag) tag = ProblemTag.objects.create(name=tag)
self.problem.tags.add(tag) self.problem.tags.add(tag)
self.problem.save() self.problem.save()
self.submission = Submission.objects.create(**DEFAULT_SUBMISSION_DATA) self.submission_data = deepcopy(DEFAULT_SUBMISSION_DATA)
self.submission_data["problem_id"] = self.problem.id
self.submission = Submission.objects.create(**self.submission_data)
class SubmissionListTest(SubmissionPrepare): class SubmissionListTest(SubmissionPrepare):
@ -61,6 +63,6 @@ class SubmissionAPITest(SubmissionPrepare):
self.url = self.reverse("submission_api") self.url = self.reverse("submission_api")
def test_create_submission(self, judge_task): def test_create_submission(self, judge_task):
resp = self.client.post(self.url, DEFAULT_SUBMISSION_DATA) resp = self.client.post(self.url, self.submission_data)
self.assertSuccess(resp) self.assertSuccess(resp)
judge_task.assert_called() judge_task.assert_called()