diff --git a/aaq/serializers.py b/aaq/serializers.py index ce9c9d7c..2406188f 100644 --- a/aaq/serializers.py +++ b/aaq/serializers.py @@ -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) diff --git a/aaq/tests/test_views.py b/aaq/tests/test_views.py index fba6d094..cdb8eb9b 100644 --- a/aaq/tests/test_views.py +++ b/aaq/tests/test_views.py @@ -358,6 +358,12 @@ 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", @@ -365,35 +371,61 @@ def test_search(self): 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 @@ -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."]} diff --git a/aaq/urls.py b/aaq/urls.py index 8dac10b6..5aeb2af7 100644 --- a/aaq/urls.py +++ b/aaq/urls.py @@ -40,7 +40,7 @@ ), re_path( r"^api/v2/check-urgency", - views.check_urgency_v2, + views.search, name="aaq-check-urgency-v2", ), ] diff --git a/aaq/views.py b/aaq/views.py index a617c84b..379acf3d 100644 --- a/aaq/views.py +++ b/aaq/views.py @@ -15,7 +15,6 @@ ResponseFeedbackSerializer, SearchSerializer, UrgencyCheckSerializer, - UrgencyCheckV2Serializer, ) from .tasks import send_feedback_task, send_feedback_task_v2 @@ -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"] @@ -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)