84 lines
2.8 KiB
Python
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)
|
|
)
|