import pytest from flask import Flask from flask.testing import FlaskClient # Redémarrer PyCharm si non reconnu. File > Invalidate Caches > "Just restart" from app import create_app @pytest.fixture() def app() -> Flask: """Fixture pour créer une instance de l'app pour les tests.""" app = create_app() app.config.update({"TESTING": True}) yield app @pytest.fixture() def client(app: Flask) -> FlaskClient: """Fixture pour obtenir un client de test.""" return app.test_client() def test_gallery_page_loads(client: FlaskClient) -> None: """Teste si la page principale se charge correctement (cas nominal).""" # On effectue la requête response = client.get('/') # 1. On vérifie que le statut est bien 200 OK assert response.status_code == 200 # 2. On vérifie que le contenu HTML est bien celui attendu assert b"Galerie" in response.data def test_404_error_page(client: FlaskClient) -> None: """Teste que le gestionnaire d'erreur 404 personnalisé est bien appelé.""" # On effectue la requête response = client.get('/cette-page-n-existe-pas') # 1. On vérifie que le statut est bien 200 OK assert response.status_code == 404 # 2. On vérifie que le contenu HTML est bien celui attendu assert b"Erreur 404" in response.data def test_gallery_robustness_when_folder_is_missing(client: FlaskClient, monkeypatch: pytest.MonkeyPatch) -> None: """Teste la robustesse de la vue si le dossier d'images est manquant.""" # On simule que la méthode is_dir() de pathlib.Path retourne False # C'est ce qui se passe si le dossier n'existe pas. def mock_is_dir(path_object): return False # On remplace la vraie fonction par notre simulation pour ce test monkeypatch.setattr('pathlib.Path.is_dir', mock_is_dir) # On effectue la requête response = client.get('/') # 1. On vérifie que le statut est bien 200 OK assert response.status_code == 200 # 2. On vérifie que le contenu retourné est bien celui attendu assert b"Aucune image" in response.data def test_api_images_not_found(client: FlaskClient, monkeypatch: pytest.MonkeyPatch) -> None: """ Teste le cas où aucune image n'est trouvée. L'API doit retourner une erreur 404 avec un message JSON. """ # On utilise monkeypatch pour "simuler" le comportement de build_image_structure. # On lui fait retourner un dictionnaire vide, comme si aucune image n'avait été trouvée. def mock_build_structure(path): return {} # On remplace la vraie fonction par notre simulation pour ce test monkeypatch.setattr('app.views.build_image_structure', mock_build_structure) # On effectue la requête response = client.get('/api/images') # 1. On vérifie que le statut est bien 404 Not Found assert response.status_code == 404 assert response.content_type == 'application/json' # 2. On vérifie que le message d'erreur est correct dans le JSON data = response.get_json() assert data['error'] == "Aucune image n'a été trouvée" def test_api_images_server_error(client: FlaskClient, monkeypatch: pytest.MonkeyPatch) -> None: """ Teste le cas où une erreur inattendue se produit lors du traitement. L'API doit retourner une erreur 500 avec un message JSON. """ # On simule maintenant une exception inattendue lors de l'appel à la fonction. def mock_raise_exception(path): raise ValueError("Erreur de simulation") # On remplace la vraie fonction par notre simulation qui lève une erreur monkeypatch.setattr('app.views.build_image_structure', mock_raise_exception) # On effectue la requête response = client.get('/api/images') # 1. On vérifie que le statut est bien 500 Internal Server Error assert response.status_code == 500 assert response.content_type == 'application/json' # 2. On vérifie que le message d'erreur générique est retourné data = response.get_json() assert data['error'] == "Erreur interne du serveur" def test_api_images_success(client: FlaskClient) -> None: """ Teste le cas nominal de l'API : les images sont trouvées et retournées. """ # TODO : compléter le test comme décrit dans l'énoncé du TP (étape 5). assert True # Remplacer par le vrai test.