Spaces:
Sleeping
Sleeping
| """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() |