mcrentcast/docs/mock-api.md
Ryan Malloy 723123a6fe Add comprehensive mock Rentcast API for testing
- Complete mock API server with all Rentcast endpoints
- Static test API keys with different tiers and limits
- Rate limiting simulation for testing
- Docker service configuration for mock API
- Integration tests using mock API
- Configuration support for switching between real/mock APIs
- Test script to verify mock API functionality
- Comprehensive documentation for mock API usage

Test API Keys:
- test_key_free_tier: 50 daily limit
- test_key_basic: 100 daily limit
- test_key_pro: 1000 daily limit
- test_key_enterprise: 10000 daily limit
- test_key_rate_limited: 1 daily limit (for testing)
- test_key_invalid: For testing auth errors
2025-09-09 08:56:01 -06:00

244 lines
6.2 KiB
Markdown

# Mock Rentcast API Documentation
The mcrentcast project includes a complete mock implementation of the Rentcast API for testing and development purposes. This allows you to:
- Test without consuming real API credits
- Develop offline
- Test rate limiting and error scenarios
- Run integration tests reliably
## Available Test API Keys
The mock API provides several test keys with different rate limits:
| API Key | Tier | Daily Limit | Monthly Limit | Use Case |
|---------|------|-------------|---------------|----------|
| `test_key_free_tier` | Free | 50 | 50 | Testing free tier limits |
| `test_key_basic` | Basic | 100 | 1,000 | Standard testing |
| `test_key_pro` | Pro | 1,000 | 10,000 | High-volume testing |
| `test_key_enterprise` | Enterprise | 10,000 | 100,000 | Unlimited testing |
| `test_key_rate_limited` | Test | 1 | 1 | Testing rate limit errors |
| `test_key_invalid` | Invalid | 0 | 0 | Testing auth errors |
## Starting the Mock API
### Option 1: Full Stack with Mock API
```bash
make test-mock
```
This starts all services with the mock API enabled.
### Option 2: Mock API Only
```bash
make mock-api
```
This starts only the mock API server on port 8001.
### Option 3: Docker Compose
```bash
USE_MOCK_API=true docker compose --profile mock up -d
```
## Configuration
To use the mock API, set these environment variables in your `.env` file:
```env
USE_MOCK_API=true
MOCK_API_URL=http://mock-rentcast-api:8001/v1
RENTCAST_API_KEY=test_key_basic
```
## Endpoints
The mock API implements all Rentcast endpoints:
### Property Records
- `GET /v1/property-records` - Search properties
- `GET /v1/property-records/random` - Get random properties
- `GET /v1/property-record/{id}` - Get specific property
### Valuations
- `GET /v1/value-estimate` - Property value estimate
- `GET /v1/rent-estimate-long-term` - Rental price estimate
### Listings
- `GET /v1/sale-listings` - Properties for sale
- `GET /v1/sale-listing/{id}` - Specific sale listing
- `GET /v1/rental-listings-long-term` - Rental properties
- `GET /v1/rental-listing-long-term/{id}` - Specific rental
### Market Data
- `GET /v1/market-statistics` - Market statistics
### Utility Endpoints
- `GET /health` - Health check
- `GET /test-keys` - List available test keys
## Testing the Mock API
### Manual Testing
```bash
# Start the mock API
make mock-api
# Run the test script
python scripts/test_mock_api.py
```
### Integration Tests
```bash
# Run integration tests with mock API
USE_MOCK_API=true uv run pytest tests/test_integration.py -v
```
### Using curl
```bash
# Get test keys
curl http://localhost:8001/test-keys
# Search properties
curl -H "X-Api-Key: test_key_basic" \
"http://localhost:8001/v1/property-records?city=Austin&state=TX&limit=5"
# Get value estimate
curl -H "X-Api-Key: test_key_basic" \
"http://localhost:8001/v1/value-estimate?address=123+Main+St"
```
## Mock Data Characteristics
The mock API generates realistic but randomized data:
### Property Records
- Random addresses from predefined street names
- Property types: Single Family, Condo, Townhouse, Multi Family
- Bedrooms: 1-5
- Bathrooms: 1.0-4.0 (in 0.5 increments)
- Square footage: 800-4000
- Year built: 1950-2023
- Prices: $150,000-$1,500,000
### Value Estimates
- Base price: $200,000-$1,000,000
- Price range: ±10% of base price
- Confidence levels: High, Medium, Low
- Includes 3 comparable properties
### Rent Estimates
- Base rent: $1,500-$5,000/month
- Rent range: ±10% of base rent
- Adjusts based on bedrooms and square footage
- Includes 3 comparable rentals
### Market Statistics
- Median sale price: $300,000-$800,000
- Median rent: $1,500-$3,500
- Average days on market: 15-60
- Inventory count: 100-1,000 properties
- Price appreciation: -5% to +15%
## Rate Limiting Simulation
The mock API simulates Rentcast's rate limiting:
1. Each API key has daily and monthly limits
2. Requests are tracked per key
3. Returns 429 status when limits exceeded
4. Daily counters reset after 24 hours
### Testing Rate Limits
```python
# Use the rate-limited test key
client = RentcastClient(api_key="test_key_rate_limited")
# First request succeeds
response1 = await client.get_property_records(limit=1) # ✅
# Second request fails with rate limit error
response2 = await client.get_property_records(limit=1) # ❌ 429 Error
```
## Error Simulation
The mock API simulates various error conditions:
### Authentication Errors (401)
- Use an invalid API key
- Omit the X-Api-Key header
### Forbidden Access (403)
- Use `test_key_invalid` (suspended account)
### Rate Limiting (429)
- Exceed daily/monthly limits
- Use `test_key_rate_limited` for immediate limiting
### Bad Requests (400)
- Omit required parameters
- Use invalid parameter values
## Advantages of Mock API
1. **Cost-Free Testing**: No API credits consumed
2. **Predictable Data**: Consistent test results
3. **Offline Development**: No internet required
4. **Error Testing**: Simulate edge cases easily
5. **CI/CD Integration**: Reliable automated testing
6. **Performance Testing**: No rate limits for load testing
## Switching Between Real and Mock APIs
### Development (Mock API)
```bash
USE_MOCK_API=true make dev
```
### Production (Real API)
```bash
USE_MOCK_API=false RENTCAST_API_KEY=your_real_key make prod
```
### Toggle in Code
```python
from src.mcrentcast.config import settings
# Check current mode
if settings.use_mock_api:
print("Using mock API")
else:
print("Using real Rentcast API")
```
## Troubleshooting
### Mock API not responding
```bash
# Check if service is running
docker compose ps mock-rentcast-api
# View logs
docker compose logs mock-rentcast-api
# Restart service
docker compose restart mock-rentcast-api
```
### Rate limiting not working
- Ensure you're using the correct test key
- Check that daily counters haven't been reset
- Verify the API usage tracking in logs
### Data inconsistency
- Mock data is randomly generated
- Use fixed seeds for deterministic testing
- Cache responses for consistent results
## Best Practices
1. **Use appropriate test keys** for different scenarios
2. **Test error conditions** with special keys
3. **Verify caching** works with mock responses
4. **Run integration tests** before deploying
5. **Document test scenarios** using mock data
6. **Monitor mock API logs** for debugging