arbret/backend/validate_constants.py

102 lines
3.4 KiB
Python

"""Validate shared constants match backend definitions."""
import json
from pathlib import Path
from models import (
ROLE_ADMIN,
ROLE_REGULAR,
BitcoinTransferMethod,
ExchangeStatus,
InviteStatus,
TradeDirection,
)
def validate_shared_constants() -> None:
"""
Validate that shared/constants.json matches backend definitions.
Raises ValueError if there's a mismatch.
"""
constants_path = Path(__file__).parent.parent / "shared" / "constants.json"
if not constants_path.exists():
raise ValueError(f"Shared constants file not found: {constants_path}")
with open(constants_path) as f:
constants = json.load(f)
# Validate roles
expected_roles = {"ADMIN": ROLE_ADMIN, "REGULAR": ROLE_REGULAR}
if constants.get("roles") != expected_roles:
raise ValueError(
f"Role mismatch in shared/constants.json. "
f"Expected: {expected_roles}, Got: {constants.get('roles')}"
)
# Validate invite statuses
expected_invite_statuses = {s.name: s.value for s in InviteStatus}
if constants.get("inviteStatuses") != expected_invite_statuses:
got = constants.get("inviteStatuses")
raise ValueError(
f"Invite status mismatch. Expected: {expected_invite_statuses}, Got: {got}"
)
# Validate exchange statuses
expected_exchange_statuses = {s.name: s.value for s in ExchangeStatus}
if constants.get("exchangeStatuses") != expected_exchange_statuses:
got = constants.get("exchangeStatuses")
raise ValueError(
f"Exchange status mismatch. "
f"Expected: {expected_exchange_statuses}, Got: {got}"
)
# Validate trade directions
expected_trade_directions = {d.name: d.value for d in TradeDirection}
if constants.get("tradeDirections") != expected_trade_directions:
got = constants.get("tradeDirections")
raise ValueError(
f"Trade direction mismatch. "
f"Expected: {expected_trade_directions}, Got: {got}"
)
# Validate bitcoin transfer methods
expected_transfer_methods = {m.name: m.value for m in BitcoinTransferMethod}
if constants.get("bitcoinTransferMethods") != expected_transfer_methods:
got = constants.get("bitcoinTransferMethods")
raise ValueError(
f"Bitcoin transfer method mismatch. "
f"Expected: {expected_transfer_methods}, Got: {got}"
)
# Validate exchange constants exist with required fields
exchange = constants.get("exchange", {})
required_exchange_fields = [
"slotDurationMinutes",
"maxAdvanceDays",
"minAdvanceDays",
"eurTradeMin",
"eurTradeMax",
"eurTradeIncrement",
"premiumPercentage",
"priceRefreshSeconds",
"priceStalenessSeconds",
"lightningMaxEur",
]
for field in required_exchange_fields:
if field not in exchange:
raise ValueError(f"Missing exchange constant '{field}' in constants.json")
# Validate validation rules exist (structure check only)
validation = constants.get("validation", {})
required_fields = ["telegram", "signal", "nostrNpub"]
for field in required_fields:
if field not in validation:
raise ValueError(
f"Missing validation rules for '{field}' in constants.json"
)
if __name__ == "__main__":
validate_shared_constants()
print("✓ Shared constants are valid")