first commit

This commit is contained in:
skylanix
2026-06-28 20:21:40 +02:00
commit b66b065da1
16 changed files with 1097 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
# Package de tests unitaires
+8
View File
@@ -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()
+83
View File
@@ -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)
)
+19
View File
@@ -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