import pytest from pathlib import Path from unittest.mock import MagicMock, patch from tweet_classifier.organizer import ImageThemeOrganizer @pytest.fixture def temp_workspace(tmp_path): """ Crée une structure temporaire pour les tests. """ input_dir = tmp_path / "inputs" input_dir.mkdir() # Créer quelques fichiers d'images factices (input_dir / "tweet1.png").write_text("fake image content 1") (input_dir / "tweet2.jpg").write_text("fake image content 2") (input_dir / "not_an_image.txt").write_text("some text") return input_dir @patch("tweet_classifier.organizer.CSVDatabaseManager") @patch("tweet_classifier.ocr.easyocr.Reader") @patch("tweet_classifier.classifier.pipeline") def test_scan_new_files(mock_pipeline, mock_reader, mock_db_class, temp_workspace): """ Vérifie que l'organisateur scanne les fichiers et les ajoute à la base de données. """ mock_db = MagicMock() mock_db_class.return_value = mock_db organizer = ImageThemeOrganizer(input_dir=temp_workspace) organizer.scan_new_files() # Vérifier que add_files a été appelé avec les bonnes images assert mock_db.add_files.called added_files = mock_db.add_files.call_args[0][0] assert len(added_files) == 2 assert any(img.name == "tweet1.png" for img in added_files) assert any(img.name == "tweet2.jpg" for img in added_files) @patch("tweet_classifier.organizer.CSVDatabaseManager") @patch("tweet_classifier.ocr.easyocr.Reader") @patch("tweet_classifier.classifier.pipeline") def test_process_record_success(mock_pipeline, mock_reader, mock_db_class, temp_workspace): """ Vérifie le traitement réussi d'un enregistrement DB. """ mock_db = MagicMock() mock_db_class.return_value = mock_db mock_reader_instance = MagicMock() mock_reader.return_value = mock_reader_instance mock_reader_instance.readtext.return_value = [ (None, "Ceci est un tweet agressif", None) ] mock_pipeline_instance = MagicMock() mock_pipeline.return_value = mock_pipeline_instance mock_pipeline_instance.return_value = { "labels": ["Insulte"], "scores": [0.9] } organizer = ImageThemeOrganizer(input_dir=temp_workspace) image_path = temp_workspace / "tweet1.png" record = { "filename": "tweet1.png", "filepath": str(image_path) } organizer._process_record(record) # Vérifier le déplacement dest_path = temp_workspace / "ok" / "Insulte" / "tweet1.png" assert dest_path.exists() # Vérifier la mise à jour DB : le nouvel emplacement doit être enregistré mock_db.update_file_status.assert_called_with( "tweet1.png", 'processed', "Ceci est un tweet agressif", "Insulte", 0.9, new_filepath=str(dest_path) )