from types import SimpleNamespace from services.seo_audit import evaluate def _snapshot(facts=8, faqs=3, media=3): return { "place": {"name": "테스트", "road_address": "서울 강남구", "phone": "02-123-4567", "latitude": "37.1", "longitude": "127.1"}, "facts": [{"key": f"k{i}", "value": "값", "source_url": "https://source.test"} for i in range(facts)], "faqs": [{"question": f"질문{i}", "answer": "답"} for i in range(faqs)], "media": [{"alt_text": f"사진{i}"} for i in range(media)], } def test_complete_site_scores_full_marks(): report = evaluate( _snapshot(), verified=True, site=SimpleNamespace(domain="test-place"), version=SimpleNamespace(built_at="now", unique_content_count=4), ) assert report["seo_score"] == 100 assert report["aeo_score"] == 100 assert report["overall_score"] == 100 def test_empty_site_returns_actionable_failures(): report = evaluate({"place": {}, "facts": [], "faqs": [], "media": []}, verified=False) assert report["seo_score"] < 30 assert report["aeo_score"] < 30 assert any(c["status"] == "fail" and c["recommendation"] for c in report["checks"]) async def test_audit_api_is_company_scoped(auth_headers, client, other_company_id): h1 = await auth_headers("audit-owner") pid = (await client.post("/v1/place", headers=h1, json={"name": "진단가게", "category": 2})).json()["place"]["place_id"] own = (await client.get(f"/v1/place/{pid}/site/audit", headers=h1)).json() assert own["result"]["success"] is True assert 0 <= own["seo_score"] <= 100 assert 0 <= own["aeo_score"] <= 100 assert own["checks"] h2 = await auth_headers("audit-other", other_company_id) denied = (await client.get(f"/v1/place/{pid}/site/audit", headers=h2)).json() assert denied["result"]["success"] is False