Markdown / tests /test_app.py
GauthierDemonchy
Premier commit propre
898ed62
Raw
History Blame Contribute Delete
4.95 kB
"""Tests pour app.py — routes Flask."""
from io import BytesIO
from unittest.mock import patch, MagicMock
def test_index_returns_html(client):
"""GET / doit retourner une page HTML."""
response = client.get("/")
assert response.status_code == 200
assert "text/html" in response.content_type
def test_upload_no_files(client):
"""POST /upload sans fichier doit retourner 400."""
response = client.post("/upload", content_type="multipart/form-data")
assert response.status_code == 400
data = response.get_json()
assert data["success"] is False
assert "Aucun fichier" in data["error"]
def test_upload_single_file_success(client):
"""POST /upload avec un fichier valide doit retourner le markdown."""
with patch("app.convert") as mock_convert, \
patch("app.add_entry") as mock_add_entry:
mock_convert.return_value = "# markdown converti"
mock_add_entry.return_value = {
"id": "1",
"filename": "test.pdf",
"markdown": "# markdown converti",
"size": 18,
"date": "12/05/2026 14:30",
}
data = {"files": (BytesIO(b"fake content"), "test.pdf")}
response = client.post(
"/upload",
data=data,
content_type="multipart/form-data",
)
assert response.status_code == 200
json_data = response.get_json()
assert json_data["success"] is True
assert len(json_data["results"]) == 1
assert json_data["results"][0]["filename"] == "test.pdf"
assert json_data["results"][0]["markdown"] == "# markdown converti"
assert json_data["errors"] == []
def test_upload_conversion_error(client):
"""POST /upload doit gérer les erreurs de conversion par fichier."""
with patch("app.convert") as mock_convert:
mock_convert.side_effect = Exception("Erreur de conversion pour test.xlsx : fichier corrompu")
data = {"files": (BytesIO(b"fake xlsx"), "test.xlsx")}
response = client.post(
"/upload",
data=data,
content_type="multipart/form-data",
)
assert response.status_code == 200
json_data = response.get_json()
assert json_data["results"] == []
assert len(json_data["errors"]) == 1
assert json_data["errors"][0]["filename"] == "test.xlsx"
assert "fichier corrompu" in json_data["errors"][0]["error"]
def test_history_route(client):
"""GET /history doit retourner la liste de l'historique."""
mock_data = [{"id": "1", "filename": "doc.pdf"}]
with patch("app.get_all", return_value=mock_data):
response = client.get("/history")
assert response.status_code == 200
data = response.get_json()
assert data["success"] is True
assert data["data"] == mock_data
def test_download_not_found(client):
"""GET /download/<id> avec un id inexistant doit retourner 404."""
with patch("app.get_entry", return_value=None):
response = client.get("/download/999")
assert response.status_code == 404
data = response.get_json()
assert data["success"] is False
assert "introuvable" in data["error"]
def test_download_found(client):
"""GET /download/<id> doit retourner un fichier .md."""
mock_entry = {
"id": "1",
"filename": "rapport.pdf",
"markdown": "# Rapport\n\nContenu du rapport.",
}
with patch("app.get_entry", return_value=mock_entry), \
patch("app.os.remove"): # évite PermissionError Windows sur send_file
response = client.get("/download/1")
assert response.status_code == 200
assert "text/markdown" in response.content_type
assert "rapport.md" in response.headers["Content-Disposition"]
assert b"# Rapport" in response.data
def test_copy_found(client):
"""GET /copy/<id> doit retourner le markdown dans le JSON."""
mock_entry = {"id": "1", "markdown": "# Test copy"}
with patch("app.get_entry", return_value=mock_entry):
response = client.get("/copy/1")
assert response.status_code == 200
data = response.get_json()
assert data["success"] is True
assert data["markdown"] == "# Test copy"
def test_copy_not_found(client):
"""GET /copy/<id> avec id inexistant doit retourner 404."""
with patch("app.get_entry", return_value=None):
response = client.get("/copy/999")
assert response.status_code == 404
data = response.get_json()
assert data["success"] is False
def test_clear_history(client):
"""POST /clear-history doit vider l'historique avec succès."""
with patch("app.clear") as mock_clear:
response = client.post("/clear-history")
assert response.status_code == 200
data = response.get_json()
assert data["success"] is True
mock_clear.assert_called_once()