"""Validate shared constants match backend definitions.""" import json from pathlib import Path from models import ( ROLE_ADMIN, ROLE_REGULAR, 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 exchange constants exist with required fields exchange = constants.get("exchange", {}) required_exchange_fields = [ "slotDurationMinutes", "maxAdvanceDays", "minAdvanceDays", "eurTradeMin", "eurTradeMax", "eurTradeIncrement", "premiumPercentage", "priceRefreshSeconds", "priceStalenessSeconds", ] 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")