2025-12-06 11:23:57 -03:00
# BotTest Development Prompt
2025-12-06 11:05:57 -03:00
2025-12-12 16:39:45 -03:00
**Version:** 6.1.0
2025-12-06 11:05:57 -03:00
**Purpose:** Test infrastructure for General Bots ecosystem
---
2025-12-18 16:18:24 -03:00
## Weekly Maintenance - EVERY MONDAY
### Package Review Checklist
**Every Monday, review the following:**
1. **Dependency Updates**
```bash
cargo outdated
cargo audit
```
2. **Package Consolidation Opportunities**
- Check if new crates can replace custom code
- Look for crates that combine multiple dependencies
- Review `Cargo.toml` for redundant dependencies
3. **Code Reduction Candidates**
- Custom mock implementations that can use crates
- Test utilities that have crate equivalents
- Boilerplate that can be replaced with macros
4. **Test Infrastructure Updates**
- Check for new testing patterns
- Review mock server libraries
- Update fixture generation approaches
### Packages to Watch
| Area | Potential Packages | Purpose |
|------|-------------------|---------|
| Mocking | `wiremock` , `mockall` | Simplify mock creation |
| Assertions | `assertables` , `pretty_assertions` | Better test output |
| Fixtures | `fake` , `proptest` | Generate test data |
| Async Testing | `tokio-test` | Async test utilities |
---
2025-12-06 11:23:57 -03:00
## CRITICAL RULE
🚫 **NO .md FILES IN ROOT OF ANY PROJECT**
All documentation goes in `botbook/src/17-testing/` :
- `README.md` - Testing overview
- `e2e-testing.md` - E2E test guide
- `architecture.md` - Testing architecture
- `performance.md` - Performance testing
- `best-practices.md` - Best practices
This PROMPT.md is the ONLY exception (it's for developers).
---
2025-12-06 11:05:57 -03:00
## Core Principle
**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
2025-12-14 15:59:07 -03:00
**IMPORTANT:** E2E tests always use `USE_BOTSERVER_BOOTSTRAP=1` mode. No global PostgreSQL or other services are required. The botserver handles all service installation during bootstrap.
2025-12-06 11:05:57 -03:00
```
2025-12-14 15:59:07 -03:00
TestHarness::full() / E2E Tests
2025-12-06 11:05:57 -03:00
│
├── Allocate unique ports (15000+)
├── Create ./tmp/bottest-{uuid}/
│
2025-12-14 15:59:07 -03:00
├── Start mock servers only
2025-12-06 11:05:57 -03:00
│ ├── MockZitadel (wiremock)
2025-12-14 15:59:07 -03:00
│ └── MockLLM (wiremock)
│
├── Start botserver with --stack-path
│ └── Botserver auto-installs:
│ ├── PostgreSQL (tables)
│ ├── MinIO (drive)
│ └── Redis (cache)
2025-12-06 11:05:57 -03:00
│
└── 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();
let browser = Browser::new().await.unwrap();
// Automate browser
}
```
---
## Mock Server Patterns
### Expect specific calls
```rust
ctx.mock_llm().expect_completion("hello", "Hi there!");
```
### Verify calls were made
```rust
ctx.mock_llm().assert_called_times(2);
```
### Simulate errors
```rust
ctx.mock_llm().next_call_fails(500, "Internal error");
```
---
## Fixture Patterns
### Factory functions
```rust
let user = fixtures::admin_user();
let bot = fixtures::bot_with_kb();
let session = fixtures::active_session(& user, &bot);
```
### Insert into database
```rust
ctx.insert(&user).await;
ctx.insert(&bot).await;
```
---
## Cleanup
Always automatic via Drop trait. But can force:
```rust
ctx.cleanup().await; // Explicit cleanup
```
---
## Parallel Safety
- Each test gets unique ports via PortAllocator
- Each test gets unique temp directory
- No shared state between tests
- Safe to run with `cargo test -j 8`
2025-12-06 11:23:57 -03:00
---
## Documentation Location
For guides, tutorials, and reference:
→ Use `botbook/src/17-testing/`
Examples:
- E2E testing setup → `botbook/src/17-testing/e2e-testing.md`
- Architecture details → `botbook/src/17-testing/architecture.md`
- Performance tips → `botbook/src/17-testing/performance.md`
Never create .md files at:
- ✗ Root of bottest/
- ✗ Root of botserver/
- ✗ Root of botapp/
- ✗ Any project root
2025-12-12 16:39:45 -03:00
All non-PROMPT.md documentation belongs in botbook.