216 lines
4.8 KiB
Markdown
216 lines
4.8 KiB
Markdown
# BotTest Development Prompt
|
|
|
|
**Version:** 6.1.0
|
|
**Purpose:** Test infrastructure for General Bots ecosystem
|
|
|
|
---
|
|
|
|
## 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 |
|
|
|
|
---
|
|
|
|
## 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).
|
|
|
|
---
|
|
|
|
## 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
|
|
|
|
**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.
|
|
|
|
```
|
|
TestHarness::full() / E2E Tests
|
|
│
|
|
├── Allocate unique ports (15000+)
|
|
├── Create ./tmp/bottest-{uuid}/
|
|
│
|
|
├── Start mock servers only
|
|
│ ├── MockZitadel (wiremock)
|
|
│ └── MockLLM (wiremock)
|
|
│
|
|
├── Start botserver with --stack-path
|
|
│ └── Botserver auto-installs:
|
|
│ ├── PostgreSQL (tables)
|
|
│ ├── MinIO (drive)
|
|
│ └── Redis (cache)
|
|
│
|
|
└── 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`
|
|
|
|
---
|
|
|
|
## 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
|
|
|
|
All non-PROMPT.md documentation belongs in botbook.
|