- 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
244 lines
6.2 KiB
Markdown
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 |