181 lines
5.9 KiB
Bash
Executable File
181 lines
5.9 KiB
Bash
Executable File
#!/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"
|