"""Suppression d'un objet de scène en AJAX (voir routes/scenes/ scene_object_delete.py, deleteSceneObject() dans static/js/scenes/ scene-editor.js) : même principe que l'ajout (test_scene_object_add_ajax.py) — une réponse JSON quand l'appelant envoie X-Requested-With: fetch, pour ne plus "vider" l'éditeur de collision/quêtes le temps d'un remplacement de
par pjax.js (qui interceptait la soumission du formulaire de suppression classique).""" from collections.abc import Callable from typing import Any from flask.testing import FlaskClient import screens def _create_jeu2d_game( client: FlaskClient, tmp_game_slug_cleanup: Callable[[str], str], name: str = "pytest_delete_ajax" ) -> Any: resp = client.post("/games/new", data={"name": name}, follow_redirects=False) slug = tmp_game_slug_cleanup(resp.headers["Location"].rstrip("/").split("/")[-1]) screen_id = screens.create_screen(slug, "Scène 1", kind="jeu_2d") return slug, screen_id def _add_ajax(client: FlaskClient, slug: str, screen_id: int, **data: Any) -> Any: return client.post( f"/game/{slug}/screens/{screen_id}/scene-objects/add", data=data, headers={"X-Requested-With": "fetch"}, ).get_json() def test_ajax_delete_returns_json_and_removes_the_object( client: FlaskClient, tmp_game_slug_cleanup: Callable[[str], str] ) -> None: slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) obj_id = _add_ajax(client, slug, screen_id, kind="personnage")["id"] resp = client.post( f"/game/{slug}/scene-objects/{obj_id}/delete", headers={"X-Requested-With": "fetch"}, ) assert resp.status_code == 200 assert resp.get_json() == {"ok": True, "id": obj_id} assert screens.get_scene_object(slug, obj_id) is None def test_ajax_delete_404s_for_missing_object(client: FlaskClient, tmp_game_slug_cleanup: Callable[[str], str]) -> None: slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) resp = client.post( f"/game/{slug}/scene-objects/999999/delete", headers={"X-Requested-With": "fetch"}, ) assert resp.status_code == 404 assert resp.get_json() == {"ok": False} def test_non_ajax_delete_still_redirects(client: FlaskClient, tmp_game_slug_cleanup: Callable[[str], str]) -> None: slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) obj_id = _add_ajax(client, slug, screen_id, kind="personnage")["id"] resp = client.post(f"/game/{slug}/scene-objects/{obj_id}/delete", follow_redirects=False) assert resp.status_code == 302 assert screens.get_scene_object(slug, obj_id) is None