Initial commit
This commit is contained in:
127
skills/cli-testing-patterns/scripts/validate-test-coverage.sh
Executable file
127
skills/cli-testing-patterns/scripts/validate-test-coverage.sh
Executable file
@@ -0,0 +1,127 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Validate Test Coverage
|
||||
#
|
||||
# Checks that test coverage meets minimum thresholds
|
||||
|
||||
set -e
|
||||
|
||||
# Default thresholds
|
||||
MIN_COVERAGE=${MIN_COVERAGE:-70}
|
||||
|
||||
echo "📊 Validating test coverage..."
|
||||
|
||||
# Detect project type
|
||||
if [ -f "package.json" ]; then
|
||||
PROJECT_TYPE="node"
|
||||
elif [ -f "setup.py" ] || [ -f "pyproject.toml" ]; then
|
||||
PROJECT_TYPE="python"
|
||||
else
|
||||
echo "❌ Error: Could not detect project type"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check coverage for Node.js projects
|
||||
if [ "$PROJECT_TYPE" == "node" ]; then
|
||||
echo "📦 Node.js project detected"
|
||||
|
||||
# Check if coverage data exists
|
||||
if [ ! -d "coverage" ]; then
|
||||
echo "❌ Error: No coverage data found"
|
||||
echo " Run 'npm run test:coverage' first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if coverage summary exists
|
||||
if [ ! -f "coverage/coverage-summary.json" ]; then
|
||||
echo "❌ Error: coverage-summary.json not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Extract coverage percentages using jq if available
|
||||
if command -v jq &> /dev/null; then
|
||||
LINES=$(jq '.total.lines.pct' coverage/coverage-summary.json)
|
||||
STATEMENTS=$(jq '.total.statements.pct' coverage/coverage-summary.json)
|
||||
FUNCTIONS=$(jq '.total.functions.pct' coverage/coverage-summary.json)
|
||||
BRANCHES=$(jq '.total.branches.pct' coverage/coverage-summary.json)
|
||||
|
||||
echo ""
|
||||
echo "Coverage Summary:"
|
||||
echo " Lines: ${LINES}%"
|
||||
echo " Statements: ${STATEMENTS}%"
|
||||
echo " Functions: ${FUNCTIONS}%"
|
||||
echo " Branches: ${BRANCHES}%"
|
||||
echo ""
|
||||
|
||||
# Check thresholds
|
||||
FAILED=0
|
||||
if (( $(echo "$LINES < $MIN_COVERAGE" | bc -l) )); then
|
||||
echo "❌ Lines coverage (${LINES}%) below threshold (${MIN_COVERAGE}%)"
|
||||
FAILED=1
|
||||
fi
|
||||
if (( $(echo "$STATEMENTS < $MIN_COVERAGE" | bc -l) )); then
|
||||
echo "❌ Statements coverage (${STATEMENTS}%) below threshold (${MIN_COVERAGE}%)"
|
||||
FAILED=1
|
||||
fi
|
||||
if (( $(echo "$FUNCTIONS < $MIN_COVERAGE" | bc -l) )); then
|
||||
echo "❌ Functions coverage (${FUNCTIONS}%) below threshold (${MIN_COVERAGE}%)"
|
||||
FAILED=1
|
||||
fi
|
||||
if (( $(echo "$BRANCHES < $MIN_COVERAGE" | bc -l) )); then
|
||||
echo "❌ Branches coverage (${BRANCHES}%) below threshold (${MIN_COVERAGE}%)"
|
||||
FAILED=1
|
||||
fi
|
||||
|
||||
if [ $FAILED -eq 1 ]; then
|
||||
echo ""
|
||||
echo "❌ Coverage validation failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Coverage thresholds met!"
|
||||
else
|
||||
echo "⚠️ jq not installed, skipping detailed validation"
|
||||
echo " Install jq for detailed coverage validation"
|
||||
fi
|
||||
|
||||
# Check coverage for Python projects
|
||||
elif [ "$PROJECT_TYPE" == "python" ]; then
|
||||
echo "🐍 Python project detected"
|
||||
|
||||
# Check if coverage data exists
|
||||
if [ ! -f ".coverage" ]; then
|
||||
echo "❌ Error: No coverage data found"
|
||||
echo " Run 'pytest --cov' first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Generate coverage report
|
||||
if command -v coverage &> /dev/null; then
|
||||
echo ""
|
||||
coverage report
|
||||
|
||||
# Get total coverage percentage
|
||||
TOTAL_COVERAGE=$(coverage report | tail -1 | awk '{print $NF}' | sed 's/%//')
|
||||
|
||||
echo ""
|
||||
echo "Total Coverage: ${TOTAL_COVERAGE}%"
|
||||
echo "Minimum Required: ${MIN_COVERAGE}%"
|
||||
|
||||
# Compare coverage
|
||||
if (( $(echo "$TOTAL_COVERAGE < $MIN_COVERAGE" | bc -l) )); then
|
||||
echo ""
|
||||
echo "❌ Coverage (${TOTAL_COVERAGE}%) below threshold (${MIN_COVERAGE}%)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Coverage thresholds met!"
|
||||
else
|
||||
echo "❌ Error: coverage tool not installed"
|
||||
echo " Install with: pip install coverage"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "🎉 Coverage validation passed!"
|
||||
Reference in New Issue
Block a user