kell_creations/kell_creations_apps/tools/collect_coverage.sh

150 lines
5.7 KiB
Bash

#!/usr/bin/env bash
# ──────────────────────────────────────────────────────────────────────
# collect_coverage.sh — Run flutter test --coverage and report results
#
# Usage:
# ./tools/collect_coverage.sh # Run from kell_creations_apps/
#
# Generates coverage/lcov.info per package, then prints a summary table
# showing test pass/fail counts and line coverage percentage.
#
# Exit codes:
# 0 — all tests passed
# 1 — one or more failures
# ──────────────────────────────────────────────────────────────────────
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
# Packages/apps with tests (add new ones here as they gain tests)
TESTABLE=(
packages/core
packages/design_system
packages/feature_wordpress
apps/kell_web
)
OVERALL_EXIT=0
# ── Dependency install ───────────────────────────────────────────────
echo ""
echo "══════════════════════════════════════"
echo " Installing dependencies"
echo "══════════════════════════════════════"
for pkg in "${TESTABLE[@]}"; do
echo "$pkg"
(cd "$ROOT_DIR/$pkg" && flutter pub get --no-example) > /dev/null 2>&1
done
# ── Tests with coverage ─────────────────────────────────────────────
echo ""
echo "══════════════════════════════════════"
echo " Running flutter test --coverage"
echo "══════════════════════════════════════"
declare -A RESULTS_PASS
declare -A RESULTS_FAIL
declare -A RESULTS_LH
declare -A RESULTS_LF
declare -A RESULTS_PCT
for pkg in "${TESTABLE[@]}"; do
NAME=$(basename "$pkg")
echo ""
echo " ── $NAME ──"
TMPFILE=$(mktemp)
if (cd "$ROOT_DIR/$pkg" && flutter test --coverage --reporter expanded 2>&1) | tee "$TMPFILE"; then
: # tests passed
else
OVERALL_EXIT=1
fi
PASS=$(grep -cE '^\s*✓' "$TMPFILE" 2>/dev/null || echo "0")
FAIL=$(grep -cE '^\s*✗' "$TMPFILE" 2>/dev/null || echo "0")
RESULTS_PASS[$NAME]=$PASS
RESULTS_FAIL[$NAME]=$FAIL
rm -f "$TMPFILE"
# Parse lcov.info for coverage
LCOV="$ROOT_DIR/$pkg/coverage/lcov.info"
if [ -f "$LCOV" ]; then
LF=$(grep -oP '(?<=LF:)\d+' "$LCOV" | awk '{s+=$1} END {print s+0}')
LH=$(grep -oP '(?<=LH:)\d+' "$LCOV" | awk '{s+=$1} END {print s+0}')
if [ "$LF" -gt 0 ]; then
PCT=$(awk "BEGIN {printf \"%.1f\", ($LH/$LF)*100}")
else
PCT="0.0"
fi
else
LF=0
LH=0
PCT="—"
fi
RESULTS_LH[$NAME]=$LH
RESULTS_LF[$NAME]=$LF
RESULTS_PCT[$NAME]=$PCT
done
# ── Summary ──────────────────────────────────────────────────────────
echo ""
echo "╔═══════════════════════════════════════════════════════════╗"
echo "║ Flutter Test & Coverage Summary ║"
echo "╠═══════════════════════════════════════════════════════════╣"
echo "║ Package Pass Fail Lines Coverage ║"
echo "╠═══════════════════════════════════════════════════════════╣"
TOTAL_PASS=0
TOTAL_FAIL=0
TOTAL_HIT=0
TOTAL_FOUND=0
for pkg in "${TESTABLE[@]}"; do
NAME=$(basename "$pkg")
P=${RESULTS_PASS[$NAME]:-0}
F=${RESULTS_FAIL[$NAME]:-0}
LH=${RESULTS_LH[$NAME]:-0}
LF=${RESULTS_LF[$NAME]:-0}
PCT=${RESULTS_PCT[$NAME]:-"—"}
if [ "$PCT" != "—" ]; then
LINES="$LH/$LF"
PCT_DISPLAY="${PCT}%"
else
LINES="—"
PCT_DISPLAY="—"
fi
printf "║ %-20s %-7s %-7s %-8s %-10s ║\n" "$NAME" "$P" "$F" "$LINES" "$PCT_DISPLAY"
TOTAL_PASS=$((TOTAL_PASS + P))
TOTAL_FAIL=$((TOTAL_FAIL + F))
TOTAL_HIT=$((TOTAL_HIT + LH))
TOTAL_FOUND=$((TOTAL_FOUND + LF))
done
if [ "$TOTAL_FOUND" -gt 0 ]; then
TOTAL_PCT=$(awk "BEGIN {printf \"%.1f\", ($TOTAL_HIT/$TOTAL_FOUND)*100}")
TOTAL_LINES="$TOTAL_HIT/$TOTAL_FOUND"
TOTAL_PCT_DISPLAY="${TOTAL_PCT}%"
else
TOTAL_LINES="—"
TOTAL_PCT_DISPLAY="—"
fi
echo "╠═══════════════════════════════════════════════════════════╣"
printf "║ %-20s %-7s %-7s %-8s %-10s ║\n" "TOTAL" "$TOTAL_PASS" "$TOTAL_FAIL" "$TOTAL_LINES" "$TOTAL_PCT_DISPLAY"
echo "╚═══════════════════════════════════════════════════════════╝"
if [ $OVERALL_EXIT -ne 0 ]; then
echo ""
echo "❌ Failures detected. See details above."
else
echo ""
echo "✅ All $TOTAL_PASS tests passed across all packages."
echo "📊 Overall line coverage: $TOTAL_PCT_DISPLAY ($TOTAL_LINES lines)"
fi
exit $OVERALL_EXIT