Skip to content

Commit

Permalink
aaq urgency check endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
Hlamallama committed Aug 7, 2024
1 parent ee5474e commit a68a93d
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 130 deletions.
4 changes: 0 additions & 4 deletions aaq/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,3 @@ class ContentFeedbackSerializer(serializers.Serializer):
feedback_text = serializers.CharField(required=False)
query_id = serializers.IntegerField(required=True)
content_id = serializers.IntegerField(required=True)


class UrgencyCheckV2Serializer(serializers.Serializer):
message_text = serializers.CharField(required=True)
143 changes: 44 additions & 99 deletions aaq/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,42 +358,74 @@ def test_search(self):
user = get_user_model().objects.create_user("test")
self.client.force_authenticate(user)
fakeAaqApi = FakeAaqApi()

search_payload = {
"generate_llm_response": False,
"query_metadata": {"some_key": "query_metadata"},
"query_text": "Breastfeeding",
}
responses.add_callback(
responses.POST,
"http://aaq_v2/search",
callback=fakeAaqApi.post_search,
content_type="application/json",
)

payload = json.dumps(
{
"generate_llm_response": False,
"query_metadata": {"some_key": "query_metadata"},
"query_text": "Breastfeeding",
}
fakeAaqUdV2Api = FakeAaqUdV2Api()
responses.add_callback(
responses.POST,
"http://aaq_v2/urgency-check-v2",
callback=fakeAaqUdV2Api.post_urgency_detect_return_true,
content_type="application/json",
)

search_payload = {
"query_text": "Test query",
"generate_llm_response": True,
"query_metadata": {"key": "value"},
}

urgency_check_payload = {
"message_text": "Test query",
}

response = self.client.post(
self.url, data=payload, content_type="application/json"
self.url, data=json.dumps(search_payload), content_type="application/json"
)
[request] = responses.calls

search_request = responses.calls[0]
urgency_check_request = responses.calls[1]

self.assertEqual(response.status_code, 200)
self.assertIn("message", response.data)
self.assertIn("body", response.data)
self.assertIn("query_id", response.data)
self.assertIn("feedback_secret_key", response.data)
self.assertEqual(json.loads(request.request.body), json.loads(payload))

self.assertIn("details", response.data)
self.assertIn("is_urgent", response.data)
self.assertIn("matched_rules", response.data)
self.assertEqual(json.loads(search_request.request.body), search_payload)
self.assertEqual(
json.loads(urgency_check_request.request.body), urgency_check_payload
)
assert response.json() == {
"message": "*0* - Example content title\n*1* -"
" Another example content title",
"message": "*0* - Example content title\n"
"*1* - Another example content title",
"body": {
"0": {"text": "Example content text", "id": 23},
"1": {"text": "Another example content text", "id": 12},
},
"feedback_secret_key": "secret-key-12345-abcde",
"query_id": 1,
"details": {
"0": {"distance": 0.1, "urgency_rule": "Blurry vision and dizziness"},
"1": {"distance": 0.2, "urgency_rule": "Nausea that lasts for 3 days"},
},
"is_urgent": True,
"matched_rules": [
"Blurry vision and dizziness",
"Nausea that lasts for 3 days",
],
}

@responses.activate
Expand Down Expand Up @@ -529,90 +561,3 @@ def test_response_feedback_invalid_feedback_text_view(self):
assert response.json() == {
"feedback_sentiment": ['"test" is not a valid choice.']
}


class CheckUrgencyV2ViewTests(APITestCase):
url = reverse("aaq-check-urgency-v2")

@responses.activate
def test_urgency_check_urgent(self):
"""
Test that we can get is_urgent True
"""
user = get_user_model().objects.create_user("test")
self.client.force_authenticate(user)
fakeAaqUdV2Api = FakeAaqUdV2Api()
responses.add_callback(
responses.POST,
"http://aaq_v2/urgency-check-v2",
callback=fakeAaqUdV2Api.post_urgency_detect_return_true,
content_type="application/json",
)

payload = json.dumps({"message_text": "I am pregnant and out of breath"})

response = self.client.post(
self.url, data=payload, content_type="application/json"
)
[request] = responses.calls

assert response.status_code == 200
assert response.json() == {
"details": {
"0": {"distance": 0.1, "urgency_rule": "Blurry vision and dizziness"},
"1": {"distance": 0.2, "urgency_rule": "Nausea that lasts for 3 days"},
},
"is_urgent": True,
"matched_rules": [
"Blurry vision and dizziness",
"Nausea that lasts for 3 days",
],
}
self.assertEqual(json.loads(request.request.body), json.loads(payload))

@responses.activate
def test_urgency_check_not_urgent(self):
"""
Test that we can get is_urgent False
"""
user = get_user_model().objects.create_user("test")
self.client.force_authenticate(user)
fakeAaqUdV2Api = FakeAaqUdV2Api()
responses.add_callback(
responses.POST,
"http://aaq_v2/urgency-check-v2",
callback=fakeAaqUdV2Api.post_urgency_detect_return_false,
content_type="application/json",
)

payload = json.dumps({"message_text": "I am fine"})

response = self.client.post(
self.url, data=payload, content_type="application/json"
)

assert response.status_code == 200
assert response.json() == {
"details": {
"0": {"distance": 0.1, "urgency_rule": "Baby okay"},
"1": {"distance": 0.2, "urgency_rule": "Baby healthy"},
},
"is_urgent": False,
"matched_rules": ["Baby okay", "Baby healthy"],
}

@responses.activate
def test_urgency_check_invalid(self):
"""
Test that we can get a field required message
"""
user = get_user_model().objects.create_user("test")
self.client.force_authenticate(user)
payload = json.dumps({})

response = self.client.post(
self.url, data=payload, content_type="application/json"
)

assert response.status_code == 400
assert response.json() == {"message_text": ["This field is required."]}
2 changes: 1 addition & 1 deletion aaq/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
),
re_path(
r"^api/v2/check-urgency",
views.check_urgency_v2,
views.search,
name="aaq-check-urgency-v2",
),
]
54 changes: 28 additions & 26 deletions aaq/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
ResponseFeedbackSerializer,
SearchSerializer,
UrgencyCheckSerializer,
UrgencyCheckV2Serializer,
)

from .tasks import send_feedback_task, send_feedback_task_v2
Expand Down Expand Up @@ -174,21 +173,27 @@ def response_feedback(request, *args, **kwargs):
def search(request, *args, **kwargs):
serializer = SearchSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
query_text = serializer.validated_data["query_text"]
generate_llm_response = serializer.validated_data["generate_llm_response"]
query_metadata = serializer.validated_data["query_metadata"]
url = urllib.parse.urljoin(settings.AAQ_V2_API_URL, "search")
payload = {
"query_text": query_text,
"generate_llm_response": generate_llm_response,
"query_metadata": query_metadata,

search_payload = {
"query_text": serializer.validated_data["query_text"],
}
search_url = urllib.parse.urljoin(settings.AAQ_V2_API_URL, "/search")

if "generate_llm_response" in serializer.validated_data:
search_payload["generate_llm_response"] = serializer.validated_data[
"generate_llm_response"
]
if "query_metadata" in serializer.validated_data:
search_payload["query_metadata"] = serializer.validated_data["query_metadata"]

headers = {
"Authorization": settings.AAQ_V2_AUTH,
"Content-Type": "application/json",
}

response = requests.request("POST", url, json=payload, headers=headers)
response = requests.request(
"POST", search_url, json=search_payload, headers=headers
)

query_id = response.json()["query_id"]
feedback_secret_key = response.json()["feedback_secret_key"]
Expand All @@ -215,29 +220,26 @@ def search(request, *args, **kwargs):
body_content[key] = {"text": text, "id": id}
message_titles.append(f"*{key}* - {title}")

json_msg = {
search_results = {
"message": "\n".join(message_titles),
"body": body_content,
"feedback_secret_key": feedback_secret_key,
"query_id": query_id,
}

return Response(json_msg, status=status.HTTP_200_OK)
urgency_check_payload = {
"message_text": serializer.validated_data["query_text"],
}

urgency_check_url = urllib.parse.urljoin(
settings.AAQ_V2_API_URL, "/urgency-check-v2"
)

@api_view(("POST",))
@renderer_classes((JSONRenderer,))
def check_urgency_v2(request, *args, **kwargs):
serializer = UrgencyCheckV2Serializer(data=request.data)
serializer.is_valid(raise_exception=True)
message_text = {}
message_text["message_text"] = serializer.validated_data["message_text"]
url = urllib.parse.urljoin(settings.AAQ_V2_API_URL, "/urgency-check-v2")
headers = {
"Authorization": settings.AAQ_V2_API_URL,
"Content-Type": "application/json",
}
response = requests.request(
"POST", urgency_check_url, json=urgency_check_payload, headers=headers
)
check_urgency_results = response.json()

response = requests.request("POST", url, json=message_text, headers=headers)
search_results.update(check_urgency_results)

return Response(response.json(), status=status.HTTP_200_OK)
return Response(search_results, status=status.HTTP_200_OK)

0 comments on commit a68a93d

Please sign in to comment.