Files
attune/tests/E2E_QUICK_START.md
2026-02-04 17:46:30 -06:00

463 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# E2E Test Quick Start Guide
**Last Updated**: 2026-01-27
**Status**: Ready for Testing
---
## Overview
This guide helps you quickly get started with running end-to-end (E2E) integration tests for the Attune platform.
### Test Structure
```
tests/
├── e2e/ # New tiered test structure
│ ├── tier1/ # Core automation flows (MVP essential)
│ │ ├── test_t1_01_interval_timer.py
│ │ ├── test_t1_02_date_timer.py
│ │ └── test_t1_04_webhook_trigger.py
│ ├── tier2/ # Orchestration & data flow (coming soon)
│ └── tier3/ # Advanced features (coming soon)
├── helpers/ # Test utilities
│ ├── __init__.py
│ ├── client.py # AttuneClient API wrapper
│ ├── polling.py # Wait/poll utilities
│ └── fixtures.py # Test data creators
├── fixtures/ # Test data
│ └── packs/
│ └── test_pack/
├── conftest.py # Pytest configuration
├── pytest.ini # Pytest settings
├── requirements.txt # Python dependencies
└── run_e2e_tests.sh # Test runner script
```
---
## Prerequisites
### 1. Services Running
All 5 Attune services must be running:
```bash
# Terminal 1 - API Service
cd crates/api
cargo run
# Terminal 2 - Executor Service
cd crates/executor
cargo run
# Terminal 3 - Worker Service
cd crates/worker
cargo run
# Terminal 4 - Sensor Service
cd crates/sensor
cargo run
# Terminal 5 - Notifier Service
cd crates/notifier
cargo run
```
### 2. Database & Message Queue
```bash
# PostgreSQL (if not already running)
docker run -d --name postgres \
-e POSTGRES_PASSWORD=postgres \
-p 5432:5432 \
postgres:14
# RabbitMQ (if not already running)
docker run -d --name rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:3-management
```
### 3. Database Migrations
```bash
# Ensure migrations are applied
sqlx migrate run
```
---
## Quick Start
### Option 1: Automated Runner (Recommended)
```bash
# Run all tests with automatic setup
cd tests
./run_e2e_tests.sh --setup
# Run specific tier
./run_e2e_tests.sh --tier 1
# Run with verbose output
./run_e2e_tests.sh --tier 1 -v
# Run and stop on first failure
./run_e2e_tests.sh --tier 1 -s
```
### Option 2: Direct Pytest
```bash
cd tests
# Install dependencies first (one-time setup)
python3 -m venv venvs/e2e
source venvs/e2e/bin/activate
pip install -r requirements.txt
# Run all Tier 1 tests
pytest e2e/tier1/ -v
# Run specific test
pytest e2e/tier1/test_t1_01_interval_timer.py -v
# Run by marker
pytest -m tier1 -v
pytest -m webhook -v
pytest -m timer -v
# Run with live output
pytest e2e/tier1/ -v -s
```
---
## Test Tiers
### Tier 1: Core Automation Flows ✅
**Status**: 3 tests implemented
**Priority**: Critical (MVP)
**Duration**: ~2 minutes total
Tests implemented:
-**T1.1**: Interval Timer Automation (30s)
-**T1.2**: Date Timer One-Shot Execution (15s)
-**T1.4**: Webhook Trigger with Payload (20s)
Tests pending:
-**T1.3**: Cron Timer Execution
-**T1.5**: Workflow with Array Iteration
-**T1.6**: Key-Value Store Access
-**T1.7**: Multi-Tenant Isolation
-**T1.8**: Action Failure Handling
Run with:
```bash
./run_e2e_tests.sh --tier 1
```
### Tier 2: Orchestration & Data Flow ⏳
**Status**: Not yet implemented
**Priority**: High
**Tests**: Workflows, inquiries, error handling
Coming soon!
### Tier 3: Advanced Features ⏳
**Status**: Not yet implemented
**Priority**: Medium
**Tests**: Performance, security, edge cases
Coming soon!
---
## Example Test Run
```bash
$ cd tests
$ ./run_e2e_tests.sh --tier 1
╔════════════════════════════════════════════════════════╗
║ Attune E2E Integration Test Suite ║
╚════════════════════════════════════════════════════════╝
Tier 1: Core Automation Flows (MVP Essential)
Tests: Timers, Webhooks, Basic Workflows
Checking if Attune services are running...
✓ API service is running at http://localhost:8080
═══ Running Tier 1 Tests
Command: pytest e2e/tier1/ -v -m tier1
======================== test session starts =========================
platform linux -- Python 3.11.0, pytest-7.4.3
rootdir: /path/to/attune/tests
configfile: pytest.ini
testpaths: tests/e2e
plugins: timeout-2.1.0, asyncio-0.21.0
collected 6 items
e2e/tier1/test_t1_01_interval_timer.py::TestIntervalTimerAutomation::test_interval_timer_creates_executions PASSED
e2e/tier1/test_t1_01_interval_timer.py::TestIntervalTimerAutomation::test_interval_timer_precision PASSED
e2e/tier1/test_t1_02_date_timer.py::TestDateTimerAutomation::test_date_timer_fires_once PASSED
e2e/tier1/test_t1_02_date_timer.py::TestDateTimerAutomation::test_date_timer_past_date PASSED
e2e/tier1/test_t1_04_webhook_trigger.py::TestWebhookTrigger::test_webhook_trigger_with_payload PASSED
e2e/tier1/test_t1_04_webhook_trigger.py::TestWebhookTrigger::test_multiple_webhook_posts PASSED
======================= 6 passed in 85.32s ==========================
✓ All tests passed!
╔════════════════════════════════════════════════════════╗
║ ✓ All E2E tests passed successfully ║
╚════════════════════════════════════════════════════════╝
```
---
## Configuration
### Environment Variables
```bash
# API URL (default: http://localhost:8080)
export ATTUNE_API_URL="http://localhost:8080"
# Test timeout in seconds (default: 60)
export TEST_TIMEOUT="60"
# Test user credentials (optional)
export TEST_USER_LOGIN="test@attune.local"
export TEST_USER_PASSWORD="TestPass123!"
```
### pytest.ini Settings
Key configuration in `tests/pytest.ini`:
- Test discovery patterns
- Markers for test categorization
- Logging configuration
- Timeout settings
---
## Troubleshooting
### Services Not Running
**Error**: `API service is not reachable`
**Solution**:
1. Check all 5 services are running (see Prerequisites)
2. Verify API responds: `curl http://localhost:8080/health`
3. Check service logs for errors
### Tests Timing Out
**Error**: `TimeoutError: Execution did not reach status 'succeeded'`
**Possible Causes**:
- Executor service not running
- Worker service not consuming queue
- RabbitMQ connection issues
- Sensor service not detecting triggers
**Solution**:
1. Check all services are running: `ps aux | grep attune`
2. Check RabbitMQ queues: http://localhost:15672 (guest/guest)
3. Check database: `psql -d attune_dev -c "SELECT * FROM attune.execution ORDER BY created DESC LIMIT 5;"`
4. Increase timeout: `export TEST_TIMEOUT=120`
### Import Errors
**Error**: `ModuleNotFoundError: No module named 'helpers'`
**Solution**:
```bash
# Make sure you're in the tests directory
cd tests
# Activate venv
source venvs/e2e/bin/activate
# Install dependencies
pip install -r requirements.txt
# Set PYTHONPATH
export PYTHONPATH="$PWD:$PYTHONPATH"
```
### Database Issues
**Error**: `Database connection failed` or `Relation does not exist`
**Solution**:
```bash
# Verify database exists
psql -U postgres -l | grep attune
# Run migrations
cd /path/to/attune
sqlx migrate run
# Check tables exist
psql -d attune_dev -c "\dt attune.*"
```
### Test Isolation Issues
**Problem**: Tests interfere with each other
**Solution**:
- Use `unique_user_client` fixture for complete isolation
- Tests automatically get unique references via `unique_ref()`
- Each test creates its own resources (pack, trigger, action, rule)
### Flaky Timer Tests
**Problem**: Timer tests occasionally fail with timing issues
**Solution**:
- Timer tests have built-in tolerance (±1-2 seconds)
- System load can affect timing - run on idle system
- Increase poll intervals if needed
- Check sensor service logs for timer processing
---
## Writing New Tests
### Test Template
```python
#!/usr/bin/env python3
"""
T1.X: Test Name
Test description and flow.
"""
import pytest
from helpers import (
AttuneClient,
create_echo_action,
create_rule,
wait_for_execution_status,
)
@pytest.mark.tier1 # or tier2, tier3
@pytest.mark.integration
@pytest.mark.timeout(30)
class TestMyFeature:
"""Test my feature"""
def test_my_scenario(self, client: AttuneClient, pack_ref: str):
"""Test that my scenario works"""
print(f"\n=== T1.X: Test Name ===")
# Step 1: Create resources
print("\n[1/3] Creating resources...")
action = create_echo_action(client=client, pack_ref=pack_ref)
print(f"✓ Action created: {action['ref']}")
# Step 2: Execute action
print("\n[2/3] Executing action...")
# ... test logic ...
# Step 3: Verify results
print("\n[3/3] Verifying results...")
# ... assertions ...
print("\n✓ Test PASSED")
```
### Available Helpers
**Fixtures** (conftest.py):
- `client` - Authenticated API client
- `unique_user_client` - Client with unique user (isolation)
- `test_pack` - Test pack fixture
- `pack_ref` - Pack reference string
- `wait_time` - Standard wait time dict
**Client Methods** (helpers/client.py):
- `client.register_pack(path)`
- `client.create_action(...)`
- `client.create_trigger(...)`
- `client.create_rule(...)`
- `client.fire_webhook(id, payload)`
- `client.list_executions(...)`
- `client.get_execution(id)`
**Polling Utilities** (helpers/polling.py):
- `wait_for_execution_status(client, id, status, timeout)`
- `wait_for_execution_count(client, count, ...)`
- `wait_for_event_count(client, count, ...)`
- `wait_for_condition(fn, timeout, ...)`
**Fixture Creators** (helpers/fixtures.py):
- `create_interval_timer(client, seconds, ...)`
- `create_date_timer(client, fire_at, ...)`
- `create_cron_timer(client, expression, ...)`
- `create_webhook_trigger(client, ...)`
- `create_echo_action(client, ...)`
- `create_rule(client, trigger_id, action_ref, ...)`
---
## Next Steps
1. **Run existing tests** to verify setup:
```bash
./run_e2e_tests.sh --tier 1
```
2. **Implement remaining Tier 1 tests**:
- T1.3: Cron Timer
- T1.5: Workflow with-items
- T1.6: Datastore access
- T1.7: Multi-tenancy
- T1.8: Error handling
3. **Implement Tier 2 tests** (orchestration)
4. **Implement Tier 3 tests** (advanced features)
5. **CI/CD Integration**:
- Add GitHub Actions workflow
- Run tests on every PR
- Generate test reports
---
## Resources
- **Test Plan**: `docs/e2e-test-plan.md` - Complete test specifications
- **Test Status**: `docs/testing-status.md` - Current testing coverage
- **API Docs**: `docs/api-*.md` - API endpoint documentation
- **Architecture**: `docs/` - System architecture documentation
---
## Support
If you encounter issues:
1. Check service logs in each terminal
2. Verify database state: `psql -d attune_dev`
3. Check RabbitMQ management UI: http://localhost:15672
4. Review test output for detailed error messages
5. Enable verbose output: `./run_e2e_tests.sh -v -s`
**Status**: Ready to run! 🚀