first commit
This commit is contained in:
@@ -0,0 +1 @@
|
||||
# Package de tests unitaires
|
||||
@@ -0,0 +1,8 @@
|
||||
import sys
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
# Mock global pour éviter le besoin d'installer des paquets lourds en local pour les tests unitaires
|
||||
sys.modules['easyocr'] = MagicMock()
|
||||
sys.modules['transformers'] = MagicMock()
|
||||
sys.modules['torch'] = MagicMock()
|
||||
sys.modules['torchvision'] = MagicMock()
|
||||
@@ -0,0 +1,83 @@
|
||||
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)
|
||||
)
|
||||
@@ -0,0 +1,19 @@
|
||||
import pytest
|
||||
from pathlib import Path
|
||||
from tweet_classifier.web_generator import WebReportGenerator
|
||||
|
||||
def test_web_generator_finds_csv_in_output_dir(tmp_path):
|
||||
output_dir = tmp_path / "ok"
|
||||
output_dir.mkdir()
|
||||
|
||||
# Create a CSV in output_dir
|
||||
csv_file = output_dir / "my_tweets.csv"
|
||||
csv_file.write_text("filepath,status,detected_category,confidence,ocr_text\n/path/to/img,processed,Cat,0.9,Text")
|
||||
|
||||
# Instantiate with a non-existent path but pointing to the output_dir
|
||||
# The WebReportGenerator will now check in output_dir
|
||||
generator = WebReportGenerator(csv_path=Path("my_tweets.csv"), output_dir=output_dir)
|
||||
|
||||
# This should now point to output_dir / "my_tweets.csv"
|
||||
assert generator.csv_path.exists()
|
||||
assert generator.csv_path == csv_file
|
||||
Reference in New Issue
Block a user