Files
OSIT-AE-API-FastAPI/tests/e2e/test_e2e_v3_demo_parity.py
Scott Idem 17a627a981 feat: Implement Event File Hosted Data Fix and API Guide Update
Address critical data visibility issues for Event Files and enhance frontend documentation.

This commit resolves the persistent problem where top-level hosted file convenience fields
(e.g., , , ) were
returning as  in V3 Event File API responses, even when .

Key changes include:
- Refactored  Pydantic model:
    - Removed redundant  definitions from top-level hosted file convenience fields,
      allowing direct mapping from SQL view columns.
    - Simplified  to focus solely on conditionally loading the nested
       object, as top-level fields are now populated directly by Pydantic
      from the  view.
    - Added comprehensive comments to clarify data flow, Pydantic's behavior, and the
      expected origin of these convenience fields from SQL views.
- Updated :
    - Introduced a new section detailing how to retrieve Event File data, including the
      use of  to get both top-level convenience fields and a nested
       object.
    - Clarified all ID references as random string IDs.
    - Renumbered the troubleshooting section.
- Copied updated guide to .
- Continued ID Vision compliance audit, ensuring consistent handling of random string IDs
  across various core and event models (Account, Address, Contact, DataStore, Event Badge Template).
- Consolidated ID Vision E2E tests and updated related documentation.
- Minor updates to  and
  to support Event File data retrieval with .
2026-02-19 15:22:17 -05:00

104 lines
3.8 KiB
Python

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.")