mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-11-04 14:49:58 +08:00
fix tests
This commit is contained in:
parent
f5566148bc
commit
d8bf33a12d
@ -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")
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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"]})
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user