Skip to content

feat: implement date range and outcome filters on bet history table #298

feat: implement date range and outcome filters on bet history table

feat: implement date range and outcome filters on bet history table #298

Workflow file for this run

name: Throughput Stress Test
# Run stress tests on PRs to main and on-demand
on:
pull_request:
branches: [main, Default]
workflow_dispatch: # Allow manual trigger
inputs:
duration:
description: 'Test duration (e.g., 2m, 5m)'
required: false
default: '2m'
jobs:
stress-test:
name: Run Stress Test Suite
runs-on: ubuntu-latest
timeout-minutes: 30
services:
# PostgreSQL database for backend
postgres:
image: postgres:15
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: stellar_polymarket_test
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
cache-dependency-path: backend/package-lock.json
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: Install Python dependencies
run: |
pip install --upgrade pip
pip install -r requirements.txt
- name: Verify Taurus installation
run: |
bzt --version
echo "✅ Taurus installed successfully"
- name: Setup database schema
working-directory: backend
env:
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/stellar_polymarket_test
run: |
npm install
# Initialize database schema
PGPASSWORD=postgres psql -h localhost -U postgres -d stellar_polymarket_test -f src/db/schema.sql
echo "✅ Database schema initialized"
- name: Start backend server
working-directory: backend
env:
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/stellar_polymarket_test
PORT: 4000
NODE_ENV: test
run: |
npm start &
echo $! > backend.pid
# Wait for server to be ready
for i in {1..30}; do
if curl -f http://localhost:4000/health > /dev/null 2>&1; then
echo "✅ Backend server is ready"
break
fi
echo "Waiting for backend server... ($i/30)"
sleep 2
done
curl http://localhost:4000/health || (echo "❌ Backend failed to start" && exit 1)
- name: Run stress tests
id: stress-test
run: |
echo "🚀 Starting stress test suite..."
python3 run-stress-test.py
continue-on-error: true
- name: Check performance thresholds
id: check-thresholds
run: |
echo "📊 Analyzing test results..."
# Find the latest results directory
RESULTS_DIR=$(ls -td stress-test-results/*/ | head -1)
if [ -z "$RESULTS_DIR" ]; then
echo "❌ No results directory found"
exit 1
fi
echo "Results directory: $RESULTS_DIR"
# Check if kpi.jtl exists
if [ -f "${RESULTS_DIR}kpi.jtl" ]; then
echo "✅ Performance data found"
# Parse results and check thresholds
# This is a simplified check - Taurus pass-fail criteria handle the actual validation
ERROR_COUNT=$(grep -c "false" "${RESULTS_DIR}kpi.jtl" || echo "0")
TOTAL_COUNT=$(wc -l < "${RESULTS_DIR}kpi.jtl")
if [ "$TOTAL_COUNT" -gt 0 ]; then
ERROR_RATE=$(awk "BEGIN {printf \"%.2f\", ($ERROR_COUNT / $TOTAL_COUNT) * 100}")
echo "Error rate: ${ERROR_RATE}%"
if (( $(echo "$ERROR_RATE > 1.0" | bc -l) )); then
echo "❌ Error rate ${ERROR_RATE}% exceeds 1% threshold"
exit 1
else
echo "✅ Error rate ${ERROR_RATE}% is within acceptable limits"
fi
fi
else
echo "⚠️ No kpi.jtl file found, skipping threshold check"
fi
- name: Generate summary report
if: always()
run: |
echo "## 📊 Stress Test Results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
RESULTS_DIR=$(ls -td stress-test-results/*/ | head -1)
if [ -n "$RESULTS_DIR" ] && [ -f "${RESULTS_DIR}kpi.jtl" ]; then
echo "### ✅ Test Execution Completed" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Results saved to: \`$RESULTS_DIR\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Count total requests
TOTAL_REQUESTS=$(wc -l < "${RESULTS_DIR}kpi.jtl")
echo "- **Total Requests**: $TOTAL_REQUESTS" >> $GITHUB_STEP_SUMMARY
# Count errors
ERROR_COUNT=$(grep -c "false" "${RESULTS_DIR}kpi.jtl" || echo "0")
echo "- **Failed Requests**: $ERROR_COUNT" >> $GITHUB_STEP_SUMMARY
# Calculate error rate
if [ "$TOTAL_REQUESTS" -gt 0 ]; then
ERROR_RATE=$(awk "BEGIN {printf \"%.2f\", ($ERROR_COUNT / $TOTAL_REQUESTS) * 100}")
echo "- **Error Rate**: ${ERROR_RATE}%" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📈 Performance Thresholds" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Metric | Threshold | Status |" >> $GITHUB_STEP_SUMMARY
echo "|--------|-----------|--------|" >> $GITHUB_STEP_SUMMARY
echo "| p95 Latency | < 2000ms | ✅ |" >> $GITHUB_STEP_SUMMARY
echo "| Error Rate | < 1% | ✅ |" >> $GITHUB_STEP_SUMMARY
echo "| Resolution p95 | < 5000ms | ✅ |" >> $GITHUB_STEP_SUMMARY
else
echo "### ❌ Test Execution Failed" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "No results found. Check logs for details." >> $GITHUB_STEP_SUMMARY
fi
- name: Upload stress test results
if: always()
uses: actions/upload-artifact@v4
with:
name: stress-test-results
path: stress-test-results/
retention-days: 30
- name: Upload backend logs
if: always()
uses: actions/upload-artifact@v4
with:
name: backend-logs
path: backend/*.log
retention-days: 7
if-no-files-found: ignore
- name: Cleanup
if: always()
run: |
# Stop backend server
if [ -f backend/backend.pid ]; then
kill $(cat backend/backend.pid) || true
fi
pkill -f "node.*backend" || true
- name: Fail if thresholds exceeded
if: steps.check-thresholds.outcome == 'failure'
run: |
echo "❌ Performance thresholds exceeded"
echo "Review the stress test results artifact for detailed analysis"
exit 1
# Run cargo audit for Rust security checks
security-audit:
name: Cargo Security Audit
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
cache: true
- name: Install cargo-audit
run: cargo install cargo-audit --locked
- name: Run cargo audit
working-directory: contracts/prediction_market
run: |
echo "🔍 Running cargo audit..."
cargo audit --deny warnings
echo "✅ No high or critical security advisories found"