Files
2026-06-28 20:21:40 +02:00

84 lines
2.8 KiB
Python

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)
)