feat: add comprehensive unit testing support for CakePHP

- Add 4 CakePHP Claude Code skills: cakephp-unit-test, cakephp-test-setup, cakephp-test-review, cakephp-mock-helper
- Add 11 CakePHP PHPUnit component templates (Table, Entity, Controller, Service, Command, Component, Middleware, Mailer, Form, Behavior, Helper)
- Add CakePHP configs (phpunit.xml.dist, app_local.test.php for SQLite in-memory)
- Add comprehensive CakePHP documentation and component guides
- Update test-runner.sh and installer to auto-detect Laravel and CakePHP
- Add CakePHP CI/CD templates for GitHub Actions and GitLab CI
- Update system prompt, verification checklist, and README with dedicated guides
This commit is contained in:
2026-09-14 10:19:40 +07:00
parent 0dce2ef812
commit 7425b263d5
28 changed files with 2210 additions and 356 deletions
+11 -4
View File
@@ -1,7 +1,7 @@
services:
test-runner:
image: php:8.3-cli-alpine
container_name: laravel_unit_tester
container_name: php_unit_tester
working_dir: /var/www/html
volumes:
- ./:/var/www/html
@@ -15,7 +15,14 @@ services:
- MAIL_MAILER=array
command: >
sh -c "
apk add --no-cache sqlite-libs libzip-dev zip unzip git &&
docker-php-ext-install pdo pdo_sqlite zip &&
php artisan test
apk add --no-cache sqlite-libs libzip-dev icu-dev zip unzip git &&
docker-php-ext-configure intl &&
docker-php-ext-install pdo pdo_sqlite zip intl &&
if [ -f 'bin/cake' ]; then
bin/cake test app;
elif [ -f 'artisan' ]; then
php artisan test;
else
vendor/bin/phpunit;
fi
"
+96 -31
View File
@@ -1,8 +1,9 @@
#!/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
# Smart Test Runner for Laravel & CakePHP
# Tự động nhận diện Framework (Laravel / CakePHP) và Môi trường thực thi:
# Laravel Sail -> Docker Compose -> Local PHP CLI / bin/cake / phpunit
# ==============================================================================
set -e
@@ -10,10 +11,12 @@ set -e
# Màu sắc thông báo
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
echo -e "${YELLOW}🔍 Đang phát hiện môi trường chạy test...${NC}"
echo -e "${YELLOW}🔍 Đang phát hiện Framework và môi trường chạy test...${NC}"
# Hàm chạy test
run_test() {
@@ -23,42 +26,104 @@ run_test() {
$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" "$@"
# 1. Xác định Framework: CakePHP hay Laravel
FRAMEWORK="generic"
if [ -f "bin/cake" ] || ( [ -f "composer.json" ] && grep -q '"cakephp/cakephp"' composer.json ); then
FRAMEWORK="cakephp"
echo -e "${CYAN}✓ Phát hiện Framework: CakePHP${NC}"
elif [ -f "artisan" ] || ( [ -f "composer.json" ] && grep -q '"laravel/framework"' composer.json ); then
FRAMEWORK="laravel"
echo -e "${CYAN}✓ Phát hiện Framework: Laravel${NC}"
else
echo -e "${BLUE}ℹ Framework: PHP Generic (PHPUnit)${NC}"
fi
# 2. Xử lý môi trường CakePHP
if [ "$FRAMEWORK" = "cakephp" ]; then
# A. Docker Compose
if [ -f "docker-compose.yml" ] || [ -f "compose.yaml" ]; then
if docker info >/dev/null 2>&1; 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}✓ Phát hiện Docker Compose với service: '${svc}'${NC}"
if docker compose exec -T ${svc} test -f "bin/cake" 2>/dev/null; then
run_test "docker compose exec -T ${svc} bin/cake test app" "$@"
exit 0
else
run_test "docker compose exec -T ${svc} vendor/bin/phpunit" "$@"
exit 0
fi
fi
done
fi
fi
# B. Local CakePHP CLI
if [ -f "bin/cake" ] && command -v php >/dev/null 2>&1; then
if ! php -m | grep -q -i intl; then
echo -e "${YELLOW}⚠️ Cảnh báo: PHP CLI hiện tại chưa bật extension 'intl'. CakePHP yêu cầu extension này để chạy!${NC}"
fi
if ! php -m | grep -q -i sqlite; then
echo -e "${YELLOW}⚠️ Cảnh báo: PHP CLI hiện tại chưa bật extension 'pdo_sqlite'. Test dùng In-memory SQLite có thể bị lỗi!${NC}"
fi
echo -e "${GREEN}✓ Sử dụng CakePHP CLI cục bộ (bin/cake)${NC}"
run_test "bin/cake test app" "$@"
exit 0
fi
# C. Local PHPUnit fallback
if [ -f "vendor/bin/phpunit" ] && command -v php >/dev/null 2>&1; then
echo -e "${GREEN}✓ Sử dụng vendor/bin/phpunit cục bộ${NC}"
run_test "./vendor/bin/phpunit" "$@"
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
# 3. Xử lý môi trường Laravel
if [ "$FRAMEWORK" = "laravel" ]; then
# A. 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
# B. Docker Compose
if [ -f "docker-compose.yml" ] || [ -f "compose.yaml" ]; then
if docker info >/dev/null 2>&1; then
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
# C. 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}"
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
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" "$@"
# 4. Fallback chung cho mọi dự án PHP
if [ -f "vendor/bin/phpunit" ]; then
echo -e "${YELLOW}ℹ Chạy qua vendor/bin/phpunit cục bộ...${NC}"
run_test "./vendor/bin/phpunit" "$@"
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}"
echo -e "${RED}❌ Không tìm thấy môi trường phù hợp (Docker Compose, Sail, bin/cake, hoặc PHP CLI) để chạy test!${NC}"
exit 1