Initial commit

This commit is contained in:
Zhongwei Li
2025-11-30 08:43:33 +08:00
commit 624998dbc3
27 changed files with 6036 additions and 0 deletions

180
scripts/setup-testing.sh Executable file
View File

@@ -0,0 +1,180 @@
#!/usr/bin/env bash
#
# Setup TYPO3 testing infrastructure
#
# This script initializes testing infrastructure for TYPO3 extensions:
# - Composer dependencies
# - PHPUnit configurations
# - Directory structure
# - Optional: Docker Compose for acceptance tests
#
set -e
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Script configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
PROJECT_DIR="$(pwd)"
WITH_ACCEPTANCE=false
# Parse arguments
while getopts ":a" opt; do
case ${opt} in
a)
WITH_ACCEPTANCE=true
;;
\?)
echo "Usage: $0 [-a]"
echo " -a Include acceptance testing setup (Docker Compose, Codeception)"
exit 1
;;
esac
done
echo -e "${GREEN}=== TYPO3 Testing Infrastructure Setup ===${NC}"
echo
# Check if composer.json exists
if [ ! -f "${PROJECT_DIR}/composer.json" ]; then
echo -e "${RED}Error: composer.json not found in current directory${NC}"
echo "Please run this script from your TYPO3 extension root directory"
exit 1
fi
# 1. Install testing framework dependencies
echo -e "${YELLOW}[1/6] Installing testing framework dependencies...${NC}"
if ! grep -q "typo3/testing-framework" "${PROJECT_DIR}/composer.json"; then
composer require --dev "typo3/testing-framework:^8.0 || ^9.0" --no-update
echo -e "${GREEN}✓ Added typo3/testing-framework${NC}"
else
echo -e "${GREEN}✓ typo3/testing-framework already present${NC}"
fi
# Install PHPUnit if not present
if ! grep -q "phpunit/phpunit" "${PROJECT_DIR}/composer.json"; then
composer require --dev "phpunit/phpunit:^10.5 || ^11.0" --no-update
echo -e "${GREEN}✓ Added phpunit/phpunit${NC}"
fi
composer update --no-progress
# 2. Create directory structure
echo -e "${YELLOW}[2/6] Creating directory structure...${NC}"
mkdir -p "${PROJECT_DIR}/Tests/Unit"
mkdir -p "${PROJECT_DIR}/Tests/Functional/Fixtures"
mkdir -p "${PROJECT_DIR}/Build/phpunit"
mkdir -p "${PROJECT_DIR}/Build/Scripts"
echo -e "${GREEN}✓ Directories created${NC}"
# 3. Copy PHPUnit configurations
echo -e "${YELLOW}[3/6] Installing PHPUnit configurations...${NC}"
if [ ! -f "${PROJECT_DIR}/Build/phpunit/UnitTests.xml" ]; then
cp "${SKILL_DIR}/templates/UnitTests.xml" "${PROJECT_DIR}/Build/phpunit/"
echo -e "${GREEN}✓ Created UnitTests.xml${NC}"
else
echo -e "${YELLOW}⚠ UnitTests.xml already exists (skipped)${NC}"
fi
if [ ! -f "${PROJECT_DIR}/Build/phpunit/FunctionalTests.xml" ]; then
cp "${SKILL_DIR}/templates/FunctionalTests.xml" "${PROJECT_DIR}/Build/phpunit/"
echo -e "${GREEN}✓ Created FunctionalTests.xml${NC}"
else
echo -e "${YELLOW}⚠ FunctionalTests.xml already exists (skipped)${NC}"
fi
if [ ! -f "${PROJECT_DIR}/Build/phpunit/FunctionalTestsBootstrap.php" ]; then
cp "${SKILL_DIR}/templates/FunctionalTestsBootstrap.php" "${PROJECT_DIR}/Build/phpunit/"
echo -e "${GREEN}✓ Created FunctionalTestsBootstrap.php${NC}"
else
echo -e "${YELLOW}⚠ FunctionalTestsBootstrap.php already exists (skipped)${NC}"
fi
# 4. Create AGENTS.md templates
echo -e "${YELLOW}[4/6] Creating AGENTS.md templates...${NC}"
for dir in "${PROJECT_DIR}/Tests/Unit" "${PROJECT_DIR}/Tests/Functional"; do
if [ ! -f "${dir}/AGENTS.md" ]; then
cp "${SKILL_DIR}/templates/AGENTS.md" "${dir}/"
echo -e "${GREEN}✓ Created ${dir}/AGENTS.md${NC}"
else
echo -e "${YELLOW}${dir}/AGENTS.md already exists (skipped)${NC}"
fi
done
# 5. Setup composer scripts
echo -e "${YELLOW}[5/6] Adding composer test scripts...${NC}"
if ! grep -q "ci:test:php:unit" "${PROJECT_DIR}/composer.json"; then
echo -e "${GREEN} Add these scripts to your composer.json:${NC}"
cat << 'EOF'
"scripts": {
"ci:test": [
"@ci:test:php:lint",
"@ci:test:php:phpstan",
"@ci:test:php:unit",
"@ci:test:php:functional"
],
"ci:test:php:lint": "phplint",
"ci:test:php:phpstan": "phpstan analyze --configuration Build/phpstan.neon --no-progress",
"ci:test:php:unit": "phpunit -c Build/phpunit/UnitTests.xml",
"ci:test:php:functional": "phpunit -c Build/phpunit/FunctionalTests.xml"
}
EOF
else
echo -e "${GREEN}✓ Test scripts already configured${NC}"
fi
# 6. Setup acceptance testing if requested
if [ "${WITH_ACCEPTANCE}" = true ]; then
echo -e "${YELLOW}[6/6] Setting up acceptance testing...${NC}"
# Install Codeception
if ! grep -q "codeception/codeception" "${PROJECT_DIR}/composer.json"; then
composer require --dev codeception/codeception codeception/module-webdriver --no-update
composer update --no-progress
echo -e "${GREEN}✓ Installed Codeception${NC}"
fi
# Create acceptance test directory
mkdir -p "${PROJECT_DIR}/Tests/Acceptance"
# Copy Docker Compose and Codeception config
if [ ! -f "${PROJECT_DIR}/Build/docker-compose.yml" ]; then
cp "${SKILL_DIR}/templates/docker/docker-compose.yml" "${PROJECT_DIR}/Build/"
echo -e "${GREEN}✓ Created docker-compose.yml${NC}"
fi
if [ ! -f "${PROJECT_DIR}/codeception.yml" ]; then
cp "${SKILL_DIR}/templates/docker/codeception.yml" "${PROJECT_DIR}/"
echo -e "${GREEN}✓ Created codeception.yml${NC}"
fi
# Initialize Codeception
if [ ! -d "${PROJECT_DIR}/Tests/Acceptance/_support" ]; then
vendor/bin/codecept bootstrap
echo -e "${GREEN}✓ Initialized Codeception${NC}"
fi
else
echo -e "${YELLOW}[6/6] Skipping acceptance testing setup (use -a flag to include)${NC}"
fi
echo
echo -e "${GREEN}=== Setup Complete ===${NC}"
echo
echo "Next steps:"
echo "1. Generate your first test:"
echo " ${SKILL_DIR}/scripts/generate-test.sh unit MyClass"
echo
echo "2. Run tests:"
echo " composer ci:test:php:unit"
echo " composer ci:test:php:functional"
echo
echo "3. Add CI/CD workflow (optional):"
echo " cp ${SKILL_DIR}/templates/github-actions-tests.yml .github/workflows/tests.yml"