from unittest.mock import MagicMock
from datetime import datetime
from app.db import models
def test_add_document_success(client):
test_client, mock_services = client
mock_services.document_service.add_document.return_value = 123
# Update the payload to include the default values from the Pydantic model
doc_payload = {
"title": "Test Doc",
"text": "Content here",
"source_url": None, # Add these based on your schema's defaults
"author": None,
"user_id": "default_user",
}
# The payload sent to the endpoint is just title and text
request_payload = {"title": "Test Doc", "text": "Content here"}
response = test_client.post("/documents", json=request_payload)
assert response.status_code == 200
assert response.json()["message"] == "Document 'Test Doc' added successfully with ID 123"
# Assert against the full payload that the router will generate and pass to the service
mock_services.document_service.add_document.assert_called_once_with(
db=mock_services.document_service.add_document.call_args.kwargs['db'],
doc_data=doc_payload
)
def test_get_documents_success(client):
test_client, mock_services = client
# Ensure mock attributes are valid types for the schema
mock_docs = [
MagicMock(
spec=models.Document,
id=1,
title="Doc One",
status="ready",
created_at=datetime.now(),
source_url="http://example.com/doc1", # Explicitly set a string value
text="text one",
author="author one"
),
MagicMock(
spec=models.Document,
id=2,
title="Doc Two",
status="processing",
created_at=datetime.now(),
source_url=None, # Or explicitly set to None if that's a valid case
text="text two",
author="author two"
)
]
mock_services.document_service.get_all_documents.return_value = mock_docs
response = test_client.get("/documents")
assert response.status_code == 200
response_data = response.json()
assert len(response_data["documents"]) == 2
# You can also add more specific assertions
assert response_data["documents"][0]["title"] == "Doc One"
assert response_data["documents"][1]["status"] == "processing"
mock_services.document_service.get_all_documents.assert_called_once()
def test_delete_document_success(client):
"""Tests the DELETE /documents/{document_id} endpoint for successful deletion."""
test_client, mock_services = client
mock_services.document_service.delete_document.return_value = 42
response = test_client.delete("/documents/42")
assert response.status_code == 200
assert response.json()["document_id"] == 42
mock_services.document_service.delete_document.assert_called_once_with(
db=mock_services.document_service.delete_document.call_args.kwargs['db'],
document_id=42
)
def test_delete_document_not_found(client):
"""Tests the DELETE /documents/{document_id} endpoint when the document is not found."""
test_client, mock_services = client
mock_services.document_service.delete_document.return_value = None
response = test_client.delete("/documents/999")
assert response.status_code == 404
mock_services.document_service.delete_document.assert_called_once_with(
db=mock_services.document_service.delete_document.call_args.kwargs['db'],
document_id=999
)