## Test Categories

### 1. Unit Tests (`unit/`)
- **Purpose**: Test individual functions and components in isolation
- **Scope**: Small, fast tests for specific functionality
- **Languages**: Go and Zig tests
- **Usage**: `make test-unit`

### 2. Integration Tests (`integration/`)
- **Purpose**: Test component interactions and system integration
- **Scope**: Multiple components working together
- **Dependencies**: Requires Redis, database
- **Usage**: `make test-integration`

### 3. End-to-End Tests (`e2e/`)
- **Purpose**: Test complete user workflows and system behavior
- **Scope**: Full system from user perspective
- **Dependencies**: Complete system setup
- **Usage**: `make test-e2e`

Note: Podman-based E2E (`TestPodmanIntegration`) is opt-in because it builds/runs containers.
Enable it with `FETCH_ML_E2E_PODMAN=1 go test ./tests/e2e/...`.

### 4. Performance Tests (`benchmarks/`)
- **Purpose**: Measure performance characteristics and identify bottlenecks
- **Scope**: API endpoints, ML experiments, payload handling
- **Metrics**: Latency, throughput, memory usage
- **Usage**: `make benchmark`

### 5. Load Tests (`load/`)
- **Purpose**: Test system behavior under high load
- **Scope**: Concurrent users, stress testing, spike testing
- **Scenarios**: Light, medium, heavy load patterns
- **Usage**: `make load-test`

### 6. Chaos Tests (`chaos/`)
- **Purpose**: Test system resilience and failure recovery
- **Scope**: Database failures, Redis failures, network issues
- **Scenarios**: Connection failures, resource exhaustion, high concurrency
- **Usage**: `make chaos-test`

## Test Execution

### Quick Test Commands
```bash
make test              # Run all tests
make test-unit         # Unit tests only
make test-integration  # Integration tests only
make test-e2e         # End-to-end tests only
make test-coverage    # All tests with coverage report
```

### Performance Testing Commands
```bash
make benchmark         # Run performance benchmarks
make load-test         # Run load testing suite
make chaos-test        # Run chaos engineering tests
make tech-excellence   # Run complete technical excellence suite
```

### Individual Test Execution
```bash
# Run specific benchmark
go test -bench=BenchmarkAPIServer ./tests/benchmarks/

# Run specific chaos test
go test -v ./tests/chaos/ -run TestChaosTestSuite

# Run with coverage
go test -cover ./tests/unit/
```

## Test Dependencies

### Required Services
- **Redis**: Required for integration, performance, and chaos tests
- **Database**: SQLite for local, PostgreSQL for production-like tests
- **Docker/Podman**: For container-based tests

### Test Configuration
- Test databases use isolated Redis DB numbers (4-7)
- Temporary directories used for file-based tests
- Test servers use random ports to avoid conflicts

## Best Practices

### Writing Tests
1. **Unit Tests**: Test single functions, mock external dependencies
2. **Integration Tests**: Test real component interactions
3. **Performance Tests**: Use `testing.B` for benchmarks, include memory stats
4. **Chaos Tests**: Simulate realistic failure scenarios

### Test Organization
1. **Package Naming**: Use descriptive package names (`benchmarks`, `chaos`, etc.)
2. **File Naming**: Use `*_test.go` suffix, descriptive names
3. **Test Functions**: Use `Test*` for unit tests, `Benchmark*` for performance

### Cleanup
1. **Resources**: Close database connections, Redis clients
2. **Temp Files**: Use `t.TempDir()` for temporary files
3. **Test Data**: Clean up Redis test databases after tests

## Technical Excellence Features

The test suite includes advanced testing capabilities:

- **Performance Regression Detection**: Automated detection of performance degradations
- **Chaos Engineering**: System resilience testing under failure conditions
- **Load Testing**: High-concurrency and stress testing scenarios
- **Profiling Tools**: CPU, memory, and performance profiling
- **Architecture Decision Records**: Documented technical decisions

## CI/CD Integration

All tests are integrated into the CI/CD pipeline:
- Unit tests run on every commit
- Integration tests run on PRs
- Performance tests run nightly
- Chaos tests run before releases

## Troubleshooting

### Common Issues
1. **Redis Connection**: Ensure Redis is running for integration tests
2. **Port Conflicts**: Tests use random ports, but conflicts can occur
3. **Resource Limits**: Chaos tests may hit system resource limits
4. **Test Isolation**: Ensure tests don't interfere with each other

### Debug Tips
1. Use `-v` flag for verbose output
2. Use `-run` flag to run specific tests
3. Check test logs for detailed error information
4. Use `make test-coverage` for coverage analysis
