From d8bf33a12d68e688c2df8a066f72a71bc1bc96f0 Mon Sep 17 00:00:00 2001 From: zema1 Date: Sat, 21 Oct 2017 10:51:35 +0800 Subject: [PATCH] fix tests --- account/tests.py | 15 ++++---- conf/tests.py | 4 -- contest/tests.py | 4 +- oj/settings.py | 6 +++ problem/tests.py | 84 ++++++++++++++++++++++++++++-------------- problem/views/admin.py | 1 + problem/views/oj.py | 2 - submission/tests.py | 10 +++-- 8 files changed, 80 insertions(+), 46 deletions(-) diff --git a/account/tests.py b/account/tests.py index 906ef28b..75515ced 100644 --- a/account/tests.py +++ b/account/tests.py @@ -11,6 +11,7 @@ from utils.shortcuts import rand_str from options.options import SysOptions from .models import AdminType, ProblemPermission, User +from utils.constants import ContestRuleType class PermissionDecoratorTest(APITestCase): @@ -134,7 +135,7 @@ class UserLoginAPITest(APITestCase): self.user.save() resp = self.client.post(self.login_url, data={"username": self.username, "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): @@ -159,7 +160,7 @@ class UserRegisterAPITest(CaptchaTest): def test_website_config_limit(self): SysOptions.allow_register = False 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): self.data["captcha"] = "****" @@ -220,7 +221,7 @@ class UserProfileAPITest(APITestCase): def test_get_profile_without_login(self): 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): self.create_user("test", "test123") @@ -335,14 +336,14 @@ class ResetPasswordAPITest(CaptchaTest): def test_reset_password_with_invalid_token(self): self.data["token"] = "aaaaaaaaaaa" 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): user = User.objects.first() user.reset_password_token_expire_time = now() - timedelta(seconds=30) user.save() 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): @@ -473,14 +474,14 @@ class UserRankAPITest(APITestCase): profile2.save() 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) data = resp.data["data"] self.assertEqual(data[0]["user"]["username"], "test1") self.assertEqual(data[1]["user"]["username"], "test2") 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) data = resp.data["data"] self.assertEqual(data[0]["user"]["username"], "test2") diff --git a/conf/tests.py b/conf/tests.py index eff8cfde..5906b078 100644 --- a/conf/tests.py +++ b/conf/tests.py @@ -4,7 +4,6 @@ from django.utils import timezone from options.options import SysOptions from utils.api.tests import APITestCase -from utils.cache import default_cache from utils.constants import CacheKey from .models import JudgeServer @@ -70,9 +69,6 @@ class WebsiteConfigAPITest(APITestCase): resp = self.client.get(url) self.assertSuccess(resp) - def tearDown(self): - default_cache.delete(CacheKey.website_config) - class JudgeServerHeartbeatTest(APITestCase): def setUp(self): diff --git a/contest/tests.py b/contest/tests.py index c481becb..df05df87 100644 --- a/contest/tests.py +++ b/contest/tests.py @@ -79,7 +79,7 @@ class ContestAPITest(APITestCase): self.create_user("test", "test123") url = self.reverse("contest_password_api") 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"]}) self.assertSuccess(resp) @@ -89,7 +89,7 @@ class ContestAPITest(APITestCase): self.create_user("test", "test123") url = self.reverse("contest_access_api") 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") resp = self.client.post(password_url, {"contest_id": contest_id, "password": DEFAULT_CONTEST_DATA["password"]}) diff --git a/oj/settings.py b/oj/settings.py index ac972c79..950c426d 100644 --- a/oj/settings.py +++ b/oj/settings.py @@ -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" diff --git a/problem/tests.py b/problem/tests.py index 4e081ff7..7efa668b 100644 --- a/problem/tests.py +++ b/problem/tests.py @@ -1,4 +1,5 @@ import copy +import hashlib import os import shutil from datetime import timedelta @@ -9,6 +10,7 @@ from django.conf import settings from utils.api.tests import APITestCase from .models import ProblemTag +from .models import Problem, ProblemRuleType from .views.admin import TestCaseUploadAPI from contest.models import Contest from contest.tests import DEFAULT_CONTEST_DATA @@ -23,6 +25,40 @@ DEFAULT_PROBLEM_DATA = {"_id": "A-110", "title": "test", "description": "

test "input_size": 0, "score": 0}], "rule_type": "ACM", "hint": "

test

", "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): def test_get_tag_list(self): @@ -96,7 +132,7 @@ class ProblemAdminAPITest(APITestCase): def setUp(self): self.url = self.reverse("problem_admin_api") self.create_super_admin() - self.data = DEFAULT_PROBLEM_DATA + self.data = copy.deepcopy(DEFAULT_PROBLEM_DATA) def test_create_problem(self): resp = self.client.post(self.url, data=self.data) @@ -138,23 +174,19 @@ class ProblemAdminAPITest(APITestCase): self.assertSuccess(resp) -class ProblemAPITest(APITestCase): +class ProblemAPITest(ProblemCreateTestBase): def setUp(self): self.url = self.reverse("problem_api") - self.create_admin() - - def create_problem(self): - url = self.reverse("problem_admin_api") - return self.client.post(url, data=DEFAULT_PROBLEM_DATA) + admin = self.create_admin(login=False) + self.problem = self.add_problem(DEFAULT_PROBLEM_DATA, admin) + self.create_user("test", "test123") def test_get_problem_list(self): - self.create_problem() resp = self.client.get(f"{self.url}?limit=10") self.assertSuccess(resp) def get_one_problem(self): - problem_id = self.create_problem().data["data"]["_id"] - resp = self.client.get(self.url + "?id=" + str(problem_id)) + resp = self.client.get(self.url + "?id=" + self.problem._id) self.assertSuccess(resp) @@ -169,51 +201,49 @@ class ContestProblemAdminTest(APITestCase): def test_create_contest_problem(self): contest = self.create_contest() - data = DEFAULT_PROBLEM_DATA + data = copy.deepcopy(DEFAULT_PROBLEM_DATA) data["contest_id"] = contest.data["data"]["id"] resp = self.client.post(self.url, data=data) self.assertSuccess(resp) - return resp + return contest, resp 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"] resp = self.client.get(self.url + "?contest_id=" + str(contest_id)) self.assertSuccess(resp) self.assertEqual(len(resp.data["data"]), 1) 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"] - 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) -class ContestProblemTest(APITestCase): +class ContestProblemTest(ProblemCreateTestBase): def setUp(self): - self.url = self.reverse("contest_problem_api") - self.create_admin() - + admin = self.create_admin() url = self.reverse("contest_admin_api") contest_data = copy.deepcopy(DEFAULT_CONTEST_DATA) contest_data["password"] = "" contest_data["start_time"] = contest_data["start_time"] + timedelta(hours=1) 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) - 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): + def test_admin_get_contest_problem_list(self): contest_id = self.contest["id"] resp = self.client.get(self.url + "?contest_id=" + str(contest_id)) self.assertSuccess(resp) 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"] - 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)) self.assertSuccess(resp) diff --git a/problem/views/admin.py b/problem/views/admin.py index 572e2fb4..00f46c4d 100644 --- a/problem/views/admin.py +++ b/problem/views/admin.py @@ -223,6 +223,7 @@ class ProblemAPI(APIView): data["total_score"] = total_score # todo check filename and score info tags = data.pop("tags") + data["languages"] = list(data["languages"]) for k, v in data.items(): setattr(problem, k, v) diff --git a/problem/views/oj.py b/problem/views/oj.py index 3410ae1c..330e9332 100644 --- a/problem/views/oj.py +++ b/problem/views/oj.py @@ -71,10 +71,8 @@ class ProblemAPI(APIView): class ContestProblemAPI(APIView): 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): return - print('here') if request.user.is_authenticated(): profile = request.user.userprofile if self.contest.rule_type == ContestRuleType.ACM: diff --git a/submission/tests.py b/submission/tests.py index c7348827..fdcd12ec 100644 --- a/submission/tests.py +++ b/submission/tests.py @@ -32,14 +32,16 @@ class SubmissionPrepare(APITestCase): def _create_problem_and_submission(self): user = self.create_admin("test", "test123", login=False) problem_data = deepcopy(DEFAULT_PROBLEM_DATA) - problem_data.pop("tags") + tags = problem_data.pop("tags") problem_data["created_by"] = user self.problem = Problem.objects.create(**problem_data) - for tag in DEFAULT_PROBLEM_DATA["tags"]: + for tag in tags: tag = ProblemTag.objects.create(name=tag) self.problem.tags.add(tag) 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): @@ -61,6 +63,6 @@ class SubmissionAPITest(SubmissionPrepare): self.url = self.reverse("submission_api") 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) judge_task.assert_called()