import requests import json # --- Configuration --- BASE_URL = "https://dev-api.oneskyit.com/v3/crud" API_KEY = "PMM4n50teUCaOMMTN8qOJA" # Agent API Key # ACCOUNT_ID = "_XY7DXtc9MY" # Test Targets: (Object Type, Valid ID Random) # Note: These IDs are extracted from real active records. TARGETS = [ ("event_badge", "JPUG-87-80-88"), ("event_badge_template", "gDcA4kVb5B0"), ("event_exhibit", "xK_9yEj1bQY"), ("event_exhibit_tracking", "KVypw_xntSY"), ("event_file", "a2pPIT_W28o") # Regression Target for Relational ID bug ] def get_headers(): return { "Content-Type": "application/json", "X-Aether-API-Key": API_KEY, "x-no-account-id": "bypass" } def verify_demo_parity(obj_type, record_id): """ Verifies that the object returns ONLY string IDs for all ID fields (Vision Standard). Specifically checks for account_id in tracking. """ print(f"--- Testing {obj_type}: {record_id} ---") url = f"{BASE_URL}/{obj_type}/{record_id}" try: response = requests.get(url, headers=get_headers()) if response.status_code == 200: data = response.json().get('data', {}) failures = [] # 1. Check Vision Standard (All *_id fields must be strings) for key, val in data.items(): if key == "id" or (key.endswith("_id") and not key.endswith("external_id")): if val is not None and not isinstance(val, str): failures.append(f"{key} is {type(val).__name__} ({val})") # 2. Specific check for account_id in tracking if obj_type == "event_exhibit_tracking": if "account_id" not in data or data["account_id"] is None: failures.append("account_id is missing or null in tracking view") elif not isinstance(data["account_id"], str): failures.append(f"account_id is not a string ({type(data['account_id']).__name__})") if not failures: print(f" āœ… [PASS] All ID fields are strings.") if obj_type == "event_exhibit_tracking": print(f" āœ… [PASS] account_id found: {data.get('account_id')}") return True else: print(f" āŒ [FAIL] Vision integrity error:") for f in failures: print(f" - {f}") return False else: print(f" āŒ [ERROR] Status {response.status_code}: {response.text[:200]}") return False except Exception as e: print(f" šŸ’„ [EXCEPTION] {e}") return False def test_nested_alias_resolution(): """ Verifies that the 'entry' alias and nested resolution works for journals. (Testing the fix we just implemented to ensure no regressions). """ print("\n--- Testing Nested Alias Resolution (/journal/.../entry/) ---") parent_id = "OGQK-02-04-94" child_id = "xWX-NX-e6-EN" url = f"{BASE_URL}/journal/{parent_id}/entry/{child_id}" resp = requests.get(url, headers=get_headers()) if resp.status_code == 200: print(f" āœ… [PASS] Nested alias resolution successful.") return True else: print(f" āŒ [FAIL] Nested alias resolution failed (Status {resp.status_code})") return False if __name__ == "__main__": print("šŸš€ Starting Aether V3 Demo Parity Suite\n") results = [] for obj_type, record_id in TARGETS: results.append(verify_demo_parity(obj_type, record_id)) print("-" * 40) results.append(test_nested_alias_resolution()) if all(results): print("\nšŸ† DEMO SUITE SUCCESS: All critical endpoints are verified stable.") else: print("\n🚨 DEMO SUITE FAILURE: Some critical checks failed.")