re-uploading work

This commit is contained in:
2026-02-04 17:46:30 -06:00
commit 3b14c65998
1388 changed files with 381262 additions and 0 deletions

393
tests/QUICK_START.md Normal file
View File

@@ -0,0 +1,393 @@
# E2E Testing Quick Start Guide
**Last Updated**: 2026-01-22
**Status**: ✅ Infrastructure Ready - Quick Test Passing (3/3)
---
## Prerequisites
- **Attune API service running** on `http://localhost:8080` (or set `ATTUNE_API_URL`)
- Python 3.8+ installed
- Internet connection (for downloading test dependencies)
---
## Quick Validation (No Setup Required)
Test basic connectivity without installing dependencies:
```bash
cd tests
python3 quick_test.py
```
**Expected Output:**
```
============================================================
Attune E2E Quick Test
============================================================
API URL: http://localhost:8080
Testing /health endpoint...
✓ Health check passed: {'status': 'ok'}
Testing authentication...
Attempting registration...
⚠ Registration returned: 200
Attempting login...
✓ Login successful, got token: eyJ0eXAiOiJKV1QiLCJh...
✓ Authenticated as: test@attune.local
Testing pack endpoints...
Fetching pack list...
✓ Pack list retrieved: 0 packs found
============================================================
Test Summary
============================================================
✓ PASS Health Check
✓ PASS Authentication
✓ PASS Pack Endpoints
------------------------------------------------------------
Total: 3/3 passed
============================================================
✓ All tests passed! E2E environment is ready.
```
---
## Full Test Suite
### 1. Setup (First Time Only)
```bash
cd tests
./run_e2e_tests.sh --setup
```
This will:
- Create a Python virtual environment at `tests/venvs/e2e`
- Install all test dependencies (pytest, requests, etc.)
- Verify dependencies are installed correctly
### 2. Run Tests
**Basic run:**
```bash
./run_e2e_tests.sh
```
**Verbose output (recommended):**
```bash
./run_e2e_tests.sh -v
```
**Run specific test:**
```bash
./run_e2e_tests.sh -k "test_api_health"
```
**Stop on first failure:**
```bash
./run_e2e_tests.sh -s
```
**With coverage report:**
```bash
./run_e2e_tests.sh --coverage
```
**All options:**
```bash
./run_e2e_tests.sh -h
```
### 3. Cleanup
```bash
./run_e2e_tests.sh --teardown
```
This removes:
- Test artifacts
- Log files
- Pytest cache
- Coverage reports
---
## Manual Test Execution (Advanced)
If you prefer to run pytest directly:
```bash
# Activate virtual environment
source tests/venvs/e2e/bin/activate
# Run tests
cd tests
pytest test_e2e_basic.py -v
# Deactivate when done
deactivate
```
---
## Environment Variables
Configure test behavior via environment variables:
```bash
# API endpoint (default: http://localhost:8080)
export ATTUNE_API_URL="http://localhost:8080"
# Test timeout in seconds (default: 60)
export TEST_TIMEOUT="60"
# Then run tests
./run_e2e_tests.sh -v
```
---
## Troubleshooting
### API Service Not Running
**Error:**
```
✗ API service is not reachable at http://localhost:8080
```
**Solution:**
```bash
# Start API service
cd crates/api
cargo run --release
```
### Authentication Fails
**Error:**
```
✗ Login failed: 422 Client Error: Unprocessable Entity
```
**Common Causes:**
1. **Wrong field names**: Must use `"login"` not `"username"`
2. **Password too short**: Minimum 8 characters required
3. **Missing fields**: Both `login` and `password` are required
**Test credentials:**
- Login: `test@attune.local`
- Password: `TestPass123!` (min 8 chars)
### Import Errors
**Error:**
```
ModuleNotFoundError: No module named 'pytest'
```
**Solution:**
```bash
# Run setup first
./run_e2e_tests.sh --setup
# Or manually install dependencies
pip install -r tests/requirements.txt
```
### Pack Registration Fails
**Error:**
```
FileNotFoundError: [Errno 2] No such file or directory: 'tests/fixtures/packs/test_pack'
```
**Solution:**
```bash
# Verify you're in the project root
pwd # Should end with /attune
# Check test pack exists
ls -la tests/fixtures/packs/test_pack/
# If missing, the repository may be incomplete
```
---
## Test Scenarios
### Currently Implemented
1.**Health Check** - Validates API is responding
2.**Authentication** - User registration and login
3.**Pack Registration** - Register test pack from local directory
4.**Action Creation** - Create simple echo action
5.**Timer Trigger Flow** - Create trigger, action, and rule (infrastructure only)
6. 🔄 **Manual Execution** - Direct action execution (pending endpoint)
### Planned (Phase 3)
- Timer automation flow (sensor → event → rule → execution)
- Workflow execution (3-task sequential workflow)
- FIFO queue ordering (concurrency limits)
- Inquiry (human-in-the-loop) flows
- Secret management across services
- Error handling and retry logic
- WebSocket notifications
- Dependency isolation (per-pack venvs)
---
## API Endpoint Reference
### Health Endpoints (No Auth)
- `GET /health` - Basic health check
- `GET /health/detailed` - Health with database status
- `GET /health/ready` - Readiness probe
- `GET /health/live` - Liveness probe
### Authentication Endpoints (No Auth)
- `POST /auth/register` - Register new user
- `POST /auth/login` - Login and get JWT token
- `POST /auth/refresh` - Refresh access token
### Protected Endpoints (Auth Required)
- `GET /auth/me` - Get current user info
- `POST /auth/change-password` - Change password
- `GET /api/v1/packs` - List packs
- `POST /api/v1/packs/register` - Register pack
- `GET /api/v1/actions` - List actions
- `POST /api/v1/actions` - Create action
- And all other `/api/v1/*` endpoints...
---
## Authentication Schema
### Register Request
```json
{
"login": "newuser@example.com", // Min 3 chars (NOT "username")
"password": "SecurePass123!", // Min 8 chars, max 128
"display_name": "New User" // Optional (NOT "full_name")
}
```
### Login Request
```json
{
"login": "user@example.com", // NOT "username"
"password": "SecurePass123!" // Min 8 chars
}
```
### Login Response
```json
{
"data": {
"access_token": "eyJ0eXAiOiJKV1QiLCJh...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJh...",
"token_type": "Bearer",
"expires_in": 3600,
"user": {
"id": 1,
"login": "user@example.com",
"display_name": "User Name"
}
}
}
```
---
## CI/CD Integration
### GitHub Actions Example
```yaml
name: E2E Tests
on: [push, pull_request]
jobs:
e2e-tests:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:14
env:
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
rabbitmq:
image: rabbitmq:3.12-management
options: >-
--health-cmd "rabbitmq-diagnostics ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Setup Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
- name: Start API Service
run: |
cd crates/api
cargo run --release &
sleep 5
- name: Run E2E Tests
run: |
./tests/run_e2e_tests.sh --setup -v
- name: Upload Test Reports
if: always()
uses: actions/upload-artifact@v3
with:
name: e2e-test-reports
path: tests/htmlcov/
```
---
## Getting Help
- **Documentation**: See `tests/README.md` for detailed test scenarios
- **Work Summary**: `work-summary/2026-01-22-e2e-testing-phase2.md`
- **Issues**: Check service logs in `tests/logs/` (if running via scripts)
- **Quick Test**: Use `python3 tests/quick_test.py` to isolate API connectivity issues
---
## Status Summary
| Component | Status | Notes |
|-----------|--------|-------|
| Test Infrastructure | ✅ Complete | AttuneClient, fixtures, runner |
| Quick Test | ✅ Passing | 3/3 tests passing |
| Basic Tests | 🔄 Partial | 5 scenarios implemented |
| Advanced Tests | 📋 Planned | Timer flow, workflows, FIFO |
| CI/CD Integration | 📋 Planned | GitHub Actions workflow |
**Last Validation**: 2026-01-22 - Quick test confirmed: health ✓, auth ✓, pack endpoints ✓
---
**Ready to test? Start here:** `./tests/run_e2e_tests.sh --setup -v`