mirror of
https://github.com/floor-licker/polyfill-rs.git
synced 2026-07-28 13:07:46 +00:00
256 lines
7.4 KiB
Markdown
256 lines
7.4 KiB
Markdown
# Testing polyfill-rs
|
|
|
|
This document describes how to run tests for polyfill-rs, with a focus on integration tests that verify our client can actually communicate with the real Polymarket API.
|
|
|
|
## Test Types
|
|
|
|
### Unit Tests
|
|
- **Location**: Scattered throughout source files (`src/*.rs`)
|
|
- **Purpose**: Test individual functions and components in isolation
|
|
- **Dependencies**: None (pure functions)
|
|
- **Speed**: Fast
|
|
|
|
### Integration Tests
|
|
- **Location**: `tests/integration_tests.rs`
|
|
- **Purpose**: Verify the client can communicate with the real Polymarket API
|
|
- **Dependencies**: Network connectivity + credentials (tests are `#[ignore]` by default)
|
|
- **Speed**: Slower (network calls)
|
|
|
|
## Running Tests
|
|
|
|
### Quick Start (Basic Tests)
|
|
```bash
|
|
# Run unit tests + doc tests (real-API tests are `#[ignore]` by default)
|
|
cargo test --all-features
|
|
|
|
# Run the "no-alloc hot paths" regression tests
|
|
cargo test --all-features --test no_alloc_hot_paths
|
|
|
|
# Compile-check all examples
|
|
cargo build --examples
|
|
```
|
|
|
|
### Full Integration Testing
|
|
|
|
#### 1. Set up Environment Variables
|
|
|
|
Create a `.env` file or export variables:
|
|
|
|
```bash
|
|
# Required for ignored real-API tests
|
|
export POLYMARKET_PRIVATE_KEY="your_private_key_here"
|
|
|
|
# Optional: API credentials (some tests/tools may use these)
|
|
export POLYMARKET_API_KEY="your_api_key"
|
|
export POLYMARKET_API_SECRET="your_api_secret"
|
|
export POLYMARKET_API_PASSPHRASE="your_passphrase"
|
|
|
|
# Backward-compatible aliases also accepted by test helpers
|
|
export POLYMARKET_SECRET="your_api_secret"
|
|
export POLYMARKET_PASSPHRASE="your_passphrase"
|
|
|
|
# Optional (defaults provided in test helpers)
|
|
export POLYMARKET_HOST="https://clob.polymarket.com"
|
|
export POLYMARKET_CHAIN_ID="137"
|
|
|
|
# Optional, but required when funds live in a Polymarket proxy/Safe wallet.
|
|
# 0 = EOA, 1 = Proxy, 2 = Gnosis Safe/browser wallet, 3 = Poly1271.
|
|
export POLYMARKET_SIGNATURE_TYPE="2"
|
|
|
|
# Optional: override the derived funder/proxy wallet address.
|
|
export POLYMARKET_FUNDER_ADDRESS="0x..."
|
|
|
|
# Optional: pin clob.polymarket.com to a known A record if local DNS is blocked.
|
|
# Keep the hostname in POLYMARKET_HOST so HTTPS/SNI still validates.
|
|
export POLYMARKET_RESOLVE_IP="104.18.34.205"
|
|
```
|
|
|
|
#### 2. Run Integration Tests
|
|
|
|
```bash
|
|
# Using the test runner script (runs ignored tests that hit the real API)
|
|
./scripts/run_integration_tests.sh
|
|
|
|
# Or directly with cargo
|
|
cargo test --all-features --test integration_tests -- --ignored --nocapture --test-threads=1
|
|
```
|
|
|
|
## Test Categories
|
|
|
|
### Always Run (No Auth Required)
|
|
- **API Connectivity**: Basic connection to Polymarket API
|
|
- **Market Data Endpoints**: Order book, prices, spreads, etc.
|
|
- **Error Handling**: Invalid requests and error responses
|
|
- **Rate Limiting**: Multiple rapid requests
|
|
- **API Compatibility**: Verify our API matches polymarket-rs-client
|
|
- **Performance**: Response time measurements
|
|
|
|
### Authentication Required
|
|
- **Authentication**: API key creation and validation
|
|
- **Advanced Client Features**: Full client configuration
|
|
- **WebSocket Connectivity**: Real-time data streaming
|
|
|
|
### API Credentials Required
|
|
- **Order Management**: Order creation and management (read-only tests)
|
|
|
|
## Test Results
|
|
|
|
### Success Indicators
|
|
```
|
|
API connectivity test passed
|
|
Market data endpoints test passed
|
|
Error handling test passed
|
|
Rate limiting test passed
|
|
API compatibility test passed
|
|
Performance test passed
|
|
Server time: 234ms
|
|
Markets request: 1.2s
|
|
Markets returned: 50
|
|
```
|
|
|
|
### Ignored Indicators (default)
|
|
```
|
|
test test_real_api_* ... ignored
|
|
```
|
|
|
|
### Failure Indicators
|
|
```
|
|
API connectivity test failed: Network error: connection refused
|
|
Market data endpoints test failed: API error (404): Token not found
|
|
```
|
|
|
|
## Performance Benchmarks
|
|
|
|
Our integration tests include performance measurements:
|
|
|
|
| Operation | Expected Time | Actual Time |
|
|
|-----------|---------------|-------------|
|
|
| Server Time | < 5s | 234ms |
|
|
| Markets Request | < 10s | 1.2s |
|
|
| Order Book | < 5s | 890ms |
|
|
| Price Quote | < 3s | 156ms |
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
#### Network Connectivity
|
|
```bash
|
|
# Test basic connectivity
|
|
curl -I https://clob.polymarket.com/
|
|
|
|
# Check DNS resolution
|
|
nslookup clob.polymarket.com
|
|
|
|
# If local DNS fails but outbound HTTPS works, get a current A record and pin it:
|
|
curl -sS -H 'accept:application/dns-json' \
|
|
'https://cloudflare-dns.com/dns-query?name=clob.polymarket.com&type=A'
|
|
export POLYMARKET_RESOLVE_IP="104.18.34.205"
|
|
```
|
|
|
|
#### Authentication Issues
|
|
```bash
|
|
# Verify private key format
|
|
echo $POLYMARKET_PRIVATE_KEY | wc -c # Should be 66 characters (0x + 64 hex)
|
|
|
|
# Run a small ignored auth smoke-test (requires real credentials)
|
|
cargo test --all-features --test simple_auth_test -- --ignored --nocapture --test-threads=1
|
|
```
|
|
|
|
#### Rate Limiting
|
|
```bash
|
|
# If tests fail due to rate limiting, consider adding delays between manual runs.
|
|
```
|
|
|
|
### Debug Mode
|
|
|
|
Run tests with detailed logging:
|
|
|
|
```bash
|
|
# Enable debug logging
|
|
RUST_LOG=debug cargo test --all-features --test integration_tests -- --ignored --nocapture --test-threads=1
|
|
|
|
# Enable trace logging for maximum detail
|
|
RUST_LOG=trace cargo test --all-features --test integration_tests -- --ignored --nocapture --test-threads=1
|
|
```
|
|
|
|
## Continuous Integration
|
|
|
|
### GitHub Actions
|
|
|
|
Our CI runs formatting, clippy, unit tests, docs, security audit, and a separate no-alloc job. Real-API integration tests are `#[ignore]` and are not run in CI.
|
|
|
|
```yaml
|
|
# .github/workflows/ci.yml
|
|
- name: Run tests (excluding no-alloc hot paths)
|
|
run: cargo test --all-features -- --skip no_alloc_
|
|
|
|
- name: Run no-alloc hot path tests
|
|
run: cargo test --all-features --test no_alloc_hot_paths
|
|
```
|
|
|
|
### Local CI
|
|
|
|
Run the same tests locally:
|
|
|
|
```bash
|
|
# Install cargo-nextest for faster test execution
|
|
cargo install cargo-nextest
|
|
|
|
# Run with nextest (ignored tests are not run by default)
|
|
cargo nextest run --all-features
|
|
```
|
|
|
|
## Test Coverage
|
|
|
|
Our integration tests cover:
|
|
|
|
- **API Endpoints**: All major REST endpoints
|
|
- **Authentication**: EIP-712 signing and API key management
|
|
- **Error Handling**: Network errors, API errors, validation errors
|
|
- **Performance**: Response time and throughput measurements
|
|
- **WebSocket**: Real-time data streaming (when available)
|
|
- **Compatibility**: API compatibility with polymarket-rs-client
|
|
|
|
## Adding New Tests
|
|
|
|
### Template for New Integration Test
|
|
|
|
```rust
|
|
#[tokio::test]
|
|
async fn test_new_feature() -> Result<()> {
|
|
let config = TestConfig::from_env();
|
|
|
|
// Skip if requirements not met
|
|
if !config.has_auth() {
|
|
TestReporter::skip("test_new_feature", "no private key");
|
|
return Ok(());
|
|
}
|
|
|
|
// Test implementation
|
|
let client = config.create_auth_client()?;
|
|
let result = client.some_new_method().await?;
|
|
|
|
// Assertions
|
|
assert!(result.is_valid());
|
|
|
|
TestReporter::success("test_new_feature");
|
|
Ok(())
|
|
}
|
|
```
|
|
|
|
### Best Practices
|
|
|
|
1. **Use TestConfig**: Always use the shared test configuration
|
|
2. **Handle Missing Credentials**: Skip tests gracefully when credentials aren't available
|
|
3. **Measure Performance**: Include timing measurements for performance-critical operations
|
|
4. **Provide Context**: Use descriptive test names and error messages
|
|
5. **Clean Up**: Don't leave test data in the system
|
|
|
|
## Security Notes
|
|
|
|
- **Never commit credentials**: All test credentials are loaded from environment variables
|
|
- **Use test accounts**: If testing with real credentials, use dedicated test accounts
|
|
- **Read-only tests**: Order management tests only create orders, they don't execute them
|
|
- **Rate limiting**: Tests include delays to respect API rate limits
|