"""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)