mirror of
https://github.com/NomaDamas/k-skill.git
synced 2026-06-24 02:04:11 +00:00
Move direct API calls out of the skill Python scripts and into shared proxy routes so end-users no longer need their own DATA_GO_KR_API_KEY for MFDS surfaces. Adds mfds.js helper, proxy tests, and updates all docs and setup guidance to reflect the hosted proxy workflow. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
94 lines
4.3 KiB
Python
94 lines
4.3 KiB
Python
import unittest
|
|
|
|
from scripts.mfds_drug_safety import (
|
|
build_drug_interview,
|
|
lookup_drugs,
|
|
normalize_easy_drug_item,
|
|
normalize_safe_stad_item,
|
|
resolve_proxy_base_url,
|
|
)
|
|
|
|
|
|
class DrugInterviewTest(unittest.TestCase):
|
|
def test_build_drug_interview_requires_followup_questions_and_red_flags(self):
|
|
interview = build_drug_interview(
|
|
question="타이레놀이랑 판콜 같이 먹어도 되나요?",
|
|
symptoms="두드러기와 어지러움",
|
|
)
|
|
|
|
self.assertEqual(interview["domain"], "drug")
|
|
self.assertIn("누가 복용하려는지", interview["must_ask"][0])
|
|
self.assertTrue(any("얼마나" in item for item in interview["must_ask"]))
|
|
self.assertTrue(any("복용 중인 약" in item for item in interview["must_ask"]))
|
|
self.assertTrue(any("알레르기" in item for item in interview["must_ask"]))
|
|
self.assertTrue(any("호흡곤란" in item for item in interview["red_flags"]))
|
|
self.assertTrue(any("의식" in item for item in interview["red_flags"]))
|
|
self.assertIn("즉시 119", interview["urgent_action"])
|
|
|
|
|
|
class DrugNormalizationTest(unittest.TestCase):
|
|
def test_normalize_easy_drug_item_extracts_public_safety_summary(self):
|
|
item = normalize_easy_drug_item(
|
|
{
|
|
"item_name": "타이레놀정160밀리그램",
|
|
"company_name": "한국얀센",
|
|
"efficacy": "감기로 인한 발열 및 동통에 사용합니다.",
|
|
"how_to_use": "만 12세 이상은 필요시 복용합니다.",
|
|
"warnings": "매일 세 잔 이상 술을 마시는 사람은 전문가와 상의하십시오.",
|
|
"cautions": "간질환 환자는 주의하십시오.",
|
|
"interactions": "다른 해열진통제와 함께 복용하지 마십시오.",
|
|
"side_effects": "발진, 구역이 나타날 수 있습니다.",
|
|
"storage": "실온 보관하십시오.",
|
|
}
|
|
)
|
|
|
|
self.assertEqual(item["source"], "drug_easy_info")
|
|
self.assertEqual(item["item_name"], "타이레놀정160밀리그램")
|
|
self.assertEqual(item["company_name"], "한국얀센")
|
|
self.assertIn("발열", item["efficacy"])
|
|
self.assertIn("해열진통제", item["interactions"])
|
|
self.assertIn("실온", item["storage"])
|
|
|
|
def test_normalize_safe_stad_item_extracts_store_medicine_fields(self):
|
|
item = normalize_safe_stad_item(
|
|
{
|
|
"item_name": "어린이타이레놀현탁액",
|
|
"company_name": "한국존슨앤드존슨판매(유)",
|
|
"efficacy": "해열 및 진통",
|
|
"how_to_use": "용법에 따라 복용",
|
|
"warnings": "과량복용 주의",
|
|
"interactions": "다른 아세트아미노펜 제제와 병용 주의",
|
|
"side_effects": "드물게 발진",
|
|
}
|
|
)
|
|
|
|
self.assertEqual(item["source"], "safe_standby_medicine")
|
|
self.assertEqual(item["item_name"], "어린이타이레놀현탁액")
|
|
self.assertIn("아세트아미노펜", item["interactions"])
|
|
|
|
|
|
class ProxyResolutionTest(unittest.TestCase):
|
|
def test_resolve_proxy_base_url_defaults_to_hosted_proxy(self):
|
|
self.assertEqual(resolve_proxy_base_url(None, env={}), "https://k-skill-proxy.nomadamas.org")
|
|
self.assertEqual(resolve_proxy_base_url(None, env={"KSKILL_PROXY_BASE_URL": "https://proxy.example.com/"}), "https://proxy.example.com")
|
|
with self.assertRaisesRegex(ValueError, "KSKILL_PROXY_BASE_URL"):
|
|
resolve_proxy_base_url(None, env={"KSKILL_PROXY_BASE_URL": "off"})
|
|
|
|
def test_lookup_drugs_uses_proxy_route(self):
|
|
captured = {}
|
|
|
|
def fake_request_json(request):
|
|
captured["url"] = request.full_url
|
|
return {"items": []}
|
|
|
|
payload = lookup_drugs(["타이레놀", "판콜"], limit=3, base_url="https://proxy.example.com", request_json=fake_request_json)
|
|
|
|
self.assertEqual(payload, {"items": []})
|
|
self.assertIn("https://proxy.example.com/v1/mfds/drug-safety/lookup", captured["url"])
|
|
self.assertIn("itemName=%ED%83%80%EC%9D%B4%EB%A0%88%EB%86%80", captured["url"])
|
|
self.assertIn("itemName=%ED%8C%90%EC%BD%9C", captured["url"])
|
|
self.assertIn("limit=3", captured["url"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|