Files
xas-test-library/tests/test_test_catalog.py
T

104 lines
5.9 KiB
Python

"""A test entry represents behavior, not every source file under a directory."""
from pathlib import Path
import tempfile
import unittest
from fastapi.testclient import TestClient
from console.app import create_app
from console.settings import Settings
from console.store import Store
class TestCatalogTests(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory()
root = Path(self.temp.name)
self.source = root / "scripts"
self.source.mkdir()
(self.source / "run-suite.sh").write_text("python3 helper.py\n")
(self.source / "helper.py").write_text("print('helper')\n")
(self.source / "tests").mkdir()
(self.source / "tests/test_internal.py").write_text("assert True\n")
self.settings = Settings(root / "runtime", [{"id": "suite", "path": str(self.source)}],
allowed_hosts=["testserver"], allowed_networks=["127.0.0.0/8"])
self.settings.test_definitions = [{"key": "suite", "source_group": "suite", "entry": "run-suite.sh",
"name": "模型综合测试", "description": "一轮完整验证", "kind": "suite",
"members": [{"source_group": "suite", "pattern": "**/*"}]}]
self.client = TestClient(create_app(self.settings), client=("127.0.0.1", 5555))
self.headers = {"X-XAS-Console": "1"}
self.client.post("/api/discover", headers=self.headers)
self.store = Store(self.settings)
def tearDown(self):
self.client.close()
self.temp.cleanup()
def test_suite_is_one_item_with_readonly_members_not_three_cards(self):
items = self.client.get("/api/scripts").json()["items"]
self.assertEqual(len(items), 1)
self.assertEqual(items[0]["name"], "模型综合测试")
self.assertEqual(items[0]["test_kind"], "suite")
self.assertEqual(items[0]["file_count"], 3)
files = self.client.get(f"/api/scripts/{items[0]['id']}/files").json()["items"]
self.assertEqual(len(files), 3)
self.assertEqual(sum(f["role"] == "entry" for f in files), 1)
summary = self.client.get("/api/summary").json()
self.assertEqual(summary["scripts"], 1)
self.assertEqual(summary["source_files"], 3)
def test_refresh_does_not_promote_new_support_file_or_clear_configuration(self):
entry = next(s for s in self.store.scripts() if s["source_path"].endswith("run-suite.sh"))
self.client.patch(f"/api/scripts/{entry['id']}", json={"name": "我的综合测试"}, headers=self.headers)
(self.source / "new_module.py").write_text("pass\n")
self.client.post("/api/discover", headers=self.headers)
items = self.client.get("/api/scripts").json()["items"]
self.assertEqual(len(items), 1)
self.assertEqual(items[0]["name"], "我的综合测试")
self.assertEqual(items[0]["file_count"], 4)
def test_member_cannot_be_enabled_or_run_by_direct_api(self):
helper = next(s for s in self.store.scripts() if s["source_path"].endswith("helper.py"))
self.assertFalse(self.client.get(f"/api/scripts/{helper['id']}").json()["is_test"])
enabled = self.client.patch(f"/api/scripts/{helper['id']}", json={"enabled": True}, headers=self.headers)
self.assertEqual(enabled.status_code, 400)
# Even a pre-existing enabled inventory record cannot bypass the entry boundary.
helper.update(enabled=True, status="ready")
self.store.save_script(helper)
run = self.client.post(f"/api/scripts/{helper['id']}/runs",
json={"request_id": "caa3943d-6872-472c-86c2-500000000001"}, headers=self.headers)
self.assertEqual(run.status_code, 400)
self.assertEqual(self.store.runs(), [])
def test_upload_remains_one_test_and_examples_are_opt_in(self):
uploaded = self.client.post("/api/scripts/upload", headers=self.headers,
files={"file": ("test.py", b"print('custom')\n")}, data={"name": "用户测试"}).json()
example = self.client.post("/api/scripts/upload", headers=self.headers,
files={"file": ("demo.py", b"print('demo')\n")}, data={"name": "演示"}).json()
item = self.store.script(example["id"])
item["synthetic"] = True
self.store.save_script(item)
regular = self.client.get("/api/scripts").json()["items"]
self.assertEqual({s["name"] for s in regular}, {"模型综合测试", "用户测试"})
all_items = self.client.get("/api/scripts?include_examples=true").json()["items"]
self.assertEqual(len(all_items), 3)
self.assertTrue(next(s for s in all_items if s["id"] == uploaded["id"])["is_test"])
def test_historical_runs_keep_ids_and_source_contents_unchanged(self):
entry = next(s for s in self.store.scripts() if s["source_path"].endswith("run-suite.sh"))
historical = self.store.queue(entry, "past-request", "127.0.0.1")
before = (self.source / "run-suite.sh").read_bytes()
self.client.get("/api/scripts")
self.client.post("/api/discover", headers=self.headers)
self.assertEqual(self.store.run(historical["id"])["script_name"], "run-suite.sh")
self.assertEqual(self.store.run(historical["id"])["script_id"], entry["id"])
self.assertEqual(before, (self.source / "run-suite.sh").read_bytes())
def test_new_run_uses_one_entry_and_the_test_name(self):
entry = self.client.get("/api/scripts").json()["items"][0]
response = self.client.patch(f"/api/scripts/{entry['id']}", json={"enabled": True}, headers=self.headers)
self.assertEqual(response.status_code, 200)
run = self.client.post(f"/api/scripts/{entry['id']}/runs", headers=self.headers,
json={"request_id": "caa3943d-6872-472c-86c2-500000000002"}).json()
self.assertEqual(run["script_name"], "模型综合测试")
self.assertEqual(run["source_path"], str(self.source / "run-suite.sh"))
self.assertEqual(len(self.store.runs()), 1)