**Reuse botserver bootstrap code** - Don't duplicate installation logic. The bootstrap module already knows how to install PostgreSQL, MinIO, Redis. We wrap it with test-specific configuration (custom ports, temp directories).
---
## Architecture
```
TestHarness::setup()
│
├── Allocate unique ports (15000+)
├── Create ./tmp/bottest-{uuid}/
│
├── Start services (via bootstrap)
│ ├── PostgreSQL on custom port
│ ├── MinIO on custom port
│ └── Redis on custom port
│
├── Start mock servers
│ ├── MockZitadel (wiremock)
│ ├── MockLLM (wiremock)
│ └── MockWhatsApp (wiremock)
│
├── Run migrations
└── Return TestContext
TestContext provides:
- db_pool() -> Database connection
- minio_client() -> S3 client
- redis_client() -> Redis client
- mock_*() -> Mock server controls
On Drop:
- Stop all services
- Remove temp directory
```
---
## Code Style
Same as botserver PROMPT.md:
- KISS, NO TALK, SECURED CODE ONLY
- No comments, no placeholders
- Complete, production-ready code
- Return 0 warnings
---
## Test Categories
### Unit Tests (no services)
```rust
#[test]
fn test_pure_logic() {
// No TestHarness needed
// Test pure functions directly
}
```
### Integration Tests (with services)
```rust
#[tokio::test]
async fn test_with_database() {
let ctx = TestHarness::quick().await.unwrap();
let pool = ctx.db_pool().await.unwrap();
// Use real database
}
```
### E2E Tests (with browser)
```rust
#[tokio::test]
async fn test_user_flow() {
let ctx = TestHarness::full().await.unwrap();
let server = ctx.start_botserver().await.unwrap();