52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
"""Test portals.json integrity — valid JSON, no duplicate keys, expected structure."""
|
|
|
|
from pathlib import Path
|
|
import json
|
|
|
|
|
|
def test_portals_json_valid():
|
|
"""portals.json must be valid JSON."""
|
|
path = Path(__file__).resolve().parents[1] / "portals.json"
|
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
assert isinstance(data, list), "portals.json should be a JSON array"
|
|
|
|
|
|
def test_portals_json_no_duplicate_keys():
|
|
"""portals.json must not contain duplicate keys in any object."""
|
|
path = Path(__file__).resolve().parents[1] / "portals.json"
|
|
content = path.read_text(encoding="utf-8")
|
|
|
|
def check_duplicates(pairs):
|
|
keys = [k for k, _ in pairs]
|
|
seen = set()
|
|
for k in keys:
|
|
assert k not in seen, f"Duplicate key '{k}' found in portals.json"
|
|
seen.add(k)
|
|
return dict(pairs)
|
|
|
|
json.loads(content, object_pairs_hook=check_duplicates)
|
|
|
|
|
|
def test_portals_json_structure():
|
|
"""Each portal entry must have required fields."""
|
|
path = Path(__file__).resolve().parents[1] / "portals.json"
|
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
|
|
required = {"id", "name", "description", "status", "color", "position"}
|
|
for i, portal in enumerate(data):
|
|
assert isinstance(portal, dict), f"Portal [{i}] is not a dict"
|
|
missing = required - set(portal.keys())
|
|
assert not missing, f"Portal [{i}] ({portal.get('id', '?')}) missing fields: {missing}"
|
|
|
|
|
|
def test_portals_json_positions_valid():
|
|
"""Each portal position must have x, y, z coordinates."""
|
|
path = Path(__file__).resolve().parents[1] / "portals.json"
|
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
|
|
for i, portal in enumerate(data):
|
|
pos = portal.get("position", {})
|
|
for axis in ("x", "y", "z"):
|
|
assert axis in pos, f"Portal [{i}] ({portal.get('id')}) missing position.{axis}"
|
|
assert isinstance(pos[axis], (int, float)), f"Portal [{i}] position.{axis} is not a number"
|