# 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 the `requests` library to call the live API endpoints at `https://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_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 mocks `app.config.settings` before 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` | | Any backend change before frontend hand-off | All of the above | --- ## ๐Ÿงน Maintenance Policy 1. **Standardization**: All E2E tests should use the standard Agent API Key (`PMM4n50teUCaOMMTN8qOJA`) and provide clean `[โœ… PASS]` or `[โŒ FAIL]` output. 2. **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/`. 3. **Cleanup**: Always use `tests/e2e/cleanup_test_files.py` after 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 `โœ… PASS` and `โŒ FAIL` status 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 ```bash ./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"