techprotrade's picture
Deploy ATOM FastAPI command center runtime (part 8)
aef804e verified
|
Raw
History Blame Contribute Delete
12.3 kB
# Mobile API Testing
## Overview
Mobile API testing provides API-level test coverage for mobile app functionality without the overhead of UI automation. Tests use FastAPI's TestClient for in-memory API testing, making them 10-100x faster than browser-based tests.
### Key Benefits
- **API-First Approach**: Direct API calls (no browser or mobile device needed)
- **Fast Execution**: <10ms per request with TestClient (no network overhead)
- **Consistency**: Response structure matches web API for cross-platform compatibility
- **Governance**: Tests verify agent maturity and permission enforcement
- **CI/CD Friendly**: Graceful skip when device hardware not available
## Prerequisites
- Python 3.11+
- FastAPI TestClient (included with FastAPI)
- Test database (SQLite or PostgreSQL)
- Authentication fixtures (from `mobile_api.fixtures.mobile_fixtures`)
## Running Tests
### Run All Mobile API Tests
```bash
# From project root
pytest backend/tests/mobile_api/ -v
# With coverage
pytest backend/tests/mobile_api/ --cov=backend/api --cov-report=html
# With detailed output
pytest backend/tests/mobile_api/ -v -s
```
### Run Specific Test Files
```bash
# Authentication tests
pytest backend/tests/mobile_api/test_mobile_auth.py -v
# Agent execution tests
pytest backend/tests/mobile_api/test_mobile_agent_execution.py -v
# Workflow execution tests
pytest backend/tests/mobile_api/test_mobile_workflow_execution.py -v
# Device features tests
pytest backend/tests/mobile_api/test_mobile_device_features.py -v
```
### Run Specific Test Classes or Tests
```bash
# Run specific test class
pytest backend/tests/mobile_api/test_mobile_auth.py::TestMobileLogin -v
# Run specific test
pytest backend/tests/mobile_api/test_mobile_auth.py::TestMobileLogin::test_mobile_login_success -v
# Run tests matching pattern
pytest backend/tests/mobile_api/ -k "login" -v
```
## Test Categories
### 1. Authentication Tests (`test_mobile_auth.py`)
Tests for authentication endpoints:
- **Login Success**: Valid credentials return access token
- **Login Failure**: Invalid credentials return 401 error
- **Token Refresh**: Returns new access token
- **Token Validation**: `/api/auth/me` returns user data
- **Logout**: Invalidates token (client-side)
**Coverage**:
- `POST /api/auth/login`
- `POST /api/auth/refresh`
- `GET /api/auth/me`
- `POST /api/auth/logout`
### 2. Agent Execution Tests (`test_mobile_agent_execution.py`)
Tests for agent execution endpoints:
- **Agent Execute**: Sync execution with query
- **Agent Execute with Params**: Custom parameters passed correctly
- **Agent Stream**: Streaming execution via WebSocket
- **Agent Governance**: Maturity level enforcement (STUDENT/INTERN/SUPERVISED/AUTONOMOUS)
- **Agent History**: Execution history listing
**Coverage**:
- `GET /api/v1/agents`
- `POST /api/v1/agents/{agent_id}/execute`
- `POST /api/atom-agent/chat`
- `POST /api/atom-agent/chat/stream`
- `GET /api/v1/agents/executions`
### 3. Workflow Execution Tests (`test_mobile_workflow_execution.py`)
Tests for workflow execution endpoints:
- **Workflow Create**: Create new workflow
- **Workflow Add Skill**: Add skills to workflow
- **Workflow Execute**: Run workflow with input
- **Workflow DAG Validation**: Detect cyclic dependencies
- **Workflow History**: Execution history with pagination
**Coverage**:
- `GET /api/v1/workflows`
- `POST /api/v1/workflows`
- `POST /api/v1/workflows/{workflow_id}/skills`
- `POST /api/v1/workflows/{workflow_id}/execute`
- `POST /api/v1/workflows/validate`
- `GET /api/v1/workflows/executions`
### 4. Device Features Tests (`test_mobile_device_features.py`)
Tests for device hardware access:
- **Camera Capture**: Image capture with quality settings
- **Location**: GPS coordinates with accuracy
- **Notifications**: Push notifications
- **Device Capabilities**: List available features
- **Device Permissions**: Permission status (granted/denied)
- **Screen Recording**: Start/stop recording (SUPERVISED+ required)
**Coverage**:
- `POST /api/v1/device/capture`
- `GET /api/v1/device/location`
- `POST /api/v1/device/notifications`
- `GET /api/v1/device/capabilities`
- `GET /api/v1/device/permissions`
- `POST /api/v1/device/screen-record/start`
- `POST /api/v1/device/screen-record/stop`
## Fixtures
Mobile API tests use these fixtures from `mobile_api.fixtures.mobile_fixtures`:
### `mobile_test_user`
Creates a test user with UUID v4 email for uniqueness.
```python
def test_with_user(mobile_test_user):
assert mobile_test_user.email.endswith("@example.com")
assert mobile_test_user.status == "active"
```
### `mobile_auth_token`
Returns JWT access token for authenticated requests.
```python
def test_with_token(mobile_auth_token):
headers = {"Authorization": f"Bearer {mobile_auth_token}"}
# Make authenticated request
```
### `mobile_auth_headers`
Returns Authorization headers dict with Bearer token.
```python
def test_authenticated(mobile_api_client, mobile_auth_headers):
response = mobile_api_client.get("/api/v1/agents", headers=mobile_auth_headers)
assert response.status_code == 200
```
### `mobile_api_client`
FastAPI TestClient for in-memory API testing (no server startup).
```python
def test_api_call(mobile_api_client):
response = mobile_api_client.post("/api/auth/login", json={
"username": "test@example.com",
"password": "password"
})
assert response.status_code == 200
```
### `mobile_authenticated_client`
Helper function that makes authenticated requests automatically.
```python
def test_auth_call(mobile_authenticated_client):
response = mobile_authenticated_client("GET", "/api/v1/agents")
assert response.status_code == 200
```
### `mobile_admin_user`
Creates admin user with superuser privileges.
```python
def test_admin_endpoint(mobile_admin_user):
admin, token = mobile_admin_user
assert admin.role == "super_admin"
```
## Consistency with Web API
Mobile API responses match web API responses for consistency:
### Authentication Response
```json
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer"
}
```
### Agent Execution Response
```json
{
"execution_id": "exec_abc123",
"agent_id": "agent_xyz",
"status": "completed",
"response": {
"message": "Task completed successfully"
}
}
```
### Workflow Execution Response
```json
{
"execution_id": "wf_exec_456",
"workflow_id": "workflow_789",
"status": "running",
"started_at": "2026-03-24T14:30:00Z"
}
```
## Example API Calls
### Login
```bash
curl -X POST http://localhost:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "test@example.com",
"password": "password"
}'
```
### Execute Agent
```bash
curl -X POST http://localhost:8000/api/v1/agents/agent_id/execute \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "Create a workflow for daily reports"
}'
```
### Create Workflow
```bash
curl -X POST http://localhost:8000/api/v1/workflows \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Daily Reports",
"description": "Generate daily reports",
"category": "automation"
}'
```
### Get Location
```bash
curl -X GET http://localhost:8000/api/v1/device/location \
-H "Authorization: Bearer YOUR_TOKEN"
```
## Governance Enforcement
Mobile API tests verify governance enforcement:
### Agent Maturity Levels
- **STUDENT**: Cannot execute automated triggers (blocked)
- **INTERN**: Can execute with proposal approval
- **SUPERVISED**: Executes under real-time supervision
- **AUTONOMOUS**: Full execution without oversight
### Device Feature Permissions
- **Camera**: INTERN+ maturity required
- **Location**: INTERN+ maturity required
- **Notifications**: INTERN+ maturity required
- **Screen Recording**: SUPERVISED+ maturity required
- **Command Execution**: AUTONOMOUS only
### Example Governance Test
```python
def test_mobile_device_camera_governance(mobile_api_client, mobile_auth_headers):
response = mobile_api_client.post(
"/api/v1/device/capture",
headers=mobile_auth_headers,
json={"type": "image", "quality": "high"}
)
# Should enforce governance (not succeed silently)
if response.status_code == 403:
# Governance blocked - verify error message
assert "detail" in response.json()
```
## Troubleshooting
### Common Issues
#### 1. Import Errors
```
ImportError: No module named 'core.models'
```
**Solution**: Ensure backend directory is in PYTHONPATH:
```bash
export PYTHONPATH=/Users/rushiparikh/projects/atom/backend:$PYTHONPATH
```
#### 2. Database Session Missing
```
fixture 'mobile_test_user' not found
```
**Solution**: Ensure `db_session` fixture is available from parent conftest:
```python
# In backend/tests/mobile_api/conftest.py
from fixtures.database_fixtures import db_session
```
#### 3. Authentication Failures
```
AssertionError: 401 != 200
```
**Solution**: Verify auth token is correctly set in headers:
```python
headers = {"Authorization": f"Bearer {token}"}
```
#### 4. Endpoint Not Available
```
pytest.skip: Endpoint not implemented
```
**Solution**: This is expected behavior. Tests gracefully skip when endpoints are not available.
#### 5. Device Hardware Not Available
```
pytest.skip: Camera not available in test environment
```
**Solution**: Expected in CI/CD. Tests use graceful skip when hardware unavailable.
### Debug Mode
Run tests with verbose output and print statements:
```bash
pytest backend/tests/mobile_api/ -v -s --tb=short
```
### Stop on First Failure
```bash
pytest backend/tests/mobile_api/ -v -x
```
### Run Failed Tests Only
```bash
pytest backend/tests/mobile_api/ -v --lf
```
## Performance
### TestClient vs Real HTTP
| Method | Latency | Use Case |
|--------|---------|----------|
| TestClient (in-memory) | <10ms | Unit tests, CI/CD |
| Real HTTP (localhost) | ~50ms | Integration tests |
| Real HTTP (remote) | ~200ms | End-to-end tests |
### Optimization Tips
1. **Use TestClient**: Fastest option for API testing
2. **Reuse Fixtures**: Fixtures cache expensive operations
3. **Parallel Execution**: Use `pytest-xdist` for parallel tests
4. **Skip Slow Tests**: Use markers for slow integration tests
```bash
# Run tests in parallel
pytest backend/tests/mobile_api/ -n auto
# Skip slow tests
pytest backend/tests/mobile_api/ -v -m "not slow"
```
## Integration with CI/CD
### GitHub Actions Example
```yaml
name: Mobile API Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pytest pytest-cov
- name: Run mobile API tests
run: |
pytest backend/tests/mobile_api/ -v --cov=backend/api
- name: Upload coverage
uses: codecov/codecov-action@v3
```
## Further Reading
- [Backend API Documentation](../../docs/API_DOCUMENTATION.md)
- [Agent Governance System](../../docs/AGENT_GOVERNANCE_SYSTEM.md)
- [Device Capabilities](../../docs/DEVICE_CAPABILITIES.md)
- [Testing Best Practices](../../docs/CODE_QUALITY_STANDARDS.md)
## Contributing
When adding new mobile API tests:
1. Use API-first approach (TestClient, no browser)
2. Follow existing test structure (classes and test names)
3. Add graceful skip for missing endpoints/hardware
4. Verify response structure matches web API
5. Test both success and failure cases
6. Include governance tests where applicable
## License
Internal testing framework for Atom platform.