#!/usr/bin/env bash # ============================================================================== # Smart Test Runner for Laravel # Tự động nhận diện môi trường: Laravel Sail -> Docker Compose -> Local PHP # ============================================================================== set -e # Màu sắc thông báo GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color echo -e "${YELLOW}🔍 Đang phát hiện môi trường chạy test...${NC}" # Hàm chạy test run_test() { local runner="$1" shift echo -e "${GREEN}🚀 Chạy test bằng: ${runner} $*${NC}" $runner "$@" } # 1. Kiểm tra Laravel Sail if [ -f "./vendor/bin/sail" ] && docker info >/dev/null 2>&1; then if docker ps --format '{{.Names}}' | grep -q "laravel.test"; then echo -e "${GREEN}✓ Phát hiện Laravel Sail đang hoạt động.${NC}" run_test "./vendor/bin/sail test" "$@" exit 0 fi fi # 2. Kiểm tra Docker Compose tự cấu hình if [ -f "docker-compose.yml" ] || [ -f "compose.yaml" ]; then if docker info >/dev/null 2>&1; then # Tìm container service chạy php SERVICES=("app" "php" "php-fpm" "backend" "workspace" "web") for svc in "${SERVICES[@]}"; do if docker compose ps --services --filter "status=running" 2>/dev/null | grep -q "^${svc}$"; then echo -e "${GREEN}✓ Phát hiện Docker Compose với service: '${svc}'${NC}" run_test "docker compose exec -T ${svc} php artisan test" "$@" exit 0 fi done fi fi # 3. Fallback về PHP CLI cục bộ if command -v php >/dev/null 2>&1; then echo -e "${YELLOW}ℹ Không tìm thấy container Docker đang chạy. Chuyển về PHP CLI máy local.${NC}" # Kiểm tra extension pdo_sqlite if ! php -m | grep -q -i sqlite; then echo -e "${RED}⚠️ Cảnh báo: PHP CLI hiện tại chưa bật extension pdo_sqlite. Unit test dùng In-memory SQLite có thể bị lỗi!${NC}" fi run_test "php artisan test" "$@" exit 0 fi echo -e "${RED}❌ Không tìm thấy môi trường phù hợp (Sail, Docker Compose hoặc PHP CLI) để chạy test!${NC}" exit 1