Skip to content

Commit 82d15cf

Browse files
achimfritzclaude
andcommitted
[TASK] Add acceptanceComposer suite to runTests.sh
Ports TYPO3 core commit fa6c3fc4ea3 (Add composer-mode to our acceptance test matrix) to b13/container, adding the infrastructure to run backend acceptance tests against a real composer-installed TYPO3 instance instead of the fixture-based classic-mode instance. - Add Build/Scripts/setupAcceptanceComposer.sh: creates a fresh composer-installed TYPO3 under .Build/Web/typo3temp/var/tests/ acceptance-composer/, wires b13/container as a path repository, runs typo3 setup, and imports all acceptance fixtures via dataset:import. - Add -s acceptanceComposer case to runTests.sh: spins up an optional DB container, runs the setup script, then starts chrome + phpfpm + apache pointing at the composer instance public/ dir, and invokes codecept with --env ci,composer. - Update printSummary, help text, and -d/-g/-x flag docs accordingly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 231c85b commit 82d15cf

2 files changed

Lines changed: 172 additions & 5 deletions

File tree

Build/Scripts/runTests.sh

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ printSummary() {
1616
echo "Container runtime: ${CONTAINER_BIN}" >&2
1717
echo "Container suffix: ${SUFFIX}"
1818
echo "PHP: ${PHP_VERSION}" >&2
19-
if [[ ${TEST_SUITE} =~ ^(functional|acceptance)$ ]]; then
19+
if [[ ${TEST_SUITE} =~ ^(functional|acceptance|acceptanceComposer)$ ]]; then
2020
case "${DBMS}" in
2121
mariadb|mysql|postgres)
2222
echo "DBMS: ${DBMS} version ${DBMS_VERSION} driver ${DATABASE_DRIVER}" >&2
@@ -155,7 +155,8 @@ Usage: $0 [options] [file]
155155
Options:
156156
-s <...>
157157
Specifies the test suite to run
158-
- acceptance: backend acceptance tests
158+
- acceptance: backend acceptance tests (classic mode, fixture-based instance)
159+
- acceptanceComposer: backend acceptance tests against a real composer-installed TYPO3 instance
159160
- cgl: test and fix all core php files
160161
- composer: "composer" command dispatcher, to execute various composer commands
161162
- composerInstall: "composer install", handy if host has no PHP, uses composer cache of users home
@@ -194,7 +195,7 @@ Options:
194195
- pdo_mysql
195196
196197
-d <sqlite|mariadb|mysql|postgres>
197-
Only with -s functional|functionalDeprecated|acceptance|acceptanceInstall
198+
Only with -s functional|functionalDeprecated|acceptance|acceptanceComposer|acceptanceInstall
198199
Specifies on which DBMS tests are performed
199200
- sqlite: (default): use sqlite
200201
- mariadb: use mariadb
@@ -233,12 +234,12 @@ Options:
233234
- 16 maintained until 2028-11-09
234235
235236
-g
236-
Only with -s acceptance
237+
Only with -s acceptance|acceptanceComposer
237238
Activate selenium grid as local port to watch browser clicking around. Can be surfed using
238239
http://localhost:7900/. A browser tab is opened automatically if xdg-open is installed.
239240
240241
-x
241-
Only with -s functional|unit|acceptance
242+
Only with -s functional|unit|acceptance|acceptanceComposer
242243
Send information to host instance for test or system under test break points. This is especially
243244
useful if a local PhpStorm instance is listening on default xdebug port 9003. A different port
244245
can be selected with -y
@@ -564,6 +565,71 @@ case ${TEST_SUITE} in
564565
;;
565566
esac
566567
;;
568+
acceptanceComposer)
569+
rm -rf "${CORE_ROOT}/.Build/Web/typo3temp/var/tests/acceptance-composer" "${CORE_ROOT}/.Build/Web/typo3temp/var/tests/AcceptanceReports"
570+
571+
PREPAREPARAMS=""
572+
TESTPARAMS=""
573+
case ${DBMS} in
574+
mariadb)
575+
${CONTAINER_BIN} run --rm ${CI_PARAMS} --name mariadb-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=acp -e MYSQL_DATABASE=ac_test --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
576+
waitFor mariadb-ac-${SUFFIX} 3306
577+
PREPAREPARAMS="-e TYPO3_DB_DRIVER=mysqli -e TYPO3_DB_DBNAME=ac_test -e TYPO3_DB_USERNAME=root -e TYPO3_DB_PASSWORD=acp -e TYPO3_DB_HOST=mariadb-ac-${SUFFIX} -e TYPO3_DB_PORT=3306"
578+
TESTPARAMS="-e typo3DatabaseName=ac_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=acp -e typo3DatabaseHost=mariadb-ac-${SUFFIX}"
579+
;;
580+
mysql)
581+
${CONTAINER_BIN} run --rm ${CI_PARAMS} --name mysql-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=acp -e MYSQL_DATABASE=ac_test --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
582+
waitFor mysql-ac-${SUFFIX} 3306
583+
PREPAREPARAMS="-e TYPO3_DB_DRIVER=mysqli -e TYPO3_DB_DBNAME=ac_test -e TYPO3_DB_USERNAME=root -e TYPO3_DB_PASSWORD=acp -e TYPO3_DB_HOST=mysql-ac-${SUFFIX} -e TYPO3_DB_PORT=3306"
584+
TESTPARAMS="-e typo3DatabaseName=ac_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=acp -e typo3DatabaseHost=mysql-ac-${SUFFIX}"
585+
;;
586+
postgres)
587+
${CONTAINER_BIN} run --rm ${CI_PARAMS} --name postgres-ac-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_DB=ac_test -e POSTGRES_PASSWORD=acp -e POSTGRES_USER=ac_test --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
588+
waitFor postgres-ac-${SUFFIX} 5432
589+
PREPAREPARAMS="-e TYPO3_DB_DRIVER=postgres -e TYPO3_DB_DBNAME=ac_test -e TYPO3_DB_USERNAME=ac_test -e TYPO3_DB_PASSWORD=acp -e TYPO3_DB_HOST=postgres-ac-${SUFFIX} -e TYPO3_DB_PORT=5432"
590+
TESTPARAMS="-e typo3DatabaseDriver=pdo_pgsql -e typo3DatabaseName=ac_test -e typo3DatabaseUsername=ac_test -e typo3DatabasePassword=acp -e typo3DatabaseHost=postgres-ac-${SUFFIX}"
591+
;;
592+
sqlite)
593+
PREPAREPARAMS="-e TYPO3_DB_DRIVER=sqlite"
594+
TESTPARAMS="-e typo3DatabaseDriver=pdo_sqlite"
595+
;;
596+
esac
597+
598+
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name acceptance-composer-prepare-${SUFFIX} ${XDEBUG_MODE} -e COMPOSER_CACHE_DIR=${CORE_ROOT}/.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" -e TYPO3=${TYPO3} ${PREPAREPARAMS} ${IMAGE_PHP} "${CORE_ROOT}/Build/Scripts/setupAcceptanceComposer.sh" ".Build/Web/typo3temp/var/tests/acceptance-composer"
599+
SUITE_EXIT_CODE=$?
600+
if [[ ${SUITE_EXIT_CODE} -eq 0 ]]; then
601+
CODECEPION_ENV="--env ci,composer"
602+
if [ "${ACCEPTANCE_HEADLESS}" -eq 1 ]; then
603+
CODECEPION_ENV="--env ci,composer,headless"
604+
fi
605+
COMMAND=(.Build/vendor/codeception/codeception/codecept run Backend -d -c Tests/codeception.yml ${CODECEPION_ENV} "$@" --html reports.html)
606+
SELENIUM_GRID=""
607+
if [ "${ACCEPTANCE_HEADLESS}" -eq 0 ]; then
608+
SELENIUM_GRID="-p 7900:7900 -e SE_VNC_NO_PASSWORD=1 -e VNC_NO_PASSWORD=1"
609+
fi
610+
APACHE_OPTIONS="-e APACHE_RUN_USER=#${HOST_UID} -e APACHE_RUN_SERVERNAME=web -e APACHE_RUN_GROUP=#${HOST_PID} -e APACHE_RUN_DOCROOT=${CORE_ROOT}/.Build/Web/typo3temp/var/tests/acceptance-composer/public -e PHPFPM_HOST=phpfpm -e PHPFPM_PORT=9000"
611+
${CONTAINER_BIN} run --rm ${CI_PARAMS} -d ${SELENIUM_GRID} --name ac-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec ${IMAGE_SELENIUM} >/dev/null
612+
if [ ${CONTAINER_BIN} = "docker" ]; then
613+
${CONTAINER_BIN} run --rm -d --name ac-phpfpm-${SUFFIX} --network ${NETWORK} --network-alias phpfpm --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -e PHPFPM_USER=${HOST_UID} -e PHPFPM_GROUP=${HOST_PID} -v ${CORE_ROOT}:${CORE_ROOT} ${IMAGE_PHP} php-fpm ${PHP_FPM_OPTIONS} >/dev/null
614+
${CONTAINER_BIN} run --rm -d --name ac-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "${CONTAINER_HOST}:host-gateway" -v ${CORE_ROOT}:${CORE_ROOT} ${APACHE_OPTIONS} ${IMAGE_APACHE} >/dev/null
615+
else
616+
${CONTAINER_BIN} run --rm ${CI_PARAMS} -d --name ac-phpfpm-${SUFFIX} --network ${NETWORK} --network-alias phpfpm ${USERSET} -e PHPFPM_USER=0 -e PHPFPM_GROUP=0 -v ${CORE_ROOT}:${CORE_ROOT} ${IMAGE_PHP} php-fpm -R ${PHP_FPM_OPTIONS} >/dev/null
617+
${CONTAINER_BIN} run --rm ${CI_PARAMS} -d --name ac-web-${SUFFIX} --network ${NETWORK} --network-alias web -v ${CORE_ROOT}:${CORE_ROOT} ${APACHE_OPTIONS} ${IMAGE_APACHE} >/dev/null
618+
fi
619+
waitFor chrome 4444
620+
if [ "${ACCEPTANCE_HEADLESS}" -eq 0 ]; then
621+
waitFor chrome 7900
622+
fi
623+
waitFor web 80
624+
if [ "${ACCEPTANCE_HEADLESS}" -eq 0 ] && type "xdg-open" >/dev/null; then
625+
xdg-open http://localhost:7900/?autoconnect=1 >/dev/null
626+
elif [ "${ACCEPTANCE_HEADLESS}" -eq 0 ] && type "open" >/dev/null; then
627+
open http://localhost:7900/?autoconnect=1 >/dev/null
628+
fi
629+
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-${DBMS}-composer-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${TESTPARAMS} ${IMAGE_PHP} "${COMMAND[@]}"
630+
SUITE_EXIT_CODE=$?
631+
fi
632+
;;
567633
cgl)
568634
# Active dry-run for cgl needs not "-n" but specific options
569635
if [ -n "${CGLCHECK_DRY_RUN}" ]; then
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#!/bin/sh
2+
3+
#
4+
# Set up a composer-installed TYPO3 test instance for acceptance testing.
5+
# Called by runTests.sh -s acceptanceComposer.
6+
#
7+
# Creates symlinks so that Build/composer/composer.dist.json can reference
8+
# local paths with short names instead of deeply-nested relative URLs.
9+
# Mirrors the approach used in the TYPO3 core's setupAcceptanceComposer.sh.
10+
#
11+
12+
set -e
13+
14+
cd "$(dirname $(realpath $0))/../../"
15+
16+
PROJECT_PATH=${1:-.Build/Web/typo3temp/var/tests/acceptance-composer}
17+
export TYPO3_DB_DRIVER=${TYPO3_DB_DRIVER:-sqlite}
18+
TYPO3_VERSION="${TYPO3:-14}"
19+
20+
case "${TYPO3_VERSION}" in
21+
13)
22+
TYPO3_CONSTRAINT="^13.4"
23+
;;
24+
14|14-dev|*)
25+
TYPO3_CONSTRAINT="^14.3"
26+
;;
27+
esac
28+
29+
# Compute the relative path from PROJECT_PATH back to the project root.
30+
# e.g. ".Build/Web/typo3temp/var/tests/acceptance-composer" -> "../../../../../../"
31+
RELATIVE_ROOT=$(echo "${PROJECT_PATH}" | sed -e 's/[^\/][^\/]*/../g' -e 's/\/$//')
32+
33+
mkdir -p "${PROJECT_PATH}"
34+
35+
# b13-container -> project root (provides the b13/container path repository)
36+
# packages -> Build/tests/packages (provides typo3tests/dataset-import)
37+
ln -snf "${RELATIVE_ROOT}" "${PROJECT_PATH}/b13-container"
38+
ln -snf "${RELATIVE_ROOT}/Build/tests/packages" "${PROJECT_PATH}/packages"
39+
40+
# Generate composer.json from the dist template, substituting the TYPO3 constraint.
41+
sed "s/TYPO3_CONSTRAINT/${TYPO3_CONSTRAINT}/g" Build/composer/composer.dist.json > "${PROJECT_PATH}/composer.json"
42+
43+
cd "${PROJECT_PATH}"
44+
rm -rf composer.lock config/ public/ var/ vendor/
45+
46+
mkdir -p "config/system/"
47+
cat > "config/system/additional.php" <<\EOF
48+
<?php
49+
$GLOBALS['TYPO3_CONF_VARS']['BE']['debug'] = true;
50+
// "Temporary Password - 123"
51+
$GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'] = '$argon2i$v=19$m=65536,t=16,p=1$c3hCMGVXOHhRd0M3MzhSVw$WPQHpElapKMxsxfSkkXw5YQxGKN+rGmjM8vQv3g79YY';
52+
$GLOBALS['TYPO3_CONF_VARS']['SYS']['displayErrors'] = true;
53+
$GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'] = '*';
54+
$GLOBALS['TYPO3_CONF_VARS']['SYS']['exceptionalErrors'] = E_ALL;
55+
$GLOBALS['TYPO3_CONF_VARS']['SYS']['errorHandlerErrors'] = E_ALL;
56+
$GLOBALS['TYPO3_CONF_VARS']['SYS']['trustedHostsPattern'] = '.*';
57+
$GLOBALS['TYPO3_CONF_VARS']['GFX']['processor'] = 'GraphicsMagick';
58+
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport'] = 'mbox';
59+
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_mbox_file'] = \TYPO3\CMS\Core\Core\Environment::getVarPath() . '/log/mail.mbox';
60+
EOF
61+
62+
EXTRA_PACKAGES=""
63+
if [ "${TYPO3_VERSION}" = "13" ]; then
64+
EXTRA_PACKAGES="ichhabrecht/content-defender:*"
65+
fi
66+
67+
# `composer require` implicitly performs an initial install since there is no composer.lock.
68+
composer require --no-progress --no-interaction --dev \
69+
typo3tests/dataset-import:@dev \
70+
typo3/testing-framework:^9.1 \
71+
${EXTRA_PACKAGES}
72+
73+
TYPO3_SERVER_TYPE=apache \
74+
TYPO3_PROJECT_NAME="Container Test" \
75+
vendor/bin/typo3 setup --force --no-interaction
76+
77+
# Import acceptance test fixtures. vendor/b13/container symlinks back to the
78+
# project root via the b13-container path repository.
79+
FIXTURES="vendor/b13/container/Tests/Acceptance/Fixtures"
80+
vendor/bin/typo3 dataset:import "${FIXTURES}/be_users.csv"
81+
vendor/bin/typo3 dataset:import "${FIXTURES}/be_groups.csv"
82+
vendor/bin/typo3 dataset:import "${FIXTURES}/sys_workspace.csv"
83+
vendor/bin/typo3 dataset:import "${FIXTURES}/pages.csv"
84+
vendor/bin/typo3 dataset:import "${FIXTURES}/contentDefenderMaxitems.csv"
85+
vendor/bin/typo3 dataset:import "${FIXTURES}/contentTCASelectCtype.csv"
86+
vendor/bin/typo3 dataset:import "${FIXTURES}/emptyPage.csv"
87+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithContainer.csv"
88+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithContainer-2.csv"
89+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithContainer-3.csv"
90+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithContainer-4.csv"
91+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithContainer-5.csv"
92+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithContainer-6.csv"
93+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithDifferentContainers.csv"
94+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithLocalization.csv"
95+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithLocalizationFreeModeWithContainer.csv"
96+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithTranslatedContainer.csv"
97+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithTranslatedContainer-2.csv"
98+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithWorkspace.csv"
99+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithWorkspace-movedContainer.csv"
100+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithWorkspace-changedContainer.csv"
101+
vendor/bin/typo3 dataset:import "${FIXTURES}/pageWithContainerAndContentElementOutside.csv"

0 commit comments

Comments
 (0)