"""Aperçu visuel de la boîte de collision dans l'éditeur de scène (voir "🧱 Collision", templates/game/scene_edit.html) — demandé par l'utilisateur : "quand je suis dans l'éditeur je veux voir la boîte de collision et régler sa taille". Rendu SEULEMENT pour l'objet sélectionné (voir static/game/js/scenes/scene-editor.js::onCollisionBoxMouseDown/ onCollisionBoxResizeMouseDown pour le glisser-déplacer/redimensionner).""" import re from collections.abc import Callable from typing import Any from flask.testing import FlaskClient import game_engine from tests.conftest import not_none def _create_jeu2d_game( client: FlaskClient, tmp_game_slug_cleanup: Callable[[str], str], name: str = "pytest_overlay" ) -> 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 = game_engine.create_screen(slug, "Scène 1", kind="jeu_2d") return slug, screen_id def _add_decor(client: FlaskClient, slug: str, screen_id: int) -> Any: resp = client.post( f"/game/{slug}/screens/{screen_id}/scene-objects/add", data={"kind": "decor"}, follow_redirects=False ) assert resp.status_code == 302, resp.data return int(not_none(re.search(r"selected=(\d+)", resp.headers["Location"])).group(1)) def test_selected_object_renders_the_collision_overlay_with_drag_handlers( client: FlaskClient, tmp_game_slug_cleanup: Callable[[str], str] ) -> None: slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) obj_id = _add_decor(client, slug, screen_id) html = client.get(f"/game/{slug}/screens/{screen_id}/edit?selected={obj_id}").get_data(as_text=True) assert 'id="collisionBoxOverlay"' in html assert f"onCollisionBoxMouseDown(event, {obj_id})" in html assert f"onCollisionBoxResizeMouseDown(event, {obj_id})" in html def test_only_the_selected_object_gets_an_overlay( client: FlaskClient, tmp_game_slug_cleanup: Callable[[str], str] ) -> None: slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) obj_id = _add_decor(client, slug, screen_id) _add_decor(client, slug, screen_id) # un second objet, jamais sélectionné ici html = client.get(f"/game/{slug}/screens/{screen_id}/edit?selected={obj_id}").get_data(as_text=True) assert html.count('id="collisionBoxOverlay"') == 1 def test_overlay_reflects_a_custom_collision_box_size_and_offset( client: FlaskClient, tmp_game_slug_cleanup: Callable[[str], str] ) -> None: slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) obj_id = _add_decor(client, slug, screen_id) client.post( f"/game/{slug}/scene-objects/{obj_id}/collision", data='{"enabled": true, "shape": "cercle", "width": 40, "height": 40, "offset_x": 10, "offset_y": -10}', content_type="application/json", ) html = client.get(f"/game/{slug}/screens/{screen_id}/edit?selected={obj_id}").get_data(as_text=True) assert "is-circle" in html assert "width:40.0px; height:40.0px" in html def test_disabled_collision_marks_the_overlay(client: FlaskClient, tmp_game_slug_cleanup: Callable[[str], str]) -> None: slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) obj_id = _add_decor(client, slug, screen_id) client.post( f"/game/{slug}/scene-objects/{obj_id}/collision", data='{"enabled": false}', content_type="application/json" ) html = client.get(f"/game/{slug}/screens/{screen_id}/edit?selected={obj_id}").get_data(as_text=True) assert "is-disabled" in html