diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/api/test_eval.py | 39 | ||||
-rw-r--r-- | tests/test_integration.py | 30 |
2 files changed, 66 insertions, 3 deletions
diff --git a/tests/api/test_eval.py b/tests/api/test_eval.py index 37f90e7..44bd22b 100644 --- a/tests/api/test_eval.py +++ b/tests/api/test_eval.py @@ -1,5 +1,10 @@ +from unittest.mock import patch + from tests.api import SnekAPITestCase +from scripts.python_version import VERSION_DISPLAY_NAMES, Version +from snekbox.api.resources import eval + class TestEvalResource(SnekAPITestCase): PATH = "/eval" @@ -33,8 +38,16 @@ class TestEvalResource(SnekAPITestCase): self.assertEqual(expected, result.json) def test_post_invalid_data_400(self): - bodies = ({"args": 400}, {"args": [], "files": [215]}) - expects = ["400 is not of type 'array'", "215 is not of type 'object'"] + bodies = ( + {"args": 400}, + {"args": [], "files": [215]}, + {"input": "", "version": "random-gibberish"}, + ) + expects = [ + "400 is not of type 'array'", + "215 is not of type 'object'", + f"'random-gibberish' is not one of {VERSION_DISPLAY_NAMES}", + ] for body, expected in zip(bodies, expects): with self.subTest(): result = self.simulate_post(self.PATH, json=body) @@ -121,6 +134,28 @@ class TestEvalResource(SnekAPITestCase): self.assertEqual("Request data failed validation", result.json["title"]) self.assertIn("does not match", result.json["description"]) + def test_version_selection(self): + """A version argument in body properly configures the eval version.""" + # Configure ALL_VERSIONS to a well-known state to test the function regardless + # of version configuration + display_name = "Fake test name" + versions = [ + Version("tag1", "3.9", "pypy 3.9", False), + Version("tag2", "3.10", display_name, False), + Version("tag3", "3.11", "CPython 3.11", True), + ] + display_names = [version.display_name for version in versions] + + with ( + patch.object(eval, "ALL_VERSIONS", versions), + patch.object(eval, "VERSION_DISPLAY_NAMES", display_names), + patch.dict(eval.EvalResource.REQ_SCHEMA["properties"], version={"enum": display_names}), + ): + body = {"input": "", "version": display_name} + result = self.simulate_post(self.PATH, json=body) + self.assertEqual(result.status_code, 200) + self.assertEqual(result.json["version"], display_name) + def test_post_invalid_content_type_415(self): body = "{'input': 'foo'}" headers = {"Content-Type": "application/xml"} diff --git a/tests/test_integration.py b/tests/test_integration.py index aa21a2d..4a6e811 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -7,7 +7,7 @@ from textwrap import dedent from tests.gunicorn_utils import run_gunicorn -from scripts.python_version import MAIN_VERSION +from scripts.python_version import ALL_VERSIONS, MAIN_VERSION def b64encode_code(data: str): @@ -67,6 +67,34 @@ class IntegrationTests(unittest.TestCase): self.assertEqual(status, 200) self.assertEqual(json.loads(response)["stdout"], expected) + def test_eval_version(self): + """Test eval requests with specific python versions selected.""" + selected = None + for version in ALL_VERSIONS: + if not version.is_main: + selected = version + break + + if selected is None: + # Ideally we'd test with some non-main version to ensure the logic is correct + # but we're likely running under a configuration where a main version doesn't exist + # so we just make the best of it + selected = MAIN_VERSION + + with run_gunicorn(): + response, status = snekbox_request( + { + "input": "import sys; print(sys.version)", + "version": selected.display_name, + } + ) + parsed = json.loads(response) + + self.assertEqual(status, 200) + self.assertEqual(parsed["returncode"], 0) + self.assertEqual(parsed["version"], selected.display_name) + self.assertIn(selected.version_name, parsed["stdout"]) + def test_files_send_receive(self): """Test sending and receiving files to snekbox.""" with run_gunicorn(): |