- New router: app/routers/api_v3_actions_event_exhibit.py
- GET /v3/action/event_exhibit/{exhibit_id}/tracking_export
- Full V3 auth (x-aether-api-key + account context)
- Multi-tenant ownership check via check_account_access
- Permission gate: leads_api_access flag OR manager-level access
- Returns CSV or XLSX file attachment (return_file=false for JSON)
- Flattens responses_json custom Q&A columns; strips HTML from exhibitor_notes
- Exports all records regardless of hidden/enabled state
- Registered in registry.py under prefix /v3/action/event_exhibit
- New E2E test: tests/e2e/test_e2e_v3_action_event_exhibit_tracking_export.py
- 7/7 tests passing against dev-api.oneskyit.com
- Docs: GUIDE__AE_API_V3_for_Frontend.md — new Section 7 covering endpoint
usage, columns, leads_api_access dual-purpose (3rd-party API + UI export gate)
- Docs: tests/README.md — added test to table and when-to-run matrix
8.4 KiB
Aether API Test Suite
This directory contains the automated and manual test scripts for the Aether FastAPI backend. The suite is organized by execution environment and scope to ensure a reliable development workflow.
📁 Directory Structure
unit/: Isolated logic tests. These use heavy mocking to bypass database and network requirements. Fast and safe to run in any environment.integration/: Local environment tests. These verify component interactions, often requiring a connection to the local MariaDB/Redis instance.e2e/(End-to-End): Network-based API tests. these use therequestslibrary to call the live API endpoints athttps://dev-api.oneskyit.com.tools/: Utility scripts for administrative tasks like registry generation or Docker exploration.archive/: Legacy or deprecated scripts kept for historical reference.
📜 Standardized E2E Suite (tests/e2e/)
These consolidated scripts are the primary verification tool for the V3 API.
| Script | Description |
|---|---|
test_e2e_v3_search_engine.py |
Primary Search: Basic operators, Registry fields, Nested search, and Filter bypass. |
test_e2e_v3_security_audit.py |
Core Security: Verifies multi-tenant isolation, cross-account write blocking, and ID Vision compliance. |
test_e2e_v3_auth_security.py |
Primary Auth: Site bootstrap, Passcode-to-JWT, and permission boundaries. |
test_e2e_v3_actions_file_lifecycle.py |
Primary Actions: Upload, Download (ID/Hash/Streaming), and physical Deletion. |
test_e2e_v3_data_store_lookup.py |
V3 Parity: Verifies code-based lookups and latency simulation. |
test_e2e_redis_extensive.py |
Redis Stress: Benchmarks bidirectional ID caching across thousands of records. |
test_e2e_v3_event_vision_parity.py |
Vision ID: Verifies string-ID enforcement across event models. |
test_e2e_v3_cms_vision_parity.py |
Vision ID: Verifies string-ID enforcement across CMS (post/comment) models. |
test_e2e_v3_core_vision_parity.py |
Vision ID: Verifies string-ID and polymorphic resolution across core models (Account, Person, Address, Contact, DataStore). |
test_e2e_v3_demo_parity.py |
Demo Parity + Nested Create Regression: Vision ID check for Badge, Exhibit, Tracking; nested create lifecycle (POST+DELETE) for journal/journal_entry and event/event_session; alias resolution. Run after any model or nested-router change. |
test_e2e_v3_action_event_file.py |
Event Actions: Specialized atomic upload and linking for event files. |
test_e2e_v3_action_zoom.py |
Zoom Integration: Verifies OAuth and ticket sync logic for Zoom Events. |
test_e2e_v3_action_event_exhibit_tracking_export.py |
Exhibit Leads Export: Auth/permission guards, CSV column structure, XLSX bytes, and return_file mode for the V3 tracking export action. |
test_e2e_v3_accounts.py |
CRUD verification for the core Account object. |
test_e2e_v3_schema.py |
Network verification of the V3 metadata discovery endpoint. |
test_e2e_agent_bridge.py |
Verifies container diagnostics and log streaming routes. |
cleanup_test_files.py |
Utility to purge E2E artifacts from physical storage. |
🛠️ Shared Helpers
mock_config_helper.py: A critical utility that mocksapp.config.settingsbefore other modules are imported. Use this in unit tests.
🚦 When to Run Tests
Tests exist to be used — run the relevant suite whenever you touch backend code, not just when something breaks.
| Change type | Required suites |
|---|---|
Model root_validator / ID Vision changes |
test_e2e_v3_demo_parity.py, test_e2e_v3_event_vision_parity.py, test_e2e_v3_core_vision_parity.py |
Nested router (api_crud_v3_nested.py) changes |
test_e2e_v3_demo_parity.py |
| Search / filter changes | test_e2e_v3_search_engine.py |
| Auth / account context changes | test_e2e_v3_security_audit.py, test_e2e_v3_auth_security.py |
| File upload / download changes | test_e2e_v3_actions_file_lifecycle.py |
| Event exhibit tracking export changes | test_e2e_v3_action_event_exhibit_tracking_export.py |
| Any backend change before frontend hand-off | All of the above |
🧹 Maintenance Policy
- Standardization: All E2E tests should use the standard Agent API Key (
PMM4n50teUCaOMMTN8qOJA) and provide clean[✅ PASS]or[❌ FAIL]output. - Archiving: When a new specialized test is created, check if it can be combined into one of the "Primary" suites above. If so, combine and move the original to
archive/. - Cleanup: Always use
tests/e2e/cleanup_test_files.pyafter running file lifecycle tests.
🛠️ Standards & Patterns
To maintain a "nice" and readable test suite, follow these patterns in all new Python E2E scripts:
- Helper Functions: Use a
print_result(label, success, message="")helper to output standardized✅ PASSand❌ FAILstatus lines. - Functional Isolation: Wrap test scenarios in descriptive functions (e.g.,
test_hierarchical_fallback()) rather than writing monolithic scripts. - Vision Compliance: Always verify that IDs in the response are strings (Random IDs) and not integers, to ensure "ID Vision" is working.
- Performance Logging: Include a suite timer at the end of the
if __name__ == "__main__":block to track execution speed. - Clean Environment: Do not leave temporary debug or local-only scripts in the
e2e/directory.
🚀 How to Run
Recommended: Use the project virtual environment
./environment/bin/python3 tests/e2e/test_e2e_v3_search_engine.py
Path Requirements
Always run test scripts from the project root directory. Most scripts include sys.path.append(os.getcwd()) to ensure local imports work correctly.
Development / Testing / Demo environment information
- Use snake_case (or Snake_Case or Snake_case or test_NASA_example or test_API_key)
- Aether test/demo base URL: 'http://demo.localhost:5173'
- Aether development API: 'https://dev-api.oneskyit.com'
These are IDs for records that we can use for testing. Please do not delete them. They are also used for demo purposes with clients.
Core Modules
- Aether test/demo Account: '_XY7DXtc9MY' (1) "One Sky IT Demo"
- Aether test/demo Site: '92vkYC4fVEl' (12) "One Sky IT Demo"
- Aether test/demo Site Domain: '_6jcTbnJk-o' (12) "demo.localhost:5173"
- Aether test/demo Site Domain: 'heXRgHOs4ns' (30) "sk-demo.oneskyit.com"
- Aether test/demo Site Domain: 'DASm8fP92yw' (69) "dev-demo.oneskyit.com"
- Aether test/demo Site Domain: '2i_0Za6yRPo' (2) "demo.oneskyit.com"
- Aether test/demo Person: 'QWODAPCNLQU' (49) "Osiris Idem"
- Aether test/demo Person: 'HMQRNPIXQMK' (48) "Cleo Idem"
Events Modules
- Aether test/demo Event: 'pjrcghqwert' (1) "Demo One Sky IT Conference"
- Aether test/demo Event Session: 'DOW3h7v6H42' (703) "How To Do Things"
- Aether test/demo Event Session (Digital Posters): "K8cxUIEWyQk" "The Beginning of Digital Posters!"
- Aether test/demo Event Session (Digital Posters): "1Un1xI1Rgk8" "Poster Session 99: All about posters!"
- Aether test/demo Event Presentation: '7U2eXSjR6H4' (1670) "Build a House"
- Aether test/demo Event Presenter: 'gT-hxnifb-0' (2202) "Bob The Builder"
- Aether test/demo Event File: 'OOsHXtng5mr' (2985) "1 Quick Test for macOS.mp4"
- Aether test/demo Event Badge: 'UIJT-73-63-61' (37163) "Scott Idem"
- Aether test/demo Event Person: 'ffkKxiHpOEC' (16603) "Scott Idem"
- Aether test/demo Event Badge Template: 'jgfixEpYp1B' (18) "Dev Demo 202x"
- Aether test/demo Event Badge Template: 'rzmUgsk7mkq' (19) "Dev Demo 202x Workshops"
- Aether test/demo Event Location: 'VXXY-98-46-14' (26) "Ballroom 1"
- Aether test/demo Event Location: 'FGRN-67-92-45' (298) "Ballroom AB"
- Aether test/demo Event Location: 'PQKB-15-39-81' (78) "Poster Display Station A"
Journals Module
- Aether test/demo Journal: 'BVYE-94-46-29' (42) "Testing Things"
- Aether test/demo Journal Entry: 'xRx-Y4-h3-fU' (233) "Another Journal Entry in the Test Journal"
Archives Module (IDAA Archives)
- Aether test/demo Archive: 'nAA2bHLv8RK' (1) "One Sky Test Archive"
- Aether test/demo Archive Content: 'UjKzrk-GKu5' (1) "Hosted File Test"
Posts Module (IDAA Bulletin Board)
- Aether test/demo Post:
- Aether test/demo Post:
Events Module (IDAA Recovery Meetings)
- Aether test/demo Event: '1Pkd025vvxU' (36) "IDAA Recovery Meeting Test"
- Aether test/demo Event: 'gIZgAjISkf8' (43) "IDAA Recovery Meeting Test"