#!/bin/bash ## # Care API - Coverage Reports Generator # # Gera relatórios de cobertura de código completos com análise de qualidade # # @package Care_API # @author Descomplicar® Crescimento Digital # @version 1.0.0 # @since 2025-09-14 ## set -euo pipefail # Configurações readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_DIR="$(dirname "$SCRIPT_DIR")" readonly COVERAGE_DIR="$PROJECT_DIR/coverage-reports" readonly HTML_DIR="$PROJECT_DIR/coverage-html" readonly MERGED_DIR="$PROJECT_DIR/coverage-merged" # Cores para output readonly RED='\033[0;31m' readonly GREEN='\033[0;32m' readonly YELLOW='\033[1;33m' readonly BLUE='\033[0;34m' readonly NC='\033[0m' # No Color # Função para log colorido log() { local level="$1" shift local message="$*" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') case "$level" in "INFO") echo -e "${GREEN}[INFO]${NC} [$timestamp] $message" ;; "WARN") echo -e "${YELLOW}[WARN]${NC} [$timestamp] $message" ;; "ERROR") echo -e "${RED}[ERROR]${NC} [$timestamp] $message" >&2 ;; "DEBUG") echo -e "${BLUE}[DEBUG]${NC} [$timestamp] $message" ;; esac } # Função para verificar pré-requisitos check_prerequisites() { log "INFO" "Verificando pré-requisitos..." # PHP com extensão coverage if ! php -m | grep -q -E "(xdebug|pcov)"; then log "WARN" "Nenhuma extensão de coverage detectada (Xdebug/PCOV)" log "INFO" "Tentando instalar PCOV automaticamente..." # Instalar PCOV se possível if command -v pecl >/dev/null 2>&1; then pecl install pcov || log "WARN" "Falha ao instalar PCOV automaticamente" fi if ! php -m | grep -q -E "(xdebug|pcov)"; then log "ERROR" "Coverage não disponível. Instale Xdebug ou PCOV:" log "ERROR" " sudo apt-get install php-xdebug" log "ERROR" " ou: pecl install pcov" exit 1 fi fi # PHPUnit if ! command -v phpunit >/dev/null 2>&1; then log "ERROR" "PHPUnit não encontrado" exit 1 fi log "INFO" "Pré-requisitos verificados com sucesso" } # Função para limpar relatórios antigos cleanup_old_reports() { log "INFO" "Limpando relatórios antigos..." local dirs_to_clean=("$COVERAGE_DIR" "$HTML_DIR" "$MERGED_DIR") for dir in "${dirs_to_clean[@]}"; do if [[ -d "$dir" ]]; then rm -rf "$dir" log "DEBUG" "Removido: $dir" fi done # Criar directórios mkdir -p "$COVERAGE_DIR" "$HTML_DIR" "$MERGED_DIR" log "INFO" "Limpeza concluída" } # Função para gerar coverage por test suite generate_suite_coverage() { local suite_name="$1" local suite_key="$2" local output_dir="$COVERAGE_DIR/$suite_key" log "INFO" "Gerando coverage para: $suite_name" mkdir -p "$output_dir" # Executar testes com coverage phpunit \ --testsuite="$suite_name" \ --coverage-html "$output_dir/html" \ --coverage-clover "$output_dir/clover.xml" \ --coverage-php "$output_dir/coverage.php" \ --coverage-text > "$output_dir/coverage.txt" 2>&1 || { log "WARN" "Possíveis falhas em $suite_name - coverage gerado parcialmente" } log "INFO" "Coverage gerado para $suite_name: $output_dir" } # Função para gerar coverage completo generate_full_coverage() { log "INFO" "Gerando coverage completo..." phpunit \ --coverage-html "$HTML_DIR" \ --coverage-clover "$COVERAGE_DIR/clover.xml" \ --coverage-crap4j "$COVERAGE_DIR/crap4j.xml" \ --coverage-php "$COVERAGE_DIR/coverage.php" \ --coverage-xml "$COVERAGE_DIR/xml" \ --coverage-text > "$COVERAGE_DIR/coverage-full.txt" 2>&1 || { log "WARN" "Alguns testes falharam - coverage gerado parcialmente" } log "INFO" "Coverage completo gerado" } # Função para gerar métricas de código generate_code_metrics() { log "INFO" "Gerando métricas de código..." local metrics_dir="$COVERAGE_DIR/metrics" mkdir -p "$metrics_dir" # PHPLOC - Métricas de linhas de código if command -v phploc >/dev/null 2>&1; then phploc --log-xml "$metrics_dir/phploc.xml" "$PROJECT_DIR/src" > "$metrics_dir/phploc.txt" 2>&1 || { log "WARN" "PHPLOC falhou" } fi # PHPCPD - Detector de código duplicado if command -v phpcpd >/dev/null 2>&1; then phpcpd --log-pmd "$metrics_dir/phpcpd.xml" "$PROJECT_DIR/src" > "$metrics_dir/phpcpd.txt" 2>&1 || { log "WARN" "PHPCPD falhou" } fi log "INFO" "Métricas de código geradas" } # Função para gerar relatório dashboard generate_dashboard() { log "INFO" "Gerando dashboard de coverage..." local dashboard_file="$PROJECT_DIR/coverage-dashboard.html" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') cat > "$dashboard_file" << 'EOF'
Relatório de Cobertura de Código Gerado em TIMESTAMP_PLACEHOLDER