Browse Source

test(ads): add unit tests for JSON extraction and LLM fallback functions

master
PouyaKhajavi 1 day ago
parent
commit
b5982c498f
  1. 49
      backend/ads/tests.py

49
backend/ads/tests.py

@ -102,3 +102,52 @@ class AdEvaluationAPITests(APITestCase):
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
self.assertFalse(AdEvaluation.objects.filter(id=self.eval1.id).exists()) self.assertFalse(AdEvaluation.objects.filter(id=self.eval1.id).exists())
from unittest.mock import MagicMock
from ads.tasks import extract_and_parse_json, call_llm_with_structured_fallback, AdEvaluationResult
class AdTasksHelperTests(APITestCase):
def test_extract_and_parse_json_raw(self):
raw = '{"is_flagged": true, "reason": "مناسب است", "confidence": 0.9}'
res = extract_and_parse_json(raw)
self.assertTrue(res['is_flagged'])
self.assertEqual(res['reason'], 'مناسب است')
def test_extract_and_parse_json_markdown_fence(self):
raw = '```json\n{\n "is_flagged": false,\n "reason": "نامناسب",\n "confidence": 0.2\n}\n```'
res = extract_and_parse_json(raw)
self.assertFalse(res['is_flagged'])
def test_extract_and_parse_json_with_preamble(self):
raw = 'Here is the response:\n```json\n{"is_flagged": true, "reason": "خوب", "confidence": 0.8}\n```\nHope this helps!'
res = extract_and_parse_json(raw)
self.assertTrue(res['is_flagged'])
def test_call_llm_fallback_on_markdown(self):
mock_client = MagicMock()
# beta parse raises exception (simulating markdown parse failure)
mock_client.beta.chat.completions.parse.side_effect = Exception("Invalid JSON markdown")
# standard completion returns markdown
mock_message = MagicMock()
mock_message.content = '```json\n{"is_flagged": true, "reason": "پرچم گذاری شد", "confidence": 0.95}\n```'
mock_choice = MagicMock()
mock_choice.message = mock_message
mock_completion = MagicMock()
mock_completion.choices = [mock_choice]
mock_client.chat.completions.create.return_value = mock_completion
res = call_llm_with_structured_fallback(
client=mock_client,
model_name="openrouter/free",
system_instruction="sys",
user_content="user",
pydantic_cls=AdEvaluationResult,
max_tokens=2500,
timeout=35
)
self.assertTrue(res.is_flagged)
self.assertEqual(res.reason, "پرچم گذاری شد")
self.assertEqual(res.confidence, 0.95)
Loading…
Cancel
Save