"""Le backend doit accepter et restituer l'ordre des freres (format v3).""" from __future__ import annotations from fastapi.testclient import TestClient from tests.conftest import build_map def build_v3_map() -> dict: payload = build_map(node_count=1, name="Reseau") payload["version"] = 3 payload["nodes"] = [ { "id": "root", "type": "root", "text": "Reseau", "position": {"x": 0, "y": 0}, "parentId": None, "order": 0, }, { "id": "vlan", "type": "standard", "text": "VLAN", "position": {"x": 200, "y": 0}, "parentId": "root", "order": 0, }, { "id": "vpn", "type": "standard", "text": "VPN", "position": {"x": 200, "y": 60}, "parentId": "root", "order": 1, }, { "id": "dns", "type": "standard", "text": "DNS", "position": {"x": 200, "y": 120}, "parentId": "root", "order": 2, }, ] payload["edges"] = [ {"id": "e-root-vlan", "source": "root", "target": "vlan"}, {"id": "e-root-vpn", "source": "root", "target": "vpn"}, {"id": "e-root-dns", "source": "root", "target": "dns"}, ] payload["settings"]["dragMovesBranch"] = True return payload def test_share_accepts_v3_map(client: TestClient) -> None: response = client.post("/api/shares", json={"title": "v3", "map": build_v3_map()}) assert response.status_code == 201, response.text def test_child_order_is_returned_unchanged(client: TestClient) -> None: created = client.post("/api/shares", json={"title": "v3", "map": build_v3_map()}) token = created.json()["share_token"] public = client.get("/api/shares/" + token).json() assert public["map_version"] == 3 orders = {node["id"]: node.get("order") for node in public["map"]["nodes"]} assert orders == {"root": 0, "vlan": 0, "vpn": 1, "dns": 2} assert public["map"]["settings"]["dragMovesBranch"] is True def test_reordered_update_is_visible_publicly(client: TestClient) -> None: created = client.post("/api/shares", json={"title": "v3", "map": build_v3_map()}) body = created.json() reordered = build_v3_map() for node in reordered["nodes"]: if node["id"] == "dns": node["order"] = 0 elif node["id"] == "vlan": node["order"] = 2 response = client.put( "/api/shares/" + body["share_token"], json={"title": "v3", "map": reordered}, headers={"X-Management-Token": body["management_token"]}, ) assert response.status_code == 200 public = client.get("/api/shares/" + body["share_token"]).json() orders = {node["id"]: node.get("order") for node in public["map"]["nodes"]} assert orders["dns"] == 0 assert orders["vlan"] == 2 def test_older_versions_are_still_accepted(client: TestClient) -> None: for version in (1, 2): payload = build_map() payload["version"] = version response = client.post("/api/shares", json={"title": f"v{version}", "map": payload}) assert response.status_code == 201, response.text def test_invalid_order_type_is_rejected_or_ignored(client: TestClient) -> None: """Un ordre non numerique ne doit jamais faire tomber le serveur.""" payload = build_v3_map() payload["nodes"][1]["order"] = "premier" response = client.post("/api/shares", json={"title": "x", "map": payload}) assert response.status_code in (201, 422)