import base64 import unittest from io import BytesIO from PIL import Image def _tiny_png_b64() -> str: image = Image.new("RGB", (1, 1), (255, 128, 0)) buf = BytesIO() image.save(buf, format="PNG") return base64.b64encode(buf.getvalue()).decode("ascii") class ApiBridgeTest(unittest.TestCase): def test_decode_payload_returns_frontend_culture_decode_shape(self): from api_bridge import decode_payload_to_culture_decode captured = {} def fake_run_decode(image): captured["size"] = image.size return "raw model text" def fake_parse_sections(raw): assert raw == "raw model text" return { "title": "Test Shrine", "location": "Kyoto, Japan", "category": "Architecture / Religion", "flag": "JP", "features": ["gate", "path", "shrine", "vermilion"], "tourists": "A red gate path.", "locals": "A local meaning.", "avoid_bullets": ["Do not block.", "Do not climb.", "Ask first."], "matters": "It matters culturally.", } def fake_sections_to_decode(sections, uploaded_b64=None): assert uploaded_b64 == _tiny_png_b64() return { "id": "abc123", "title": sections["title"], "location": sections["location"], "category": sections["category"], "flag": sections["flag"], "_uploaded_b64": uploaded_b64, "scan": { "subject": sections["tourists"], "features": sections["features"], "contextPrompt": "A traveler is looking at Test Shrine.", }, "layers": { "l1": {"key": "l1", "title": "What tourists see", "label": "L1", "tone": "Objective", "text": sections["tourists"], "priority": "standard"}, "l2": {"key": "l2", "title": "What locals know", "label": "L2", "tone": "Revealing", "text": sections["locals"], "priority": "highlight"}, "l3": {"key": "l3", "title": "What not to do", "label": "L3", "tone": "Protective", "bullets": sections["avoid_bullets"], "priority": "standard"}, "l4": {"key": "l4", "title": "Why it matters", "label": "L4", "tone": "Cultural depth", "text": sections["matters"], "priority": "highlight"}, }, } result = decode_payload_to_culture_decode( {"image": _tiny_png_b64(), "mime": "image/png"}, run_decode=fake_run_decode, parse_sections=fake_parse_sections, sections_to_decode=fake_sections_to_decode, ) self.assertEqual(captured["size"], (1, 1)) self.assertEqual(result["id"], "abc123") self.assertTrue(result["image"].startswith("data:image/png;base64,")) self.assertNotIn("_uploaded_b64", result) self.assertEqual(result["layers"]["l3"]["bullets"], ["Do not block.", "Do not climb.", "Ask first."]) if __name__ == "__main__": unittest.main()