# API Endpoint Tests

This directory contains comprehensive integration tests for all FastAPI REST API endpoints in the Aniworld web application.

## Test Files

### 1. test_auth_endpoints.py

Tests for authentication API endpoints (`/api/auth/*`):

-   ✅ Master password setup flow
-   ✅ Login with valid/invalid credentials
-   ✅ Authentication status checking
-   ✅ Token-based authentication
-   ✅ Logout functionality
-   ⚠️ Rate limiting behavior (some race conditions with trio backend)

**Status**: 1/2 tests passing (asyncio: ✅, trio: ⚠️ rate limiting)

### 2. test_anime_endpoints.py

Tests for anime management API endpoints (`/api/v1/anime/*`):

-   ✅ List anime series with missing episodes
-   ✅ Get anime series details
-   ✅ Trigger rescan of local anime library
-   ✅ Search for anime series
-   ✅ Unauthorized access handling
-   ✅ Direct function call tests
-   ✅ HTTP endpoint integration tests

**Status**: 11/11 tests passing ✅

### 3. test_config_endpoints.py

Tests for configuration API endpoints (`/api/config/*`):

-   ⚠️ Get current configuration
-   ⚠️ Validate configuration
-   ⚠️ Update configuration (authenticated)
-   ⚠️ List configuration backups
-   ⚠️ Create configuration backup
-   ⚠️ Restore from backup
-   ⚠️ Delete backup
-   ⚠️ Configuration persistence

**Status**: 0/18 tests passing - needs authentication fixes

**Issues**:

-   Config endpoints require authentication but tests need proper auth client fixture
-   Mock config service may need better integration

### 4. test_download_endpoints.py

Tests for download queue API endpoints (`/api/queue/*`):

-   ⚠️ Get queue status and statistics
-   ⚠️ Add episodes to download queue
-   ⚠️ Remove items from queue (single/multiple)
-   ⚠️ Start/stop/pause/resume queue
-   ⚠️ Reorder queue items
-   ⚠️ Clear completed downloads
-   ⚠️ Retry failed downloads
-   ✅ Unauthorized access handling (2/2 tests passing)

**Status**: 2/36 tests passing - fixture dependency issues

**Issues**:

-   `authenticated_client` fixture dependency on `mock_download_service` causing setup errors
-   Authentication rate limiting across test runs
-   Need proper mocking of download service dependencies

## Test Infrastructure

### Fixtures

#### Common Fixtures

-   `reset_auth_state`: Auto-use fixture that clears rate limiting state between tests
-   `authenticated_client`: Creates async client with valid JWT token
-   `client`: Creates unauthenticated async client

#### Service-Specific Fixtures

-   `mock_download_service`: Mocks DownloadService for testing download endpoints
-   `mock_config_service`: Mocks ConfigService with temporary config files
-   `temp_config_dir`: Provides temporary directory for config test isolation

### Testing Patterns

#### Async/Await Pattern

All tests use `pytest.mark.anyio` decorator for async test support:

```python
@pytest.mark.anyio
async def test_example(authenticated_client):
    response = await authenticated_client.get("/api/endpoint")
    assert response.status_code == 200
```

#### Authentication Testing

Tests use fixture-based authentication:

```python
@pytest.fixture
async def authenticated_client():
    """Create authenticated async client."""
    if not auth_service.is_configured():
        auth_service.setup_master_password("TestPass123!")

    transport = ASGITransport(app=app)
    async with AsyncClient(transport=transport, base_url="http://test") as client:
        r = await client.post("/api/auth/login", json={"password": "TestPass123!"})
        token = r.json()["access_token"]
        client.headers["Authorization"] = f"Bearer {token}"
        yield client
```

#### Service Mocking

External dependencies are mocked using `unittest.mock`:

```python
@pytest.fixture
def mock_download_service():
    """Mock DownloadService for testing."""
    with patch("src.server.utils.dependencies.get_download_service") as mock:
        service = MagicMock()
        service.get_queue_status = AsyncMock(return_value=QueueStatus(...))
        mock.return_value = service
        yield service
```

## Running Tests

### Run All API Tests

```bash
conda run -n AniWorld python -m pytest tests/api/ -v
```

### Run Specific Test File

```bash
conda run -n AniWorld python -m pytest tests/api/test_auth_endpoints.py -v
```

### Run Specific Test

```bash
conda run -n AniWorld python -m pytest tests/api/test_auth_endpoints.py::test_auth_flow_setup_login_status_logout -v
```

### Run Only Asyncio Tests (Skip Trio)

```bash
conda run -n AniWorld python -m pytest tests/api/ -v -k "asyncio or not anyio"
```

### Run with Detailed Output

```bash
conda run -n AniWorld python -m pytest tests/api/ -v --tb=short
```

## Current Test Status

### Summary

-   **Total Tests**: 71
-   **Passing**: 16 (22.5%)
-   **Failing**: 19 (26.8%)
-   **Errors**: 36 (50.7%)

### By Category

1. **Anime Endpoints**: 11/11 ✅ (100%)
2. **Auth Endpoints**: 1/2 ✅ (50%) - trio race condition
3. **Config Endpoints**: 0/18 ❌ (0%) - authentication issues
4. **Download Endpoints**: 2/36 ⚠️ (5.6%) - fixture dependency issues

## Known Issues

### 1. Rate Limiting Race Conditions

**Symptom**: Tests fail with 429 (Too Many Requests) when run with trio backend
**Solution**:

-   Fixed for asyncio by adding `reset_auth_state` fixture
-   Trio still has timing issues with shared state
-   Recommend running tests with asyncio only: `-k "asyncio or not anyio"`

### 2. Download Service Fixture Dependencies

**Symptom**: `authenticated_client` fixture fails when it depends on `mock_download_service`
**Error**: `assert 429 == 200` during login
**Solution**: Need to refactor fixture dependencies to avoid circular authentication issues

### 3. Config Endpoint Authentication

**Symptom**: Config endpoints return 404 or authentication errors
**Solution**:

-   ✅ Added config router to fastapi_app.py
-   ⚠️ Still need to verify authentication requirements and update test fixtures

## Improvements Needed

### High Priority

1. **Fix Download Endpoint Tests**: Resolve fixture dependency issues
2. **Fix Config Endpoint Tests**: Ensure proper authentication in tests
3. **Resolve Trio Rate Limiting**: Investigate shared state issues

### Medium Priority

1. **Add More Edge Cases**: Test boundary conditions and error scenarios
2. **Improve Test Coverage**: Add tests for WebSocket endpoints
3. **Performance Tests**: Add tests for high-load scenarios

### Low Priority

1. **Test Documentation**: Add more inline documentation
2. **Test Utilities**: Create helper functions for common test patterns
3. **CI/CD Integration**: Set up automated test runs

## Contributing

When adding new API endpoint tests:

1. **Follow Existing Patterns**: Use the same fixture and assertion patterns
2. **Test Both Success and Failure**: Include positive and negative test cases
3. **Use Proper Fixtures**: Leverage existing fixtures for authentication and mocking
4. **Document Test Purpose**: Add clear docstrings explaining what each test validates
5. **Clean Up State**: Use fixtures to ensure tests are isolated and don't affect each other

## References

-   [FastAPI Testing Documentation](https://fastapi.tiangolo.com/tutorial/testing/)
-   [Pytest Documentation](https://docs.pytest.org/)
-   [HTTPX AsyncClient Documentation](https://www.python-httpx.org/advanced/)
-   [Project Coding Guidelines](../../.github/copilot-instructions.md)
