#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" BACKEND_DIR="${ROOT_DIR}/backend" PROFILE="$(mktemp -t hfb-backend-cover.XXXXXX)" OUTPUT="$(mktemp -t hfb-backend-cover-output.XXXXXX)" trap 'rm -f "${PROFILE}" "${OUTPUT}"' EXIT cd "${BACKEND_DIR}" go test -p 1 -count=1 -coverprofile="${PROFILE}" ./... | tee "${OUTPUT}" coverage_for_package() { local package="$1" awk -v package="${package}" ' $1 == "ok" && $2 == package { for (i = 1; i <= NF; i++) { if ($i == "coverage:") { value = $(i + 1) gsub(/%/, "", value) print value exit } } } ' "${OUTPUT}" } require_at_least() { local label="$1" local actual="$2" local minimum="$3" if [[ -z "${actual}" ]]; then printf '[coverage] 无法读取 %s 覆盖率\n' "${label}" >&2 return 1 fi if ! awk -v actual="${actual}" -v minimum="${minimum}" 'BEGIN { exit !(actual + 0 >= minimum + 0) }'; then printf '[coverage] %s 覆盖率 %s%%,低于门禁 %s%%\n' "${label}" "${actual}" "${minimum}" >&2 return 1 fi printf '[coverage] %s %s%%(门禁 %s%%)\n' "${label}" "${actual}" "${minimum}" } total="$(go tool cover -func="${PROFILE}" | awk '/^total:/ { gsub(/%/, "", $3); print $3 }')" require_at_least "后端总语句" "${total}" "30.0" require_at_least "order" "$(coverage_for_package hfb_sys/backend/internal/modules/order)" "40.0" require_at_least "payment" "$(coverage_for_package hfb_sys/backend/internal/modules/payment)" "20.0" require_at_least "wallet" "$(coverage_for_package hfb_sys/backend/internal/modules/wallet)" "34.0" require_at_least "withdrawal" "$(coverage_for_package hfb_sys/backend/internal/modules/withdrawal)" "30.0"