Compare commits
7 Commits
am/1338-17
...
fix/1440-p
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39dff7eec3 | ||
|
|
0b0dd87b4e | ||
| 6160e87446 | |||
| d0fc662ad2 | |||
| 4e8e9cd08d | |||
| 189c657fec | |||
| abe21ce6ec |
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# deploy.sh — spin up (or update) the Nexus staging environment
|
||||
# Usage: ./deploy.sh — rebuild and restart nexus-main (port 4200)
|
||||
# ./deploy.sh staging — rebuild and restart nexus-staging (port 4201)
|
||||
# Usage: ./deploy.sh — rebuild and restart nexus-main (port 8765)
|
||||
# ./deploy.sh staging — rebuild and restart nexus-staging (port 8766)
|
||||
set -euo pipefail
|
||||
|
||||
SERVICE="${1:-nexus-main}"
|
||||
|
||||
10
index.html
10
index.html
@@ -165,18 +165,18 @@
|
||||
|
||||
<!-- Top Right: Agent Log, Atlas & SOUL Toggle -->
|
||||
<div class="hud-top-right">
|
||||
<button id="atlas-toggle-btn" class="hud-icon-btn" title="Portal Atlas">
|
||||
<span class="hud-icon">🌐</span>
|
||||
<span class="hud-btn-label">WORLDS</span>
|
||||
</button>
|
||||
<button id="atlas-toggle-btn" class="hud-icon-btn" title="World Directory">
|
||||
<button id="soul-toggle-btn" class="hud-icon-btn" title="Timmy's SOUL">
|
||||
<span class="hud-icon">✦</span>
|
||||
<span class="hud-btn-label">SOUL</span>
|
||||
</button>
|
||||
<button id="mode-toggle-btn" class="hud-icon-btn mode-toggle" title="Toggle Mode">
|
||||
<span class="hud-icon">👁</span>
|
||||
<span class="hud-btn-label" id="mode-label">VISITOR</span>
|
||||
</button>
|
||||
<button id="atlas-toggle-btn" class="hud-icon-btn" title="Portal Atlas">
|
||||
<span class="hud-icon">🌐</span>
|
||||
<span class="hud-btn-label">WORLDS</span>
|
||||
</button>
|
||||
<div id="bannerlord-status" class="hud-status-item" title="Bannerlord Readiness">
|
||||
<span class="status-dot"></span>
|
||||
<span class="status-label">BANNERLORD</span>
|
||||
|
||||
51
tests/test_portals_json.py
Normal file
51
tests/test_portals_json.py
Normal file
@@ -0,0 +1,51 @@
|
||||
"""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"
|
||||
Reference in New Issue
Block a user