diff --git a/src/backend/core/schemas.py b/src/backend/core/schemas.py index 1db6d1a..b1fb852 100644 --- a/src/backend/core/schemas.py +++ b/src/backend/core/schemas.py @@ -23,11 +23,11 @@ class DocumentSchema(BaseModel): """Schema for validating the documents submitted to our API for indexing""" id: UUID4 - title: Annotated[str, Field(max_length=300)] + title: Annotated[str, Field(max_length=300, min_length=0)] depth: Annotated[int, Field(ge=0)] path: Annotated[str, Field(max_length=300)] numchild: Annotated[int, Field(ge=0)] - content: str + content: Annotated[str, Field(min_length=0)] created_at: AwareDatetime updated_at: AwareDatetime size: Annotated[int, Field(ge=0, le=100 * 1024**3)] # File size limited to 100GB @@ -56,6 +56,12 @@ class DocumentSchema(BaseModel): raise ValueError(f"{info.field_name} must be earlier than now") return value + @model_validator(mode="after") + def check_empty_content(self): + if not self.title and not self.content: + raise ValueError('Either title or content should have at least 1 character') + return self + @model_validator(mode="after") def check_update_at_after_created_at(self): """Date and time of last modification should be later than date and time of creation""" @@ -83,7 +89,7 @@ class SearchQueryParametersSchema(BaseModel): q: str services: Union[str, List[str], None] = Field(default_factory=list) - visited: List[str] = Field(default_factory=list) + visited: Union[List[str], None] = Field(default_factory=list) reach: Optional[enums.ReachEnum] = None order_by: Optional[Literal[enums.ORDER_BY_OPTIONS]] = Field(default=enums.RELEVANCE) order_direction: Optional[Literal["asc", "desc"]] = Field(default="desc") diff --git a/src/backend/core/tests/test_api_documents_index_bulk.py b/src/backend/core/tests/test_api_documents_index_bulk.py index 13ad656..6ad39b4 100644 --- a/src/backend/core/tests/test_api_documents_index_bulk.py +++ b/src/backend/core/tests/test_api_documents_index_bulk.py @@ -334,3 +334,32 @@ def test_api_documents_index_bulk_datetime_future(field): for i in [1, 2]: assert responses[i]["status"] == "valid" + + +def test_api_documents_index_empty_content_check(): + """Test bulkk document indexing with both empty title & content.""" + service = factories.ServiceFactory(name="test-service") + documents = factories.DocumentSchemaFactory.build_batch(3) + + documents[0]['content'] = '' + documents[0]['title'] = '' + + response = APIClient().post( + "/api/v1.0/documents/index/", + documents, + HTTP_AUTHORIZATION=f"Bearer {service.token:s}", + format="json", + ) + + assert response.status_code == 400 + responses = response.json() + assert responses[0]["status"] == "error" + assert len(responses[0]["errors"]) == 1 + assert ( + responses[0]["errors"][0]["msg"] + == "Value error, Either title or content should have at least 1 character" + ) + assert responses[0]["errors"][0]["type"] == "value_error" + + for i in [1, 2]: + assert responses[i]["status"] == "valid" diff --git a/src/backend/core/tests/test_api_documents_index_single.py b/src/backend/core/tests/test_api_documents_index_single.py index 67a5405..96f5bc2 100644 --- a/src/backend/core/tests/test_api_documents_index_single.py +++ b/src/backend/core/tests/test_api_documents_index_single.py @@ -298,3 +298,23 @@ def test_api_documents_index_single_datetime_future(field): assert response.status_code == 400 assert response.data[0]["msg"] == f"Value error, {field:s} must be earlier than now" assert response.data[0]["type"] == "value_error" + + +def test_api_documents_index_empty_content_check(): + """Test document indexing with both empty title & content.""" + service = factories.ServiceFactory(name="test-service") + document = factories.DocumentSchemaFactory.build() + + document['content'] = '' + document['title'] = '' + + response = APIClient().post( + "/api/v1.0/documents/index/", + document, + HTTP_AUTHORIZATION=f"Bearer {service.token:s}", + format="json", + ) + + assert response.status_code == 400 + assert response.data[0]["msg"] == "Value error, Either title or content should have at least 1 character" + assert response.data[0]["type"] == "value_error"