bottest/E2E_TESTING_PLAN.md
Rodrigo Rodriguez (Pragmatismo) de58bc16a0 Add comprehensive E2E testing framework with platform flow
- Create platform_flow.rs with complete user journey test (load → botserver → login → chat → logout)
- Add TEMP_STACK_SETUP.md guide for using temporary isolated stacks
- Add E2E_TESTING_PLAN.md with architecture and implementation strategy
- Update e2e mod.rs to include new platform_flow module
- Include helpers for: platform loading, botserver verification, login, chat, logout
- Support for headless and headed browser testing
- Environment variable configuration for WebDriver, timeouts, logging
2025-12-06 11:15:14 -03:00

244 lines
No EOL
6.9 KiB
Markdown

# E2E Testing Plan: Temporary Stack Architecture
## Overview
This document outlines the architecture for comprehensive E2E testing in the General Bots platform using a temporary, isolated stack that can be spawned for testing and automatically cleaned up.
## Problem Statement
Current challenges:
- E2E tests require a pre-configured environment
- Testing can interfere with the main development stack
- No easy way to test the complete flow: platform loading → botserver startup → login → chat → logout
- Integration tests are difficult to automate and reproduce
## Proposed Solution
### 1. Temporary Stack Option in BotServer
Add a new CLI flag `--temp-stack` to BotServer that:
```bash
cargo run -- --temp-stack
# or with custom timeout
cargo run -- --temp-stack --temp-stack-timeout 300
```
**What it does:**
- Creates a temporary directory: `/tmp/botserver-test-{timestamp}-{random}/`
- Sets up all required services (PostgreSQL, MinIO, Redis, etc.) in this directory
- Configures BotServer to use this isolated environment
- Provides environment variables for test harness to connect
- Automatically cleans up on shutdown (SIGTERM/SIGINT)
- Optional timeout that auto-shuts down after N seconds (useful for CI/CD)
### 2. E2E Test Flow
The complete user journey test will validate:
```
1. Platform Loading
└─ Health check endpoint responds
└─ UI assets served correctly
└─ Database migrations completed
2. BotServer Initialization
└─ Service discovery working
└─ Configuration loaded
└─ Dependencies connected
3. Authentication (Login)
└─ Navigate to login page
└─ Enter valid credentials
└─ Session created
└─ Redirected to dashboard
4. Chat Interaction
└─ Open chat window
└─ Send message
└─ Receive AI response
└─ Message history persisted
5. Logout
└─ Click logout button
└─ Session invalidated
└─ Redirected to login
└─ Cannot access protected routes
```
### 3. Test Architecture
#### Test Harness Enhancement
```rust
pub struct TemporaryStack {
pub temp_dir: PathBuf,
pub botserver_process: Child,
pub botserver_url: String,
pub services: ServiceManager,
}
impl TemporaryStack {
pub async fn spawn() -> anyhow::Result<Self>;
pub async fn wait_ready(&self) -> anyhow::Result<()>;
pub async fn shutdown(mut self) -> anyhow::Result<()>;
}
```
#### E2E Test Structure
```rust
#[tokio::test]
async fn test_complete_user_journey() {
// 1. Spawn temporary isolated stack
let stack = TemporaryStack::spawn().await.expect("Failed to spawn stack");
stack.wait_ready().await.expect("Stack failed to become ready");
// 2. Setup browser
let browser = Browser::new(browser_config()).await.expect("Browser failed");
// 3. Test complete flow
test_platform_loading(&browser, &stack).await.expect("Platform load failed");
test_botserver_running(&stack).await.expect("BotServer not running");
test_login_flow(&browser, &stack).await.expect("Login failed");
test_chat_interaction(&browser, &stack).await.expect("Chat failed");
test_logout_flow(&browser, &stack).await.expect("Logout failed");
// 4. Cleanup (automatic on drop)
drop(stack);
}
```
### 4. Implementation Phases
#### Phase 1: BotServer Temp Stack Support
- [ ] Add `--temp-stack` CLI argument
- [ ] Create `TempStackConfig` struct
- [ ] Implement temporary directory setup
- [ ] Update service initialization to support temp paths
- [ ] Add cleanup on shutdown
#### Phase 2: Test Harness Integration
- [ ] Create `TemporaryStack` struct in test framework
- [ ] Implement stack spawning logic
- [ ] Add readiness checks
- [ ] Implement graceful shutdown
#### Phase 3: Complete E2E Test Suite
- [ ] Platform loading test
- [ ] BotServer initialization test
- [ ] Complete login → chat → logout flow
- [ ] Error handling and edge cases
#### Phase 4: CI/CD Integration
- [ ] Docker compose for CI environment
- [ ] GitHub Actions workflow
- [ ] Artifact collection on failure
- [ ] Performance benchmarks
## Technical Details
### Environment Variables
When `--temp-stack` is enabled, BotServer outputs:
```bash
export BOTSERVER_TEMP_STACK_DIR="/tmp/botserver-test-2024-01-15-abc123/"
export BOTSERVER_URL="http://localhost:8000"
export DB_HOST="127.0.0.1"
export DB_PORT="5432"
export DB_NAME="botserver_test_abc123"
export REDIS_URL="redis://127.0.0.1:6379"
export MINIO_URL="http://127.0.0.1:9000"
```
### Cleanup Strategy
- **Graceful**: On SIGTERM/SIGINT, wait for in-flight requests then cleanup
- **Timeout**: Auto-shutdown after `--temp-stack-timeout` seconds
- **Forceful**: If timeout reached, force kill processes and cleanup
- **Persistent on Error**: Keep temp dir if error occurs (for debugging)
### Service Isolation
Each temporary stack includes:
```
/tmp/botserver-test-{id}/
├── postgres/
│ └── data/
├── redis/
│ └── data/
├── minio/
│ └── data/
├── botserver/
│ ├── logs/
│ ├── config/
│ └── cache/
└── state.json
```
## Benefits
1. **Isolation**: Each test gets a completely clean environment
2. **Reproducibility**: Same setup every time
3. **Automation**: Can run in CI/CD without manual setup
4. **Debugging**: Failed tests leave artifacts for investigation
5. **Performance**: Multiple tests can run in parallel with different ports
6. **Safety**: No risk of interfering with development environment
## Limitations
- **LXC Containers**: Cannot test containerization (as mentioned)
- **Network**: Tests run on localhost only
- **Performance**: Startup time ~10-30 seconds per test
- **Parallelization**: Need port management for parallel execution
## Usage Examples
### Run Single E2E Test
```bash
cargo test --test e2e_complete_flow -- --nocapture
```
### Run with Headed Browser (for debugging)
```bash
HEADED=1 cargo test --test e2e_complete_flow
```
### Keep Temp Stack on Failure
```bash
KEEP_TEMP_STACK_ON_ERROR=1 cargo test --test e2e_complete_flow
```
### Run All E2E Tests
```bash
cargo test --lib e2e:: -- --nocapture
```
## Monitoring & Logging
- BotServer logs: `/tmp/botserver-test-{id}/botserver.log`
- Database logs: `/tmp/botserver-test-{id}/postgres.log`
- Test output: stdout/stderr from test harness
- Performance metrics: Collected during each phase
## Success Criteria
✓ Platform fully loads without errors
✓ BotServer starts and services become ready within 30 seconds
✓ User can login with test credentials
✓ Chat messages are sent and responses received
✓ User can logout and session is invalidated
✓ All cleanup happens automatically
✓ Test runs consistently multiple times
✓ CI/CD integration works smoothly
## Next Steps
1. Implement `--temp-stack` flag in BotServer
2. Update config loading to support temp paths
3. Create `TemporaryStack` test utility
4. Write comprehensive E2E test suite
5. Integrate into CI/CD pipeline
6. Document for team