diff --git a/django/api/tests/test_documento_api.py b/django/api/tests/test_documento_api.py index 89250ba..14208c6 100644 --- a/django/api/tests/test_documento_api.py +++ b/django/api/tests/test_documento_api.py @@ -1,5 +1,3 @@ -import json - from django.test import TestCase from api.models import Documento, Etiqueta @@ -257,11 +255,9 @@ def test_pesquisa_documentos_retorna_os_cinco_trechos_mais_proximos(self): 'api.views.documento_api.VectorService.buscar_contexto', return_value=resultados, ) as buscar_contexto: - response = self.client.generic( - 'GET', + response = self.client.get( '/api/documentos/', - data=json.dumps({'contexto': ' Segurança de Redes '}), - content_type='application/json', + {'contexto': ' Segurança de Redes '}, ) self.assertEqual(response.status_code, 200) @@ -270,16 +266,19 @@ def test_pesquisa_documentos_retorna_os_cinco_trechos_mais_proximos(self): self.assertEqual(resposta[0]['id_documento'], self.documento.id_documento) buscar_contexto.assert_called_once_with('segurança de redes', limite=5) - def test_pesquisa_documentos_rejeita_contexto_vazio(self): - response = self.client.generic( - 'GET', - '/api/documentos/', - data=json.dumps({'contexto': ' '}), - content_type='application/json', - ) + def test_pesquisa_documentos_ignora_contexto_vazio(self): + from unittest.mock import patch - self.assertEqual(response.status_code, 400) - self.assertIn('contexto', response.json()['erro']) + with patch( + 'api.views.documento_api.VectorService.buscar_contexto' + ) as buscar_contexto: + response = self.client.get( + '/api/documentos/', + {'contexto': ' '}, + ) + + self.assertEqual(response.status_code, 200) + buscar_contexto.assert_not_called() def test_cria_documento_chunk_com_embedding_valido(self): from api.models import DocumentoChunk diff --git a/django/api/views/documento_api.py b/django/api/views/documento_api.py index d666c35..a4dbc26 100644 --- a/django/api/views/documento_api.py +++ b/django/api/views/documento_api.py @@ -67,8 +67,8 @@ def perform_create(self, serializer): ) # ======================================================== - # GET /api/documentos/?nome={nome}&etiquetas={etiquetas}&page={numero da pagina} - # Busca semântica opcional: contexto no body JSON + # GET /api/documentos/?nome={nome}&etiquetas={etiquetas}&contexto={contexto}&page={numero da pagina} + # Busca por nome, etiquetas ou contexto # ======================================================== @extend_schema( parameters=[ @@ -86,6 +86,13 @@ def perform_create(self, serializer): description="Filtra documentos pelas etiquetas (separadas por espaço).", required=False, ), + OpenApiParameter( + name="contexto", + type=OpenApiTypes.STR, + location=OpenApiParameter.QUERY, + description="Busca documentos pelo contexto semântico.", + required=False, + ), OpenApiParameter( name="page", type=OpenApiTypes.INT, @@ -95,17 +102,6 @@ def perform_create(self, serializer): default=1, ), ], - request={ - "application/json": { - "type": "object", - "properties": { - "contexto": { - "type": "string", - "description": "Contexto usado para buscar os cinco trechos mais próximos.", - }, - }, - }, - }, responses={ 200: OpenApiResponse(description="Lista paginada de documentos."), 400: OpenApiResponse(description="Número de página inválido."), @@ -113,22 +109,19 @@ def perform_create(self, serializer): }, ) def list(self, request, *args, **kwargs): - contexto = request.data.get("contexto") + contexto = request.query_params.get("contexto") ids_documentos_contexto = None - if contexto is not None: - if not isinstance(contexto, str) or not contexto.strip(): - return Response( - {"erro": "O campo contexto é obrigatório e não pode ser vazio."}, - status=status.HTTP_400_BAD_REQUEST, - ) + if contexto: + contexto = contexto.strip() - chunks = VectorService.buscar_contexto( - contexto.strip().lower(), - limite=5, - ) - ids_documentos_contexto = list( - dict.fromkeys(chunk["id_documento_id"] for chunk in chunks) - ) + if contexto: + chunks = VectorService.buscar_contexto( + contexto.lower(), + limite=5, + ) + ids_documentos_contexto = list( + dict.fromkeys(chunk["id_documento_id"] for chunk in chunks) + ) nome = request.query_params.get("nome") etiquetas = request.query_params.get("etiquetas")