"""Routes HTTP des pages d'un support de formation (routes/document/ document_page_*.py) — retour utilisateur du 21/09/2026 : "il faut implémenter un système de page". La fixture `support` crée une première page par convénience pour ces tests (voir tests/conftest.py) ; en production un support neuf n'a plus aucune page, et supprimer la dernière page restante est désormais autorisé (retour utilisateur du 26/09/2026, voir document_engine/pages/pages.md).""" from flask.testing import FlaskClient import document_engine def _page_id(support: str) -> int: return int(document_engine.list_document_pages(support)[0]["id"]) def test_document_page_add_creates_a_second_page(client: FlaskClient, support: str) -> None: resp = client.post(f"/document/{support}/pages/add", json={}) assert resp.status_code == 200 payload = resp.get_json() assert payload["title"] == "Page 2" pages = document_engine.list_document_pages(support) assert [p["title"] for p in pages] == ["Page 1", "Page 2"] assert pages[1]["id"] == payload["id"] def test_document_page_add_accepts_a_custom_title(client: FlaskClient, support: str) -> None: resp = client.post(f"/document/{support}/pages/add", json={"title": "Chapitre 2"}) assert resp.status_code == 200 assert resp.get_json()["title"] == "Chapitre 2" def test_document_page_rename_persists_the_new_title(client: FlaskClient, support: str) -> None: page_id = _page_id(support) resp = client.post(f"/document/{support}/pages/{page_id}/rename", json={"title": "Introduction"}) assert resp.status_code == 200 assert resp.get_json() == {"ok": True, "title": "Introduction"} page = document_engine.get_document_page(support, page_id) assert page is not None assert page["title"] == "Introduction" def test_document_page_rename_ignores_an_empty_title(client: FlaskClient, support: str) -> None: page_id = _page_id(support) resp = client.post(f"/document/{support}/pages/{page_id}/rename", json={"title": " "}) assert resp.status_code == 200 assert resp.get_json()["title"] == "Page 1" def test_document_page_rename_rejects_an_unknown_page(client: FlaskClient, support: str) -> None: assert client.post(f"/document/{support}/pages/999/rename", json={"title": "X"}).status_code == 404 def test_document_page_delete_allows_deleting_the_last_remaining_page(client: FlaskClient, support: str) -> None: page_id = _page_id(support) resp = client.post(f"/document/{support}/pages/{page_id}/delete") assert resp.status_code == 200 assert resp.get_json()["ok"] is True assert document_engine.get_document_page(support, page_id) is None assert document_engine.list_document_pages(support) == [] def test_document_page_delete_all_wipes_every_page_and_its_elements(client: FlaskClient, support: str) -> None: first_page_id = _page_id(support) second_page_id = client.post(f"/document/{support}/pages/add", json={}).get_json()["id"] element_resp = client.post(f"/document/{support}/elements/add", data={"kind": "titre", "page_id": second_page_id}) element_id = element_resp.get_json()["id"] resp = client.post(f"/document/{support}/pages/delete-all") assert resp.status_code == 200 assert resp.get_json()["ok"] is True assert document_engine.list_document_pages(support) == [] assert document_engine.get_document_page(support, first_page_id) is None assert document_engine.get_document_page(support, second_page_id) is None assert document_engine.get_document_element(support, element_id) is None def test_document_page_delete_removes_a_non_last_page_and_its_elements(client: FlaskClient, support: str) -> None: first_page_id = _page_id(support) second_page_id = client.post(f"/document/{support}/pages/add", json={}).get_json()["id"] element_resp = client.post(f"/document/{support}/elements/add", data={"kind": "titre", "page_id": second_page_id}) element_id = element_resp.get_json()["id"] resp = client.post(f"/document/{support}/pages/{second_page_id}/delete") assert resp.status_code == 200 assert resp.get_json()["ok"] is True assert document_engine.get_document_page(support, second_page_id) is None assert document_engine.get_document_element(support, element_id) is None assert [p["id"] for p in document_engine.list_document_pages(support)] == [first_page_id] def test_document_page_delete_rejects_an_unknown_page(client: FlaskClient, support: str) -> None: client.post(f"/document/{support}/pages/add", json={}) assert client.post(f"/document/{support}/pages/999/delete").status_code == 404 def test_document_page_move_reorders_the_tab_strip(client: FlaskClient, support: str) -> None: first_page_id = _page_id(support) second_page_id = client.post(f"/document/{support}/pages/add", json={}).get_json()["id"] third_page_id = client.post(f"/document/{support}/pages/add", json={}).get_json()["id"] resp = client.post(f"/document/{support}/pages/{third_page_id}/move", json={"new_index": 0}) assert resp.status_code == 200 assert resp.get_json()["ok"] is True ordered_ids = [p["id"] for p in document_engine.list_document_pages(support)] assert ordered_ids == [third_page_id, first_page_id, second_page_id] def test_document_page_move_rejects_an_unknown_page(client: FlaskClient, support: str) -> None: assert client.post(f"/document/{support}/pages/999/move", json={"new_index": 0}).status_code == 404 def test_new_page_defaults_to_top_vertical_align(client: FlaskClient, support: str) -> None: page_id = _page_id(support) page = document_engine.get_document_page(support, page_id) assert page is not None assert page["vertical_align"] == "top" def test_document_page_vertical_align_persists_a_valid_value(client: FlaskClient, support: str) -> None: page_id = _page_id(support) resp = client.post(f"/document/{support}/pages/{page_id}/vertical-align", json={"vertical_align": "center"}) assert resp.status_code == 200 assert resp.get_json() == {"ok": True, "vertical_align": "center"} page = document_engine.get_document_page(support, page_id) assert page is not None assert page["vertical_align"] == "center" def test_document_page_vertical_align_falls_back_to_top_for_an_invalid_value(client: FlaskClient, support: str) -> None: page_id = _page_id(support) client.post(f"/document/{support}/pages/{page_id}/vertical-align", json={"vertical_align": "center"}) resp = client.post(f"/document/{support}/pages/{page_id}/vertical-align", json={"vertical_align": "n-importe-quoi"}) assert resp.status_code == 200 assert resp.get_json()["vertical_align"] == "top" def test_document_page_vertical_align_rejects_an_unknown_page(client: FlaskClient, support: str) -> None: resp = client.post(f"/document/{support}/pages/999/vertical-align", json={"vertical_align": "center"}) assert resp.status_code == 404