aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/api/test_eval.py39
-rw-r--r--tests/test_integration.py30
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():