""" Tests unitaires pour l'API """ import pytest import json from fastapi.testclient import TestClient from unittest.mock import patch, MagicMock # Import de l'application (à adapter selon la structure) # from services.host_api.app import app # client = TestClient(app) class TestAPI: """Tests pour l'API d'ingestion""" def test_health_check(self): """Test du endpoint de santé""" # response = client.get("/api/health") # assert response.status_code == 200 # data = response.json() # assert data["status"] in ["healthy", "degraded"] # assert "services" in data pass def test_import_document_pdf(self): """Test d'import d'un document PDF""" # with open("tests/data/sample.pdf", "rb") as f: # files = {"file": ("test.pdf", f, "application/pdf")} # data = { # "id_dossier": "D-2025-001", # "source": "upload", # "etude_id": "E-001", # "utilisateur_id": "U-123" # } # # response = client.post("/api/import", files=files, data=data) # assert response.status_code == 200 # # result = response.json() # assert result["status"] == "queued" # assert "id_document" in result pass def test_import_document_invalid_type(self): """Test d'import avec un type de fichier invalide""" # files = {"file": ("test.txt", b"content", "text/plain")} # data = { # "id_dossier": "D-2025-001", # "source": "upload", # "etude_id": "E-001", # "utilisateur_id": "U-123" # } # # response = client.post("/api/import", files=files, data=data) # assert response.status_code == 415 pass def test_get_document(self): """Test de récupération d'un document""" # response = client.get("/api/documents/test-doc-id") # assert response.status_code == 404 # Document inexistant pass def test_list_documents(self): """Test de liste des documents""" # response = client.get("/api/documents") # assert response.status_code == 200 # data = response.json() # assert isinstance(data, list) pass def test_admin_stats(self): """Test des statistiques d'administration""" # response = client.get("/api/admin/stats") # assert response.status_code == 200 # data = response.json() # assert "documents" in data # assert "processing" in data pass class TestWorker: """Tests pour les pipelines de traitement""" @patch('services.worker.pipelines.preprocess.get_document') def test_preprocess_pdf(self, mock_get_document): """Test du préprocessing PDF""" # mock_get_document.return_value = b"fake pdf content" # # ctx = {"mime_type": "application/pdf"} # preprocess.run("test-doc-id", ctx) # # assert "preprocessing_meta" in ctx # assert ctx["preprocessing_meta"]["preprocessing_completed"] is True pass @patch('services.worker.pipelines.ocr.requests.post') def test_classify_document(self, mock_post): """Test de classification de document""" # mock_response = MagicMock() # mock_response.status_code = 200 # mock_response.json.return_value = { # "response": '{"label": "acte_vente", "confidence": 0.95}' # } # mock_post.return_value = mock_response # # ctx = {"extracted_text": "Acte de vente immobilière..."} # classify.run("test-doc-id", ctx) # # assert "classification" in ctx # assert ctx["classification"]["label"] == "acte_vente" pass def test_extract_data(self): """Test d'extraction de données""" # ctx = { # "extracted_text": "Vendeur: Jean Dupont, Acheteur: Marie Martin, Prix: 250000€", # "classification": {"label": "acte_vente", "confidence": 0.95} # } # # extract.run("test-doc-id", ctx) # # assert "extracted_data" in ctx # assert ctx["extracted_data"]["type"] == "acte_vente" pass def test_checks_validation(self): """Test des vérifications""" # ctx = { # "classification": {"label": "acte_vente", "confidence": 0.95}, # "extracted_data": { # "type": "acte_vente", # "vendeur": "Jean Dupont", # "acheteur": "Marie Martin", # "prix": "250000€" # }, # "ocr_meta": {"confidence": 0.8, "text_length": 1000} # } # # checks.run("test-doc-id", ctx) # # assert "checks_results" in ctx # assert "overall_status" in ctx pass class TestUtils: """Tests pour les utilitaires""" def test_text_normalization(self): """Test de normalisation de texte""" # from services.worker.utils.text_normalize import correct_notarial_text # # text = "M. Jean Dupont vend à Mme Marie Martin pour 250000€" # corrected = correct_notarial_text(text) # # assert "Monsieur" in corrected # assert "Madame" in corrected # assert "euros" in corrected pass def test_date_extraction(self): """Test d'extraction de dates""" # from services.worker.utils.text_normalize import extract_dates # # text = "Acte du 15/03/2025" # dates = extract_dates(text) # # assert "15/03/2025" in dates pass def test_amount_extraction(self): """Test d'extraction de montants""" # from services.worker.utils.text_normalize import extract_amounts # # text = "Prix de vente: 250 000€" # amounts = extract_amounts(text) # # assert "250 000€" in amounts pass if __name__ == "__main__": pytest.main([__file__])