#!/bin/bash # Coverage rate report generator for gochat project # Generates per-package and overall coverage metrics aligned with Chatwoot test patterns. set -e cd "$(dirname "$0")/.." export GOPROXY=https://goproxy.cn,direct export GONOSUMCHECK=* export GONOSUMDB=* export GOFLAGS=-mod=mod REPORT_DIR="coverage_reports" mkdir -p "$REPORT_DIR" echo "=== GoChat Test Coverage Report ===" echo "Generated: $(date)" echo "" # Packages to test (only those that compile cleanly) TESTABLE_PKGS=( "./internal/model" "./internal/model/channel" "./internal/auth" "./internal/config" "./pkg/testutil" "./pkg/crypto" "./internal/repository" "./internal/pubsub" ) TOTAL_COVERAGE=0 PKG_COUNT=0 PASS_COUNT=0 FAIL_COUNT=0 TOTAL_TESTS=0 TOTAL_ASSERTIONS=0 echo "| Package | Tests | Coverage | Status |" echo "|---------|-------|----------|--------|" for pkg in "${TESTABLE_PKGS[@]}"; do COVERAGE_FILE="$REPORT_DIR/coverage_$(echo $pkg | tr '/' '_').out" # Run tests with coverage RESULT=$(go test -v -cover -coverprofile="$COVERAGE_FILE" "$pkg" 2>&1) EXIT_CODE=$? # Extract coverage percentage COVERAGE=$(echo "$RESULT" | grep "coverage:" | awk '{print $2}' | sed 's/%//') if [ -z "$COVERAGE" ]; then COVERAGE="0.0" fi # Count tests TEST_COUNT=$(echo "$RESULT" | grep -c "^--- PASS\|^--- FAIL" || echo 0) # Determine status if [ $EXIT_CODE -eq 0 ]; then STATUS="PASS" PASS_COUNT=$((PASS_COUNT+1)) else STATUS="FAIL" FAIL_COUNT=$((FAIL_COUNT+1)) fi echo "| $pkg | $TEST_COUNT | ${COVERAGE}% | $STATUS |" TOTAL_TESTS=$((TOTAL_TESTS+TEST_COUNT)) TOTAL_COVERAGE=$(echo "$TOTAL_COVERAGE + $COVERAGE" | bc) PKG_COUNT=$((PKG_COUNT+1)) done echo "" echo "=== Summary ===" echo "Total packages tested: $PKG_COUNT" echo "Passed: $PASS_COUNT, Failed: $FAIL_COUNT" echo "Total test functions: $TOTAL_TESTS" if [ $PKG_COUNT -gt 0 ]; then AVG_COVERAGE=$(echo "$TOTAL_COVERAGE / $PKG_COUNT" | bc -l) echo "Average coverage: ${AVG_COVERAGE}%" fi echo "" echo "=== Test File Inventory ===" find . -name "*_test.go" -not -path "./vendor/*" | while read f; do LINES=$(wc -l < "$f") FUNCTIONS=$(grep -c "func Test" "$f" 2>/dev/null || echo 0) echo " $f: ${LINES} lines, ${FUNCTIONS} test functions" done echo "" echo "Coverage profiles saved to $REPORT_DIR/" echo "To view HTML coverage: go tool cover -html=$REPORT_DIR/coverage_*.out"