2045c856e9
- Add 10 core testing guides (setup, AAA principles, PHPUnit/Pest, mocking, anti-patterns, PHP 8.4+, debugging, data factories, advanced edge cases) - Add 13 component testing guides covering all Laravel layers - Add standard templates for PHPUnit 10/11 and Pest v2/v3 including ArchitectureTest - Add Docker smart test runner, dependency installer, and CI/CD templates (GitHub Actions, GitLab CI) - Add 4 Claude Code skills (laravel-test-setup, laravel-unit-test with --all mode, laravel-test-review, laravel-mock-helper) - Add single unified installer script (sg-install-unit-testing.sh) with global support, CLI runners, and 1-click updater (sg-test-update) - Add comprehensive documentation (README.md, USAGE-GUIDE.md) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
259 lines
12 KiB
Bash
Executable File
259 lines
12 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
|
||
# ==============================================================================
|
||
# SMARTGIFT AI - LARAVEL UNIT TESTING TOOLKIT INSTALLER
|
||
# Bộ cài đặt công cụ chuẩn hóa và tự động sinh Unit Test cho dự án Laravel
|
||
#
|
||
# Cách dùng:
|
||
# 1. Cài đặt TOÀN CỤC (Khuyên dùng cho cả Team - chạy được ở MỌI thư mục):
|
||
# ./sg-install-unit-testing.sh --global
|
||
#
|
||
# 2. Cài đặt riêng vào một dự án cụ thể:
|
||
# ./sg-install-unit-testing.sh /duong-dan/toi/du-an-laravel
|
||
#
|
||
# 3. Cài đặt ngay tại thư mục hiện tại:
|
||
# ./sg-install-unit-testing.sh .
|
||
# ==============================================================================
|
||
|
||
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'
|
||
|
||
# Tự động tìm đường dẫn gốc của repository (kể cả khi gọi qua symlink ở bất kỳ đâu)
|
||
SOURCE="${BASH_SOURCE[0]}"
|
||
while [ -L "$SOURCE" ]; do
|
||
DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
|
||
SOURCE="$(readlink "$SOURCE")"
|
||
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
|
||
done
|
||
CURRENT_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
|
||
|
||
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
|
||
echo -e "${BLUE}===================================================================${NC}"
|
||
echo -e "${CYAN} SMARTGIFT AI: LARAVEL UNIT TESTING TOOLKIT INSTALLER${NC}"
|
||
echo -e "${BLUE}===================================================================${NC}"
|
||
echo -e "Cách dùng:"
|
||
echo -e " 1. Cài đặt toàn cục (dùng ở mọi nơi trên máy):"
|
||
echo -e " ${YELLOW}sg-install-unit-testing.sh --global${NC}"
|
||
echo -e " 2. Khởi tạo vào dự án tại thư mục hiện tại:"
|
||
echo -e " ${YELLOW}sg-install-unit-testing.sh${NC} (hoặc ${YELLOW}sg-install-unit-testing.sh .${NC})"
|
||
echo -e " 3. Khởi tạo vào một thư mục dự án cụ thể:"
|
||
echo -e " ${YELLOW}sg-install-unit-testing.sh /duong-dan/toi/du-an${NC}"
|
||
exit 0
|
||
fi
|
||
|
||
# ==============================================================================
|
||
# 1. XỬ LÝ CÀI ĐẶT TOÀN CỤC (GLOBAL MODE: DÙNG CHO MỌI THƯ MỤC TRÊN MÁY TÍNH)
|
||
# ==============================================================================
|
||
if [ "$1" = "--global" ] || [ "$1" = "-g" ]; then
|
||
echo -e "${BLUE}===================================================================${NC}"
|
||
echo -e "${CYAN} SMARTGIFT AI: CÀI ĐẶT BỘ LARAVEL UNIT TESTING TOOLKIT TOÀN CỤC${NC}"
|
||
echo -e "${YELLOW} Thư mục đích: $HOME/.claude/skills/${NC}"
|
||
echo -e "${BLUE}===================================================================${NC}"
|
||
|
||
# 1. Cài đặt Skills cho Claude Code (Liên kết động để khi git pull tự động cập nhật ngay)
|
||
mkdir -p "$HOME/.claude/skills"
|
||
echo -e "📦 Đang liên kết bộ 4 Claude Code Skills vào $HOME/.claude/skills/..."
|
||
for skill_dir in "$CURRENT_DIR/.claude/skills/"*; do
|
||
skill_name="$(basename "$skill_dir")"
|
||
ln -sfn "$skill_dir" "$HOME/.claude/skills/$skill_name"
|
||
done
|
||
|
||
# 2. Lưu trữ Docs và Templates tham khảo toàn cục
|
||
mkdir -p "$HOME/.claude/laravel-testing-docs/templates"
|
||
cp -R "$CURRENT_DIR/docs/"* "$HOME/.claude/laravel-testing-docs/"
|
||
cp -R "$CURRENT_DIR/rules/"* "$HOME/.claude/laravel-testing-docs/"
|
||
cp -R "$CURRENT_DIR/templates/"* "$HOME/.claude/laravel-testing-docs/templates/"
|
||
|
||
# 3. Tạo lệnh CLI toàn cục: laravel-unit-test-setup & sg-test-init
|
||
mkdir -p "$HOME/.local/bin"
|
||
cat << 'EOF' > "$HOME/.local/bin/laravel-unit-test-setup"
|
||
#!/usr/bin/env bash
|
||
# Smartgift AI - Laravel Unit Test Project Initializer
|
||
|
||
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
|
||
echo "=================================================================="
|
||
echo " SMARTGIFT AI: LARAVEL UNIT TEST PROJECT INITIALIZER"
|
||
echo "=================================================================="
|
||
echo "Cách dùng: laravel-unit-test-setup [đường-dẫn-dự-án]"
|
||
echo "Mặc định khởi tạo vào thư mục hiện tại nếu không truyền tham số."
|
||
exit 0
|
||
fi
|
||
|
||
TARGET_DIR="${1:-.}"
|
||
SOURCE_DIR="$HOME/.claude/laravel-testing-docs"
|
||
|
||
if [ ! -d "$TARGET_DIR" ]; then
|
||
echo "Lỗi: Thư mục '$TARGET_DIR' không tồn tại!"
|
||
exit 1
|
||
fi
|
||
|
||
echo "🚀 Đang khởi tạo công cụ test cho dự án tại: $TARGET_DIR"
|
||
|
||
if [ -f "$SOURCE_DIR/templates/docker/test-runner.sh" ]; then
|
||
cp "$SOURCE_DIR/templates/docker/test-runner.sh" "$TARGET_DIR/test-runner.sh"
|
||
chmod +x "$TARGET_DIR/test-runner.sh"
|
||
echo " ✓ Đã tạo $TARGET_DIR/test-runner.sh"
|
||
fi
|
||
|
||
if [ -f "$SOURCE_DIR/templates/setup-dependencies.sh" ]; then
|
||
cp "$SOURCE_DIR/templates/setup-dependencies.sh" "$TARGET_DIR/setup-test-deps.sh"
|
||
chmod +x "$TARGET_DIR/setup-test-deps.sh"
|
||
echo " ✓ Đã tạo $TARGET_DIR/setup-test-deps.sh"
|
||
fi
|
||
|
||
echo "🎉 Khởi tạo hoàn tất! Bạn có thể mở Claude Code tại thư mục này và gõ /laravel-test-setup"
|
||
EOF
|
||
chmod +x "$HOME/.local/bin/laravel-unit-test-setup"
|
||
|
||
# Tạo thêm các bí danh ngắn gọn
|
||
rm -f "$HOME/.local/bin/laravel-test-init" "$HOME/.local/bin/sg-test-init"
|
||
cp "$HOME/.local/bin/laravel-unit-test-setup" "$HOME/.local/bin/laravel-test-init"
|
||
cp "$HOME/.local/bin/laravel-unit-test-setup" "$HOME/.local/bin/sg-test-init"
|
||
chmod +x "$HOME/.local/bin/laravel-test-init" "$HOME/.local/bin/sg-test-init"
|
||
|
||
# 4. Tạo lệnh CLI toàn cục: sg-test-update (Cập nhật 1-Click cho Team)
|
||
cat << EOF > "$HOME/.local/bin/sg-test-update"
|
||
#!/usr/bin/env bash
|
||
# Smartgift AI - One-Click Toolkit Updater
|
||
|
||
TOOLKIT_REPO="$CURRENT_DIR"
|
||
TARGET_DIR="\${1:-}"
|
||
|
||
# Tự động nhận diện nếu đang đứng trong một dự án Laravel
|
||
if [ -z "\$TARGET_DIR" ] && [ -f "./composer.json" ]; then
|
||
TARGET_DIR="."
|
||
fi
|
||
|
||
echo "🔄 Đang cập nhật bộ công cụ Smartgift AI Unit Testing từ Git..."
|
||
|
||
if [ -d "\$TOOLKIT_REPO/.git" ]; then
|
||
git -C "\$TOOLKIT_REPO" pull origin main
|
||
echo "✓ Đã kéo mã nguồn mới nhất từ remote Git."
|
||
else
|
||
echo "⚠️ Không tìm thấy git repo tại \$TOOLKIT_REPO"
|
||
fi
|
||
|
||
# Tự động đồng bộ lại docs và skills
|
||
mkdir -p "$HOME/.claude/laravel-testing-docs/templates"
|
||
cp -R "\$TOOLKIT_REPO/docs/"* "$HOME/.claude/laravel-testing-docs/"
|
||
cp -R "\$TOOLKIT_REPO/rules/"* "$HOME/.claude/laravel-testing-docs/"
|
||
cp -R "\$TOOLKIT_REPO/templates/"* "$HOME/.claude/laravel-testing-docs/templates/"
|
||
|
||
# Nếu có truyền đường dẫn dự án cụ thể, update luôn cho dự án đó
|
||
if [ -n "\$TARGET_DIR" ] && [ -d "\$TARGET_DIR" ]; then
|
||
echo "📦 Cập nhật cho dự án: \$TARGET_DIR"
|
||
cp "\$TOOLKIT_REPO/templates/docker/test-runner.sh" "\$TARGET_DIR/test-runner.sh" 2>/dev/null || true
|
||
cp "\$TOOLKIT_REPO/templates/setup-dependencies.sh" "\$TARGET_DIR/setup-test-deps.sh" 2>/dev/null || true
|
||
chmod +x "\$TARGET_DIR/test-runner.sh" "\$TARGET_DIR/setup-test-deps.sh" 2>/dev/null || true
|
||
if [ -d "\$TARGET_DIR/.claude/testing-docs" ]; then
|
||
cp -R "\$TOOLKIT_REPO/docs/"* "\$TARGET_DIR/.claude/testing-docs/"
|
||
cp -R "\$TOOLKIT_REPO/rules/"* "\$TARGET_DIR/.claude/testing-docs/"
|
||
fi
|
||
fi
|
||
|
||
echo "🎉 CẬP NHẬT HOÀN TẤT! Tất cả các Skills & Docs đã ở phiên bản mới nhất."
|
||
EOF
|
||
chmod +x "$HOME/.local/bin/sg-test-update"
|
||
cp "$HOME/.local/bin/sg-test-update" "$HOME/.local/bin/laravel-test-update"
|
||
chmod +x "$HOME/.local/bin/laravel-test-update"
|
||
|
||
echo -e "${GREEN}✓ CÀI ĐẶT TOÀN CỤC CHO TEAM THÀNH CÔNG RỰC RỠ!${NC}"
|
||
echo -e ""
|
||
echo -e "${YELLOW}Kể từ bây giờ, ở BẤT KỲ THƯ MỤC NÀO trên máy tính của bạn:${NC}"
|
||
echo -e " 1. Khi mở Claude Code (gõ 'claude'), các lệnh sau luôn sẵn sàng 100%:"
|
||
echo -e " - ${CYAN}/laravel-test-setup${NC} -> Tự động kiểm tra môi trường & cài package"
|
||
echo -e " - ${CYAN}/laravel-unit-test <target>${NC} -> Sinh test cho file, folder, hoặc --changed"
|
||
echo -e " - ${CYAN}/laravel-test-review <test>${NC} -> Chấm điểm và bắt lỗi anti-patterns"
|
||
echo -e " - ${CYAN}/laravel-mock-helper <class>${NC} -> Sinh mã Mockery nhanh"
|
||
echo -e " 2. Lệnh khởi tạo runner cho bất kỳ dự án nào:"
|
||
echo -e " ${CYAN}laravel-unit-test-setup${NC} (hoặc ${CYAN}sg-test-init${NC})"
|
||
echo -e " 3. Lệnh cập nhật 1-Click khi team có thay đổi mới:"
|
||
echo -e " ${CYAN}sg-test-update${NC} (hoặc ${CYAN}laravel-test-update${NC})"
|
||
exit 0
|
||
fi
|
||
|
||
# ==============================================================================
|
||
# 2. XỬ LÝ CÀI ĐẶT VÀO MỘT DỰ ÁN CỤ THỂ (PROJECT-SPECIFIC MODE)
|
||
# ==============================================================================
|
||
TARGET_DIR="${1:-.}"
|
||
FORCE_INSTALL=false
|
||
|
||
if [ "$2" = "--force" ] || [ "$1" = "--force" ]; then
|
||
FORCE_INSTALL=true
|
||
if [ "$1" = "--force" ]; then
|
||
TARGET_DIR="${2:-.}"
|
||
fi
|
||
fi
|
||
|
||
# Chuẩn hóa đường dẫn tương đối thành tuyệt đối
|
||
TARGET_DIR="$(cd "$TARGET_DIR" 2>/dev/null && pwd || echo "$TARGET_DIR")"
|
||
|
||
if [ ! -d "$TARGET_DIR" ]; then
|
||
echo -e "${RED}Lỗi: Thư mục '$TARGET_DIR' không tồn tại!${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
if [ ! -f "$TARGET_DIR/artisan" ] && [ ! -f "$TARGET_DIR/composer.json" ]; then
|
||
if [ "$FORCE_INSTALL" = false ]; then
|
||
echo -e "${YELLOW}⚠️ Cảnh báo: Thư mục '$TARGET_DIR' chưa có file artisan hoặc composer.json.${NC}"
|
||
echo -e "Nếu bạn vẫn muốn cài đặt trước bộ skills vào thư mục này, hãy thêm cờ: ${GREEN}--force${NC}"
|
||
echo -e "Ví dụ: ${BLUE}$0 $TARGET_DIR --force${NC}"
|
||
exit 1
|
||
else
|
||
echo -e "${YELLOW}ℹ Chế độ --force: Tiến hành cài đặt skills dù chưa có artisan/composer.json.${NC}"
|
||
fi
|
||
fi
|
||
|
||
echo -e "${BLUE}===================================================================${NC}"
|
||
echo -e "${CYAN} SMARTGIFT AI: CÀI ĐẶT LARAVEL UNIT TESTING TOOLKIT VÀO DỰ ÁN${NC}"
|
||
echo -e "${YELLOW} Thư mục đích: $TARGET_DIR${NC}"
|
||
echo -e "${BLUE}===================================================================${NC}"
|
||
|
||
# Tạo thư mục .claude/skills trong dự án đích
|
||
mkdir -p "$TARGET_DIR/.claude/skills"
|
||
echo -e "📦 Đang copy bộ skills..."
|
||
cp -R "$CURRENT_DIR/.claude/skills/"* "$TARGET_DIR/.claude/skills/"
|
||
|
||
# Tạo thư mục chứa docs tham khảo
|
||
mkdir -p "$TARGET_DIR/.claude/testing-docs"
|
||
cp -R "$CURRENT_DIR/docs/"* "$TARGET_DIR/.claude/testing-docs/"
|
||
cp -R "$CURRENT_DIR/rules/"* "$TARGET_DIR/.claude/testing-docs/"
|
||
|
||
# Cài đặt test runner script & dependency setup script
|
||
if [ ! -f "$TARGET_DIR/test-runner.sh" ]; then
|
||
echo -e "🚀 Cài đặt smart test-runner.sh vào root của dự án..."
|
||
cp "$CURRENT_DIR/templates/docker/test-runner.sh" "$TARGET_DIR/test-runner.sh"
|
||
chmod +x "$TARGET_DIR/test-runner.sh"
|
||
fi
|
||
|
||
if [ ! -f "$TARGET_DIR/setup-test-deps.sh" ]; then
|
||
echo -e "📦 Cài đặt smart setup-test-deps.sh vào root của dự án..."
|
||
cp "$CURRENT_DIR/templates/setup-dependencies.sh" "$TARGET_DIR/setup-test-deps.sh"
|
||
chmod +x "$TARGET_DIR/setup-test-deps.sh"
|
||
fi
|
||
|
||
# Cài đặt GitHub Actions CI/CD Pipeline (nếu dự án dùng git)
|
||
if [ -d "$TARGET_DIR/.github" ] || [ -d "$TARGET_DIR/.git" ]; then
|
||
mkdir -p "$TARGET_DIR/.github/workflows"
|
||
if [ ! -f "$TARGET_DIR/.github/workflows/unit-tests.yml" ]; then
|
||
echo -e "⚙️ Cài đặt GitHub Actions CI Workflow vào .github/workflows/unit-tests.yml..."
|
||
cp "$CURRENT_DIR/templates/ci/github-actions.yml.template" "$TARGET_DIR/.github/workflows/unit-tests.yml"
|
||
fi
|
||
fi
|
||
|
||
echo -e "${GREEN}✓ Cài đặt hoàn tất thành công!${NC}"
|
||
echo -e ""
|
||
echo -e "${YELLOW}Các lệnh bạn có thể sử dụng ngay trong dự án đích với Claude Code:${NC}"
|
||
echo -e " 1. ${CYAN}/laravel-test-setup${NC} -> Quét và kiểm tra môi trường test"
|
||
echo -e " 2. ${CYAN}/laravel-unit-test <file|dir>${NC} -> Tự động sinh Unit Test (hỗ trợ cả file, folder, và --changed)"
|
||
echo -e " 3. ${CYAN}/laravel-test-review <test>${NC} -> Review chất lượng file test"
|
||
echo -e " 4. ${CYAN}/laravel-mock-helper <class>${NC} -> Sinh mã Mockery nhanh"
|
||
echo -e " 5. ${CYAN}./test-runner.sh${NC} -> Chạy test tự nhận diện Docker / Sail / Local"
|
||
echo -e " 6. ${CYAN}./setup-test-deps.sh${NC} -> Tự động cài thư viện test còn thiếu"
|