import json import hashlib from io import BytesIO import subprocess import sys import tempfile import unittest from pathlib import Path from zipfile import ZipFile from PIL import Image ROOT = Path(__file__).resolve().parents[1] class BundleTests(unittest.TestCase): def test_public_allowlist_and_ui_lock(self): with tempfile.TemporaryDirectory() as temp: target = Path(temp) / "space.zip" subprocess.run([sys.executable, str(ROOT / "scripts/build_bundle.py"), str(target)], check=True, capture_output=True) with ZipFile(target) as archive: names = archive.namelist() self.assertIn("space_app.py", names) self.assertIn("assets/NotoSansCJKsc-Regular.otf", names) self.assertIn("assets/NotoSansCJK-OFL.txt", names) self.assertIn("docs/HF_SPACE_DEPLOYMENT.md", names) self.assertFalse(any(n.startswith(("verification/", "logs/", ".runtime/", "deploy/")) for n in names)) self.assertNotIn("docs/FUYAO_REPRODUCTION.md", names) self.assertNotIn("scripts/service.py", names) rows = json.loads(archive.read("data/cases.json")) self.assertEqual(len(rows), 22) self.assertTrue(all("artifact_image_sha256" in row for row in rows)) self.assertEqual(len({row["route"] for row in rows}), 9) for row in rows: image_bytes = archive.read(row["image"]) self.assertEqual(hashlib.sha256(image_bytes).hexdigest(), row["image_sha256"]) self.assertEqual(row["artifact_image_sha256"], row["image_sha256"]) with Image.open(BytesIO(image_bytes)) as image: self.assertEqual(list(image.size), row["image_size"]) if not row["expected_available"]: self.assertEqual(row["expected"], "") payload = archive.read("data/cases.json").decode() for marker in ["/dataset-", "/workspace/", "xiaopeng.com", "source_jsonl", "source_line"]: self.assertNotIn(marker, payload) archive.extractall(Path(temp) / "unpacked") subprocess.run([sys.executable, "scripts/verify_ui.py"], cwd=Path(temp) / "unpacked", check=True, capture_output=True) if __name__ == "__main__": unittest.main()