Spaces:
Sleeping
Sleeping
| # IntegraChat Testing Guide | |
| This guide explains how to test all the new features and improvements in IntegraChat. | |
| ## Prerequisites | |
| 1. **Install Dependencies** | |
| ```bash | |
| pip install -r requirements.txt | |
| ``` | |
| 2. **Environment Setup** | |
| - Create a `.env` file or set environment variables | |
| - Optional: Set up Ollama for LLM testing | |
| - Optional: Set up Supabase for production analytics | |
| ## Test Structure | |
| ### 1. Unit Tests | |
| Run unit tests for individual components: | |
| ```bash | |
| # Run all unit tests | |
| pytest backend/tests/ | |
| # Run specific test files | |
| pytest backend/tests/test_analytics_store.py -v | |
| pytest backend/tests/test_enhanced_admin_rules.py -v | |
| pytest backend/tests/test_api_endpoints.py -v | |
| # Run with coverage | |
| pytest backend/tests/ --cov=backend/api --cov-report=html | |
| ``` | |
| ### 2. Integration Tests | |
| Test API endpoints with the FastAPI test client: | |
| ```bash | |
| pytest backend/tests/test_api_endpoints.py -v | |
| ``` | |
| **Note**: Some integration tests may fail if MCP servers or LLM are not running. That's expected. | |
| ### 3. Manual Testing Scripts | |
| Create test data and verify functionality manually: | |
| #### A. Test Analytics Store | |
| ```bash | |
| python -c " | |
| from backend.api.storage.analytics_store import AnalyticsStore | |
| import time | |
| store = AnalyticsStore() | |
| # Log tool usage | |
| store.log_tool_usage('test_tenant', 'rag', latency_ms=150, tokens_used=500, success=True) | |
| store.log_tool_usage('test_tenant', 'web', latency_ms=80, success=True) | |
| # Log red-flag violation | |
| store.log_redflag_violation( | |
| 'test_tenant', | |
| 'rule1', | |
| '.*password.*', | |
| 'high', | |
| 'password123', | |
| confidence=0.95 | |
| ) | |
| # Log RAG search | |
| store.log_rag_search('test_tenant', 'test query', hits_count=5, avg_score=0.85, top_score=0.92) | |
| # Log agent query | |
| store.log_agent_query('test_tenant', 'test message', intent='rag', tools_used=['rag', 'llm'], total_tokens=1000) | |
| # Get stats | |
| print('Tool Usage:', store.get_tool_usage_stats('test_tenant')) | |
| print('Violations:', store.get_redflag_violations('test_tenant')) | |
| print('Activity:', store.get_activity_summary('test_tenant')) | |
| print('RAG Quality:', store.get_rag_quality_metrics('test_tenant')) | |
| " | |
| ``` | |
| #### B. Test Admin Rules with Regex | |
| ```bash | |
| python -c " | |
| from backend.api.storage.rules_store import RulesStore | |
| import re | |
| store = RulesStore() | |
| # Add rule with regex pattern | |
| store.add_rule( | |
| 'test_tenant', | |
| 'Block password queries', | |
| pattern='.*password.*|.*pwd.*', | |
| severity='high', | |
| description='Blocks password-related queries' | |
| ) | |
| # Get detailed rules | |
| rules = store.get_rules_detailed('test_tenant') | |
| print('Rules:', rules) | |
| # Test regex matching | |
| pattern = rules[0]['pattern'] | |
| regex = re.compile(pattern, re.IGNORECASE) | |
| test_text = 'What is my password?' | |
| match = regex.search(test_text) | |
| print(f'Match for \"{test_text}\": {match is not None}') | |
| " | |
| ``` | |
| ## API Endpoint Testing | |
| ### Using curl | |
| #### 1. Test Analytics Endpoints | |
| ```bash | |
| # Overview | |
| curl -X GET "http://localhost:8000/analytics/overview?days=30" \ | |
| -H "x-tenant-id: test_tenant" | |
| # Tool Usage | |
| curl -X GET "http://localhost:8000/analytics/tool-usage?days=30" \ | |
| -H "x-tenant-id: test_tenant" | |
| # RAG Quality | |
| curl -X GET "http://localhost:8000/analytics/rag-quality?days=30" \ | |
| -H "x-tenant-id: test_tenant" | |
| # Red Flags | |
| curl -X GET "http://localhost:8000/analytics/redflags?limit=50&days=30" \ | |
| -H "x-tenant-id: test_tenant" | |
| ``` | |
| #### 2. Test Admin Endpoints | |
| ```bash | |
| # Add rule with regex and severity | |
| curl -X POST "http://localhost:8000/admin/rules" \ | |
| -H "x-tenant-id: test_tenant" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "rule": "Block password queries", | |
| "pattern": ".*password.*", | |
| "severity": "high", | |
| "description": "Blocks password-related queries" | |
| }' | |
| # Get detailed rules | |
| curl -X GET "http://localhost:8000/admin/rules?detailed=true" \ | |
| -H "x-tenant-id: test_tenant" | |
| # Get violations | |
| curl -X GET "http://localhost:8000/admin/violations?limit=50&days=30" \ | |
| -H "x-tenant-id: test_tenant" | |
| # Get tool logs | |
| curl -X GET "http://localhost:8000/admin/tools/logs?tool_name=rag&days=7" \ | |
| -H "x-tenant-id: test_tenant" | |
| ``` | |
| #### 3. Test Agent Endpoints | |
| ```bash | |
| # Agent chat (normal) | |
| curl -X POST "http://localhost:8000/agent/message" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "tenant_id": "test_tenant", | |
| "message": "What is the company policy?", | |
| "temperature": 0.0 | |
| }' | |
| # Agent debug | |
| curl -X POST "http://localhost:8000/agent/debug" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "tenant_id": "test_tenant", | |
| "message": "What is the company policy?", | |
| "temperature": 0.0 | |
| }' | |
| # Agent plan | |
| curl -X POST "http://localhost:8000/agent/plan" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "tenant_id": "test_tenant", | |
| "message": "What is the company policy?", | |
| "temperature": 0.0 | |
| }' | |
| ``` | |
| ### Using Python requests | |
| Create a test script `test_api_manual.py`: | |
| ```python | |
| import requests | |
| import json | |
| BASE_URL = "http://localhost:8000" | |
| TENANT_ID = "test_tenant" | |
| headers = {"x-tenant-id": TENANT_ID} | |
| # Test analytics | |
| print("Testing Analytics Endpoints...") | |
| response = requests.get(f"{BASE_URL}/analytics/overview?days=30", headers=headers) | |
| print(f"Overview: {response.status_code} - {json.dumps(response.json(), indent=2)}") | |
| response = requests.get(f"{BASE_URL}/analytics/tool-usage?days=30", headers=headers) | |
| print(f"Tool Usage: {response.status_code} - {json.dumps(response.json(), indent=2)}") | |
| # Test admin rules | |
| print("\nTesting Admin Rules...") | |
| response = requests.post( | |
| f"{BASE_URL}/admin/rules", | |
| headers=headers, | |
| json={ | |
| "rule": "Block password queries", | |
| "pattern": ".*password.*", | |
| "severity": "high" | |
| } | |
| ) | |
| print(f"Add Rule: {response.status_code} - {json.dumps(response.json(), indent=2)}") | |
| response = requests.get( | |
| f"{BASE_URL}/admin/rules?detailed=true", | |
| headers=headers | |
| ) | |
| print(f"Get Rules: {response.status_code} - {json.dumps(response.json(), indent=2)}") | |
| # Test agent endpoints | |
| print("\nTesting Agent Endpoints...") | |
| response = requests.post( | |
| f"{BASE_URL}/agent/plan", | |
| json={ | |
| "tenant_id": TENANT_ID, | |
| "message": "What is the company policy?", | |
| "temperature": 0.0 | |
| } | |
| ) | |
| print(f"Agent Plan: {response.status_code} - {json.dumps(response.json(), indent=2)}") | |
| ``` | |
| Run it: | |
| ```bash | |
| python test_api_manual.py | |
| ``` | |
| ## End-to-End Testing Workflow | |
| ### Step 1: Start Backend Services | |
| ```bash | |
| # Terminal 1: Start FastAPI backend | |
| cd backend/api | |
| uvicorn main:app --port 8000 --reload | |
| # Terminal 2: Start unified MCP server (rag/web/admin tools) | |
| python backend/mcp_server/server.py | |
| # Optional: Start Ollama for LLM | |
| ollama serve | |
| ``` | |
| ### Step 2: Generate Test Data | |
| Run the analytics and rules tests to populate the database: | |
| ```bash | |
| pytest backend/tests/test_analytics_store.py -v | |
| pytest backend/tests/test_enhanced_admin_rules.py -v | |
| ``` | |
| ### Step 3: Test Agent Flow | |
| 1. **Add some admin rules:** | |
| ```bash | |
| curl -X POST "http://localhost:8000/admin/rules" \ | |
| -H "x-tenant-id: test_tenant" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"rule": "Block password queries", "pattern": ".*password.*", "severity": "high"}' | |
| ``` | |
| 2. **Send a query that triggers red-flag:** | |
| ```bash | |
| curl -X POST "http://localhost:8000/agent/message" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"tenant_id": "test_tenant", "message": "What is my password?"}' | |
| ``` | |
| 3. **Check violations were logged:** | |
| ```bash | |
| curl -X GET "http://localhost:8000/admin/violations" \ | |
| -H "x-tenant-id: test_tenant" | |
| ``` | |
| 4. **Send normal queries and check analytics:** | |
| ```bash | |
| curl -X POST "http://localhost:8000/agent/message" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"tenant_id": "test_tenant", "message": "What is the company policy?"}' | |
| curl -X GET "http://localhost:8000/analytics/overview" \ | |
| -H "x-tenant-id: test_tenant" | |
| ``` | |
| 5. **Use debug endpoint to see reasoning:** | |
| ```bash | |
| curl -X POST "http://localhost:8000/agent/debug" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"tenant_id": "test_tenant", "message": "What is the company policy?"}' | |
| ``` | |
| ### Step 4: Verify Database | |
| Check that data is being stored: | |
| ```bash | |
| # SQLite databases are in data/ directory | |
| sqlite3 data/analytics.db "SELECT * FROM tool_usage_events LIMIT 10;" | |
| sqlite3 data/analytics.db "SELECT * FROM redflag_violations LIMIT 10;" | |
| sqlite3 data/admin_rules.db "SELECT * FROM admin_rules;" | |
| ``` | |
| ## Testing Checklist | |
| ### Analytics Store | |
| - [ ] Tool usage logging works | |
| - [ ] Red-flag violations are logged | |
| - [ ] RAG search events are logged with quality metrics | |
| - [ ] Agent query events are logged | |
| - [ ] Stats can be filtered by time | |
| - [ ] Multiple tenants are isolated | |
| ### Admin Rules | |
| - [ ] Rules can be added with regex patterns | |
| - [ ] Severity levels work (low/medium/high/critical) | |
| - [ ] Rules without pattern use rule text | |
| - [ ] Disabled rules are not returned | |
| - [ ] Multiple tenants are isolated | |
| - [ ] Regex patterns actually match correctly | |
| ### API Endpoints | |
| - [ ] `/analytics/overview` returns correct data | |
| - [ ] `/analytics/tool-usage` returns stats | |
| - [ ] `/analytics/rag-quality` returns metrics | |
| - [ ] `/admin/rules` accepts regex/severity | |
| - [ ] `/admin/violations` returns violations | |
| - [ ] `/admin/tools/logs` returns tool usage | |
| - [ ] `/agent/debug` returns reasoning trace | |
| - [ ] `/agent/plan` returns tool selection plan | |
| - [ ] Missing tenant_id returns 400 | |
| ### Integration | |
| - [ ] Agent orchestrator logs to analytics | |
| - [ ] Red-flag detector logs violations | |
| - [ ] Tool calls are tracked | |
| - [ ] Multi-step workflows are logged | |
| - [ ] Errors are logged correctly | |
| ## Common Issues | |
| ### Database Not Found | |
| - Ensure `data/` directory exists | |
| - Analytics store will create it automatically | |
| ### Tests Fail Due to Missing Services | |
| - Some tests require MCP servers or LLM to be running | |
| - Mock these services or skip tests if services unavailable | |
| - Unit tests should work without external services | |
| ### Import Errors | |
| - Ensure you're running from project root | |
| - Check that `backend/` is in Python path | |
| - Install all dependencies: `pip install -r requirements.txt` | |
| ## Performance Testing | |
| For large-scale testing: | |
| ```python | |
| # Load test analytics store | |
| from backend.api.storage.analytics_store import AnalyticsStore | |
| import time | |
| store = AnalyticsStore() | |
| tenant_id = "load_test_tenant" | |
| start = time.time() | |
| for i in range(1000): | |
| store.log_tool_usage(tenant_id, "rag", latency_ms=100 + i % 50) | |
| elapsed = time.time() - start | |
| print(f"Logged 1000 events in {elapsed:.2f}s ({1000/elapsed:.0f} events/sec)") | |
| # Query performance | |
| start = time.time() | |
| stats = store.get_tool_usage_stats(tenant_id) | |
| elapsed = time.time() - start | |
| print(f"Query took {elapsed*1000:.2f}ms") | |
| ``` | |
| ## Next Steps | |
| 1. **Add more test cases** for edge cases | |
| 2. **Set up CI/CD** to run tests automatically | |
| 3. **Add performance benchmarks** for analytics queries | |
| 4. **Create integration test suite** that spins up all services | |
| 5. **Add E2E tests** using Playwright or Selenium for frontend | |
| For questions or issues, check the test files in `backend/tests/` or refer to the main README.md. | |