diff options
author | 2021-06-20 21:12:47 +0300 | |
---|---|---|
committer | 2021-06-20 21:12:47 +0300 | |
commit | af65bd5584e4a02057374b344e5d055bc799ba60 (patch) | |
tree | 2b3658d1dd491d6cc2c967c59a3fe237cac4281e /backend/routes/forms/unittesting.py | |
parent | Merge pull request #90 from python-discord/auth-form (diff) | |
parent | Updates Unittest Filter To Match New Model (diff) |
Merge pull request #92 from python-discord/unittest_failures
Allow Unittest Failures
Diffstat (limited to 'backend/routes/forms/unittesting.py')
-rw-r--r-- | backend/routes/forms/unittesting.py | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/backend/routes/forms/unittesting.py b/backend/routes/forms/unittesting.py index 3854314..a830775 100644 --- a/backend/routes/forms/unittesting.py +++ b/backend/routes/forms/unittesting.py @@ -7,13 +7,15 @@ import httpx from httpx import HTTPStatusError from backend.constants import SNEKBOX_URL -from backend.models import FormResponse, Form +from backend.models import Form, FormResponse with open("resources/unittest_template.py") as file: TEST_TEMPLATE = file.read() -UnittestResult = namedtuple("UnittestResult", "question_id return_code passed result") +UnittestResult = namedtuple( + "UnittestResult", "question_id question_index return_code passed result" +) def filter_unittests(form: Form) -> Form: @@ -23,8 +25,8 @@ def filter_unittests(form: Form) -> Form: This is used to redact the exact tests when sending the form back to the frontend. """ for question in form.questions: - if question.type == "code" and "unittests" in question.data: - question.data["unittests"] = len(question.data["unittests"]) + if question.type == "code" and question.data["unittests"] is not None: + question.data["unittests"]["tests"] = len(question.data["unittests"]["tests"]) return form @@ -62,20 +64,32 @@ async def execute_unittest(form_response: FormResponse, form: Form) -> list[Unit """Execute all the unittests in this form and return the results.""" unittest_results = [] - for question in form.questions: - if question.type == "code" and "unittests" in question.data: + for index, question in enumerate(form.questions): + if question.type == "code": + + # Exit early if the suite doesn't have any tests + if question.data["unittests"] is None: + unittest_results.append(UnittestResult( + question_id=question.id, + question_index=index, + return_code=0, + passed=True, + result="" + )) + continue + passed = False # Tests starting with an hashtag should have censored names. hidden_test_counter = count(1) hidden_tests = { test.lstrip("#").lstrip("test_"): next(hidden_test_counter) - for test in question.data["unittests"].keys() + for test in question.data["unittests"]["tests"].keys() if test.startswith("#") } # Compose runner code - unit_code = _make_unit_code(question.data["unittests"]) + unit_code = _make_unit_code(question.data["unittests"]["tests"]) user_code = _make_user_code(form_response.response[question.id]) code = TEST_TEMPLATE.replace("### USER CODE", user_code) @@ -119,6 +133,7 @@ async def execute_unittest(form_response: FormResponse, form: Form) -> list[Unit unittest_results.append(UnittestResult( question_id=question.id, + question_index=index, return_code=return_code, passed=passed, result=result |