Files
ENI-PythonAdvanced_05/tests/test_app.py
2025-12-16 14:18:21 +01:00

120 lines
4.2 KiB
Python

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.