120 lines
4.2 KiB
Python
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.
|