#!/usr/bin/env bash # ============================================================================== # Smart Dependency Installer for Laravel & CakePHP Testing # Tự động phát hiện gói còn thiếu và cài đặt qua Docker hoặc Local Composer # ============================================================================== set -e GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' RED='\033[0;31m' CYAN='\033[0;36m' NC='\033[0m' echo -e "${BLUE}===================================================================${NC}" echo -e "${CYAN} Tự Động Cài Đặt Thư Viện Cần Thiết Cho Unit Test (Laravel & CakePHP)${NC}" echo -e "${BLUE}===================================================================${NC}" if [ ! -f "composer.json" ]; then echo -e "${RED}❌ Lỗi: Không tìm thấy file composer.json trong thư mục hiện tại!${NC}" exit 1 fi # 1. Xác định Framework FRAMEWORK="generic" if [ -f "bin/cake" ] || grep -q '"cakephp/cakephp"' composer.json; then FRAMEWORK="cakephp" echo -e "${GREEN}✓ Dự án: CakePHP${NC}" elif [ -f "artisan" ] || grep -q '"laravel/framework"' composer.json; then FRAMEWORK="laravel" echo -e "${GREEN}✓ Dự án: Laravel${NC}" fi # 2. Xác định môi trường thực thi lệnh composer COMPOSER_CMD="" if [ -f "./vendor/bin/sail" ] && docker info >/dev/null 2>&1 && docker ps --format '{{.Names}}' | grep -q "laravel.test"; then echo -e "${GREEN}✓ Môi trường: Laravel Sail đang hoạt động.${NC}" COMPOSER_CMD="./vendor/bin/sail composer" elif [ -f "docker-compose.yml" ] || [ -f "compose.yaml" ]; then SERVICES=("app" "web" "php" "php-fpm" "backend" "workspace") for svc in "${SERVICES[@]}"; do if docker compose ps --services --filter "status=running" 2>/dev/null | grep -q "^${svc}$"; then echo -e "${GREEN}✓ Môi trường: Docker Compose (service: ${svc}).${NC}" COMPOSER_CMD="docker compose exec -T ${svc} composer" break fi done fi if [ -z "$COMPOSER_CMD" ]; then if command -v composer >/dev/null 2>&1; then echo -e "${YELLOW}ℹ Môi trường: Composer trên máy cục bộ (Local).${NC}" COMPOSER_CMD="composer" elif [ -f "composer.phar" ]; then echo -e "${YELLOW}ℹ Môi trường: Sử dụng composer.phar cục bộ.${NC}" COMPOSER_CMD="php composer.phar" else echo -e "${RED}❌ Lỗi: Không tìm thấy Composer trên máy hoặc trong container Docker!${NC}" exit 1 fi fi # 3. Phân tích composer.json xem thiếu gói nào echo -e "\n${YELLOW}🔍 Đang kiểm tra dependencies hiện có...${NC}" PACKAGES_TO_INSTALL=() # Kiểm tra PHPUnit nếu là CakePHP if [ "$FRAMEWORK" = "cakephp" ]; then if ! grep -q '"phpunit/phpunit"' composer.json; then PACKAGES_TO_INSTALL+=("phpunit/phpunit") fi fi # Kiểm tra Mockery if ! grep -q '"mockery/mockery"' composer.json; then PACKAGES_TO_INSTALL+=("mockery/mockery") fi # Kiểm tra Faker if ! grep -q '"fakerphp/faker"' composer.json; then PACKAGES_TO_INSTALL+=("fakerphp/faker") fi if [ "$FRAMEWORK" = "laravel" ]; then # Kiểm tra Test Runner (Pest vs PHPUnit) IS_PEST=false if grep -q '"pestphp/pest"' composer.json; then IS_PEST=true fi if [ "$IS_PEST" = true ]; then if ! grep -q '"pestphp/pest-plugin-laravel"' composer.json; then PACKAGES_TO_INSTALL+=("pestphp/pest-plugin-laravel") fi fi # Kiểm tra công cụ chạy song song (Paratest) if ! grep -q '"brianium/paratest"' composer.json; then PACKAGES_TO_INSTALL+=("brianium/paratest") fi # Kiểm tra Collision if ! grep -q '"nunomaduro/collision"' composer.json; then PACKAGES_TO_INSTALL+=("nunomaduro/collision") fi fi # 4. Tiến hành cài đặt if [ ${#PACKAGES_TO_INSTALL[@]} -eq 0 ]; then echo -e "${GREEN}🎉 Tuyệt vời! Dự án đã có đầy đủ các thư viện kiểm thử cần thiết!${NC}" exit 0 fi echo -e "${YELLOW}📦 Các gói cần cài đặt bổ sung:${NC}" for pkg in "${PACKAGES_TO_INSTALL[@]}"; do echo -e " - ${BLUE}$pkg${NC}" done INSTALL_COMMAND="$COMPOSER_CMD require --dev ${PACKAGES_TO_INSTALL[*]} --with-all-dependencies" echo -e "\n${YELLOW}🚀 Đang thực thi lệnh cài đặt:${NC}" echo -e " $INSTALL_COMMAND\n" eval "$INSTALL_COMMAND" echo -e "\n${GREEN}✅ Đã cài đặt hoàn tất các thư viện test cho dự án!${NC}"