diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml index c66794d..f909fb6 100644 --- a/.github/workflows/backend-ci.yml +++ b/.github/workflows/backend-ci.yml @@ -4,13 +4,13 @@ on: [ push, pull_request ] jobs: build: - runs-on: ubuntu-latest + runs-on: self-hosted strategy: fail-fast: false matrix: - php: [ '7.4', '8.1' ] + php: [ '8.1', '8.2' ] include: - - php: '7.4' + - php: '8.1' steps: - name: Checkout Code diff --git a/Classes/Configuration/ConfigurationManager.php b/Classes/Configuration/ConfigurationManager.php index 109ffcb..b8c9089 100644 --- a/Classes/Configuration/ConfigurationManager.php +++ b/Classes/Configuration/ConfigurationManager.php @@ -4,12 +4,12 @@ namespace DFAU\ToujouApi\Configuration; -use TYPO3\CMS\Core\Package\PackageManager; use TYPO3\CMS\Core\Cache\CacheManager; use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Information\Typo3Version; use TYPO3\CMS\Core\Package\PackageInterface; +use TYPO3\CMS\Core\Package\PackageManager; use TYPO3\CMS\Core\Utility\GeneralUtility; class ConfigurationManager diff --git a/Classes/Database/Query/Restriction/SiteRestriction.php b/Classes/Database/Query/Restriction/SiteRestriction.php index b1b9cc4..35be7d5 100644 --- a/Classes/Database/Query/Restriction/SiteRestriction.php +++ b/Classes/Database/Query/Restriction/SiteRestriction.php @@ -8,7 +8,6 @@ use TYPO3\CMS\Core\Database\Query\Expression\CompositeExpression; use TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder; use TYPO3\CMS\Core\Database\Query\Restriction\QueryRestrictionInterface; -use TYPO3\CMS\Core\Database\QueryGenerator; use TYPO3\CMS\Core\Domain\Repository\PageRepository; use TYPO3\CMS\Core\Site\Entity\Site; @@ -17,8 +16,10 @@ class SiteRestriction implements QueryRestrictionInterface /** @var int[]|null */ private $cachedSitePids; - public function __construct(private readonly PageRepository $pageRepository) - {} + public function __construct( + private readonly PageRepository $pageRepository + ) { + } public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder): CompositeExpression { diff --git a/Classes/Deserializer/JsonApiDeserializer.php b/Classes/Deserializer/JsonApiDeserializer.php index 10a5340..32b77bd 100644 --- a/Classes/Deserializer/JsonApiDeserializer.php +++ b/Classes/Deserializer/JsonApiDeserializer.php @@ -11,7 +11,7 @@ class JsonApiDeserializer implements Deserializer public function collection(array $data, int $options = 0): array { if (isset($data['data']) && \is_array($data['data'])) { - return \array_merge(...\array_map(fn($data) => $this->item(['data' => $data], $options), $data['data'])); + return \array_merge(...\array_map(fn ($data) => $this->item(['data' => $data], $options), $data['data'])); } return []; diff --git a/Classes/Domain/Command/UnitOfWorkTcaResourceCommand.php b/Classes/Domain/Command/UnitOfWorkTcaResourceCommand.php index 6dca6b9..97530da 100644 --- a/Classes/Domain/Command/UnitOfWorkTcaResourceCommand.php +++ b/Classes/Domain/Command/UnitOfWorkTcaResourceCommand.php @@ -14,7 +14,7 @@ class UnitOfWorkTcaResourceCommand implements UnitOfWorkCommand public function __construct(array $unitOfWorkCommands) { - $this->unitOfWorkCommands = \array_map(fn(TcaRecordReferencingCommand $command) => $command, $unitOfWorkCommands); + $this->unitOfWorkCommands = \array_map(fn (TcaRecordReferencingCommand $command) => $command, $unitOfWorkCommands); } public function getUnitOfWorkCommands(): array @@ -25,7 +25,7 @@ public function getUnitOfWorkCommands(): array public function withUnitOfWorkCommands(array $unitOfWorkCommands): UnitOfWorkCommand { $target = clone $this; - $target->unitOfWorkCommands = \array_map(fn(TcaRecordReferencingCommand $command) => $command, $unitOfWorkCommands); + $target->unitOfWorkCommands = \array_map(fn (TcaRecordReferencingCommand $command) => $command, $unitOfWorkCommands); return $target; } diff --git a/Classes/Domain/CommandHandler/DataHandlerCommandHandler.php b/Classes/Domain/CommandHandler/DataHandlerCommandHandler.php index fd02a28..cf0c404 100644 --- a/Classes/Domain/CommandHandler/DataHandlerCommandHandler.php +++ b/Classes/Domain/CommandHandler/DataHandlerCommandHandler.php @@ -77,7 +77,7 @@ protected function addCommandToDataOrCommandMap(TcaRecordReferencingCommand $com protected function process(array $datamap = [], array $commandmap = []): array { - if ($datamap === [] && $commandmap === []) { + if ([] === $datamap && [] === $commandmap) { return []; } diff --git a/Classes/Domain/Repository/AbstractDatabaseResourceRepository.php b/Classes/Domain/Repository/AbstractDatabaseResourceRepository.php index b29739f..d4467e1 100644 --- a/Classes/Domain/Repository/AbstractDatabaseResourceRepository.php +++ b/Classes/Domain/Repository/AbstractDatabaseResourceRepository.php @@ -95,7 +95,7 @@ public function findByFiltersWithCursor(array $filters, int $limit, ?string $cur $result = \array_map($this->createDeduplicator(), $result); $result = \array_map($this->createOverlayMapper($context), $result); - $nextCursor = $result === [] ? null : \end($result)[$this->identifier]; + $nextCursor = [] === $result ? null : \end($result)[$this->identifier]; $result = \array_map($this->createMetaMapper(), $result); diff --git a/Classes/Domain/Repository/FileReferenceRepository.php b/Classes/Domain/Repository/FileReferenceRepository.php index 745a759..fb40929 100644 --- a/Classes/Domain/Repository/FileReferenceRepository.php +++ b/Classes/Domain/Repository/FileReferenceRepository.php @@ -25,7 +25,7 @@ public function findByRelation(string $foreignTableName, string $foreignField, s { $fileReferences = $this->coreFileRepository->findByRelation($foreignTableName, $foreignField, $foreignIdentifier); - $fileReferences = \array_map(fn(FileReference $fileReference) => $fileReference->getReferenceProperties(), $fileReferences); + $fileReferences = \array_map(fn (FileReference $fileReference) => $fileReference->getReferenceProperties(), $fileReferences); return \array_map($this->createMetaMapper(), $fileReferences); } diff --git a/Classes/IncludeHandler/TcaResourceIncludeHandler.php b/Classes/IncludeHandler/TcaResourceIncludeHandler.php index 0b291a8..98c4f46 100644 --- a/Classes/IncludeHandler/TcaResourceIncludeHandler.php +++ b/Classes/IncludeHandler/TcaResourceIncludeHandler.php @@ -62,11 +62,11 @@ public function handleInclude(Scope $scope, string $includeName, $data, callable $relationHandler = GeneralUtility::makeInstance(RelationHandler::class); $relationHandler->start($fieldValue, $allowedTableName, $mmTableName, $uid, $this->tableName, $columnConfig); - $result = \array_filter($relationHandler->itemArray, fn($item) => $item['table'] === $allowedTableName); + $result = \array_filter($relationHandler->itemArray, fn ($item) => $item['table'] === $allowedTableName); $resourceType = (isset($columnConfig['maxitems']) && 1 == $columnConfig['maxitems']) || (isset($columnConfig['renderType']) && 'selectSingle' === $columnConfig['renderType']) ? Item::class : Collection::class; - if ($result !== []) { + if ([] !== $result) { $resourceDefinition = $this->resourceDefinitionsByTableName[$allowedTableName]; // Override any custom Identifier here for our database record identifier diff --git a/Classes/Resource/ResourceOperationToCommandMap.php b/Classes/Resource/ResourceOperationToCommandMap.php index 582e2be..11ee5e2 100644 --- a/Classes/Resource/ResourceOperationToCommandMap.php +++ b/Classes/Resource/ResourceOperationToCommandMap.php @@ -47,6 +47,6 @@ private function loadOperationsToCommandMapFromResourcesConfiguration(): void return; } $resourcesConfiguration = ConfigurationManager::getResourcesConfiguration(); - $this->commandsByResourceTypeAndOperation = \array_filter(\array_map(fn($resourceConfiguration) => $resourceConfiguration['operationToCommandMap'] ?? null, $resourcesConfiguration)); + $this->commandsByResourceTypeAndOperation = \array_filter(\array_map(fn ($resourceConfiguration) => $resourceConfiguration['operationToCommandMap'] ?? null, $resourcesConfiguration)); } } diff --git a/Classes/Schema/VisibleColumnsProvider.php b/Classes/Schema/VisibleColumnsProvider.php index 5c5fa7f..bf2c90c 100644 --- a/Classes/Schema/VisibleColumnsProvider.php +++ b/Classes/Schema/VisibleColumnsProvider.php @@ -36,6 +36,6 @@ public function getVisibleColumnsForResource(string $tableName, array $resource) 'databaseRow' => $resource, ]); - return \array_filter($result['columnsToProcess'], fn($columnName) => '-' !== $columnName[0]); + return \array_filter($result['columnsToProcess'], fn ($columnName) => '-' !== $columnName[0]); } } diff --git a/Classes/TransformHandler/TcaResourceTransformHandler.php b/Classes/TransformHandler/TcaResourceTransformHandler.php index ef556e4..1f880d4 100644 --- a/Classes/TransformHandler/TcaResourceTransformHandler.php +++ b/Classes/TransformHandler/TcaResourceTransformHandler.php @@ -52,8 +52,8 @@ protected function getVisibleAttributesOfResource(array $resource): array 'databaseRow' => $resource, ]); - $visibleColumns = \array_filter($result['columnsToProcess'], fn($columnName) => !isset($this->excludedColumns[$columnName]) && '-' !== $columnName[0]); + $visibleColumns = \array_filter($result['columnsToProcess'], fn ($columnName) => !isset($this->excludedColumns[$columnName]) && '-' !== $columnName[0]); - return \array_combine($visibleColumns, \array_map(fn($columnName) => $result['databaseRow'][$columnName] ?? null, $visibleColumns)); + return \array_combine($visibleColumns, \array_map(fn ($columnName) => $result['databaseRow'][$columnName] ?? null, $visibleColumns)); } } diff --git a/Classes/Transformer/ComposableTransformer.php b/Classes/Transformer/ComposableTransformer.php index d2a79e0..4907412 100644 --- a/Classes/Transformer/ComposableTransformer.php +++ b/Classes/Transformer/ComposableTransformer.php @@ -26,13 +26,13 @@ class ComposableTransformer extends TransformerAbstract implements ResourceTrans public function __construct(array $transformHandlers, array $includeHandlers = []) { - $this->transformHandlerStack = \array_reduce($transformHandlers, fn($next, TransformHandler $transformHandler) => $this->wrapTransformHandler($transformHandler, $next), fn($data, array $transformedData) => $transformedData); + $this->transformHandlerStack = \array_reduce($transformHandlers, fn ($next, TransformHandler $transformHandler) => $this->wrapTransformHandler($transformHandler, $next), fn ($data, array $transformedData) => $transformedData); - $this->availableIncludesStack = \array_reduce($includeHandlers, fn($next, IncludeHandler $includeHandler) => $this->wrapAvailableIncludesHandler($includeHandler, $next), fn($currentIncludes) => \array_unique(\array_merge($currentIncludes, parent::getAvailableIncludes()))); + $this->availableIncludesStack = \array_reduce($includeHandlers, fn ($next, IncludeHandler $includeHandler) => $this->wrapAvailableIncludesHandler($includeHandler, $next), fn ($currentIncludes) => \array_unique(\array_merge($currentIncludes, parent::getAvailableIncludes()))); - $this->defaultIncludesStack = \array_reduce($includeHandlers, fn($next, IncludeHandler $includeHandler) => $this->wrapDefaultIncludesHandler($includeHandler, $next), fn($currentIncludes) => \array_unique(\array_merge($currentIncludes, parent::getDefaultIncludes()))); + $this->defaultIncludesStack = \array_reduce($includeHandlers, fn ($next, IncludeHandler $includeHandler) => $this->wrapDefaultIncludesHandler($includeHandler, $next), fn ($currentIncludes) => \array_unique(\array_merge($currentIncludes, parent::getDefaultIncludes()))); - $this->includeHandlerStack = \array_reduce($includeHandlers, fn($next, IncludeHandler $includeHandler) => $this->wrapIncludeHandler($includeHandler, $next), fn(Scope $scope, $includeName, $data) => parent::callIncludeMethod($scope, $includeName, $data)); + $this->includeHandlerStack = \array_reduce($includeHandlers, fn ($next, IncludeHandler $includeHandler) => $this->wrapIncludeHandler($includeHandler, $next), fn (Scope $scope, $includeName, $data) => parent::callIncludeMethod($scope, $includeName, $data)); } public function getAvailableIncludes(): array @@ -57,21 +57,21 @@ protected function callIncludeMethod(Scope $scope, $includeName, $data) protected function wrapTransformHandler(TransformHandler $handler, callable $next): \Closure { - return fn($data, array $transformedData): array => $handler->handleTransform($data, $transformedData, $next); + return fn ($data, array $transformedData): array => $handler->handleTransform($data, $transformedData, $next); } protected function wrapAvailableIncludesHandler(IncludeHandler $handler, callable $next): \Closure { - return fn(array $currentIncludes): array => $handler->getAvailableIncludes($currentIncludes, $next); + return fn (array $currentIncludes): array => $handler->getAvailableIncludes($currentIncludes, $next); } protected function wrapDefaultIncludesHandler(IncludeHandler $handler, callable $next): \Closure { - return fn(array $currentIncludes): array => $handler->getDefaultIncludes($currentIncludes, $next); + return fn (array $currentIncludes): array => $handler->getDefaultIncludes($currentIncludes, $next); } protected function wrapIncludeHandler(IncludeHandler $handler, callable $next): \Closure { - return fn($scope, $includeName, $data): ?ResourceInterface => $handler->handleInclude($scope, $includeName, $data, $next); + return fn ($scope, $includeName, $data): ?ResourceInterface => $handler->handleInclude($scope, $includeName, $data, $next); } } diff --git a/Tests/Unit/JsonApiDeserializerTest.php b/Tests/Unit/JsonApiDeserializerTest.php index 32eab6b..243f677 100644 --- a/Tests/Unit/JsonApiDeserializerTest.php +++ b/Tests/Unit/JsonApiDeserializerTest.php @@ -19,7 +19,7 @@ public function testJsonApiDeserializer(array $result, $expectedResult): void self::assertEquals($expectedResult, $result); } - public function provideTestCases(): array + public static function provideTestCases(): array { return [ 'age-groups test' => [ diff --git a/etc/FunctionalTests.xml b/etc/FunctionalTests.xml new file mode 100644 index 0000000..35fc077 --- /dev/null +++ b/etc/FunctionalTests.xml @@ -0,0 +1,13 @@ + + + + + ../Tests/Functional/ + + + + + + + + diff --git a/etc/FunctionalTestsBootstrap.php b/etc/FunctionalTestsBootstrap.php new file mode 100644 index 0000000..d4aa5a1 --- /dev/null +++ b/etc/FunctionalTestsBootstrap.php @@ -0,0 +1,34 @@ +defineOriginalRootPath(); + $testbase->createDirectory(ORIGINAL_ROOT . 'typo3temp/var/tests'); + $testbase->createDirectory(ORIGINAL_ROOT . 'typo3temp/var/transient'); +})(); diff --git a/etc/UnitTests.xml b/etc/UnitTests.xml new file mode 100644 index 0000000..07e9cf5 --- /dev/null +++ b/etc/UnitTests.xml @@ -0,0 +1,13 @@ + + + + + ../Tests/Unit/ + + + + + + + + diff --git a/etc/scripts/checkCodingStandards.sh b/etc/scripts/checkCodingStandards.sh index a7eca25..8294d27 100755 --- a/etc/scripts/checkCodingStandards.sh +++ b/etc/scripts/checkCodingStandards.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -FILTERED_FOLDERS=`find ./ -mindepth 1 -maxdepth 1 -type d | grep -Ev '.Build|Build|Resources|etc|public|logs|.phpspec|.git|vendor|.idea|var|.ddev'` +FILTERED_FOLDERS=`find ./ -mindepth 1 -maxdepth 1 -type d | grep -Ev '.Build|Build|Resources|etc|public|logs|.phpspec|.git|vendor|.idea|var'` if [ "0" != "$(echo $?)" ]; then echo "No php files found to lint. So technically spoken everything's fine, but please check that I haven't missed any files." @@ -10,4 +10,4 @@ fi SEPERATOR=" " FOLDERS=$(printf "${SEPERATOR}%s" "${FILTERED_FOLDERS[@]}") -.Build/bin/ecs check --no-progress-bar -n -c .Build/vendor/dfau/coding-standard/ecs.php $FOLDERS $@ \ No newline at end of file +.Build/bin/ecs check --no-progress-bar -n -c .Build/vendor/dfau/coding-standard/ecs.php $FOLDERS $@ diff --git a/etc/scripts/runTests.sh b/etc/scripts/runTests.sh index 99e10a6..5302ebf 100755 --- a/etc/scripts/runTests.sh +++ b/etc/scripts/runTests.sh @@ -4,9 +4,9 @@ # TYPO3 core test runner based on docker and docker-compose. # -# Function to write a .env file in Build/testing-docker +# Function to write a .env file in etc/testing-docker/local # This is read by docker-compose and vars defined here are -# used in Build/testing-docker/docker-compose.yml +# used in etc/testing-docker/local/docker-compose.yml setUpDockerComposeDotEnv() { # Delete possibly existing local .env file if exists [ -e .env ] && rm .env @@ -20,23 +20,22 @@ setUpDockerComposeDotEnv() { # Your local home directory for composer and npm caching echo "HOST_HOME=${HOME}" >> .env # Your local user - echo "ROOT_DIR=${ROOT_DIR}" >> .env + echo "ROOT_DIR"=${ROOT_DIR} >> .env echo "HOST_USER=${USER}" >> .env echo "TEST_FILE=${TEST_FILE}" >> .env + echo "TYPO3_VERSION=${TYPO3_VERSION}" >> .env echo "PHP_XDEBUG_ON=${PHP_XDEBUG_ON}" >> .env echo "PHP_XDEBUG_PORT=${PHP_XDEBUG_PORT}" >> .env + echo "PHP_VERSION=${PHP_VERSION}" >> .env echo "DOCKER_PHP_IMAGE=${DOCKER_PHP_IMAGE}" >> .env echo "EXTRA_TEST_OPTIONS=${EXTRA_TEST_OPTIONS}" >> .env echo "SCRIPT_VERBOSE=${SCRIPT_VERBOSE}" >> .env - echo "CGLCHECK_DRY_RUN=${CGLCHECK_DRY_RUN}" >> .env } # Load help text into $HELP read -r -d '' HELP < Specifies which test suite to run - - acceptance: backend acceptance tests - - cgl: cgl test and fix all php files - - composerUpdate: "composer update", handy if host has no PHP - - composerValidate: "composer validate" - - functional: functional tests + - composerUpdate: "composer update" + - clean: clean up build and testing related files - lint: PHP linting - - phpstan: phpstan analyze - unit (default): PHP unit tests + - functional: functional tests - -d + -d Only with -s functional Specifies on which DBMS tests are performed - mariadb (default): use mariadb - - mssql: use mssql microsoft sql server - postgres: use postgres - sqlite: use sqlite - -p <7.4|8.0> + -p <7.4|8.0|8.1|8.2> Specifies the PHP minor version to be used - - 7.4 (default): use PHP 7.4 + - 7.4: (default) use PHP 7.4 - 8.0: use PHP 8.0 + - 8.1: use PHP 8.1 + - 8.2: use PHP 8.2 + + -t <11|12> + Only with -s composerUpdate + Specifies the TYPO3 core major version to be used + - 11: (default) use TYPO3 core v11 + - 12: use TYPO3 core v12 - -e "" - Only with -s acceptance|functional|unit - Additional options to send to phpunit (unit & functional tests) or codeception (acceptance - tests). For phpunit, options starting with "--" must be added after options starting with "-". + -e "" + Only with -s functional|unit + Additional options to send to phpunit tests. + For phpunit, options starting with "--" must be added after options starting with "-". Example -e "-v --filter canRetrieveValueWithGP" to enable verbose output AND filter tests named "canRetrieveValueWithGP" -x - Only with -s functional|unit|acceptance + Only with -s unit Send information to host instance for test or system under test break points. This is especially useful if a local PhpStorm instance is listening on default xdebug port 9003. A different port can be selected with -y @@ -84,15 +87,11 @@ Options: Send xdebug information to a different port than default 9003 if an IDE like PhpStorm is not listening on default port. - -n - Only with -s cgl - Activate dry-run in CGL check that does not actively change files and only prints broken ones. - -u - Update existing typo3/core-testing-*:latest docker images. Maintenance call to docker pull latest + Update existing typo3gmbh/phpXY:latest docker images. Maintenance call to docker pull latest versions of the main php images. The images are updated once in a while and only the youngest ones are supported by core testing. Use this if weird test errors occur. Also removes obsolete - image versions of typo3/core-testing-*. + image versions of typo3gmbh/phpXY. -v Enable verbose script output. Shows variables and docker commands. @@ -100,9 +99,6 @@ Options: -h Show this help. -Examples: - # Run unit tests using PHP 7.4 - ./Build/Scripts/runTests.sh EOF # Test if docker-compose exists, else exit out with error @@ -120,20 +116,15 @@ cd "$THIS_SCRIPT_DIR" || exit 1 cd ../testing-docker || exit 1 # Option defaults -if ! type "realpath" > /dev/null; then - echo "This script works best with realpath installed" >&2 - ROOT_DIR=`${PWD}/../../` -else - ROOT_DIR=`realpath ${PWD}/../../` -fi +ROOT_DIR=`realpath ${PWD}/../../` TEST_SUITE="unit" DBMS="mariadb" PHP_VERSION="7.4" +TYPO3_VERSION="11" PHP_XDEBUG_ON=0 PHP_XDEBUG_PORT=9003 EXTRA_TEST_OPTIONS="" SCRIPT_VERBOSE=0 -CGLCHECK_DRY_RUN="" # Option parsing # Reset in case getopts has been used previously in the shell @@ -141,7 +132,7 @@ OPTIND=1 # Array for invalid options INVALID_OPTIONS=(); # Simple option parsing based on getopts (! not getopt) -while getopts ":s:d:p:e:xy:nhuv" OPT; do +while getopts ":s:d:p:t:e:xy:huv" OPT; do case ${OPT} in s) TEST_SUITE=${OPTARG} @@ -152,6 +143,9 @@ while getopts ":s:d:p:e:xy:nhuv" OPT; do p) PHP_VERSION=${OPTARG} ;; + t) + TYPO3_VERSION=${OPTARG} + ;; e) EXTRA_TEST_OPTIONS=${OPTARG} ;; @@ -165,9 +159,6 @@ while getopts ":s:d:p:e:xy:nhuv" OPT; do echo "${HELP}" exit 0 ;; - n) - CGLCHECK_DRY_RUN="-n" - ;; u) TEST_SUITE=update ;; @@ -194,23 +185,13 @@ if [ ${#INVALID_OPTIONS[@]} -ne 0 ]; then exit 1 fi -# Move "7.4" to "php74", the latter is the docker container name +# Move "7.2" to "php72", the latter is the docker container name DOCKER_PHP_IMAGE=`echo "php${PHP_VERSION}" | sed -e 's/\.//'` # Set $1 to first mass argument, this is the optional test file or test directory to execute shift $((OPTIND - 1)) -TEST_FILE=${1} if [ -n "${1}" ]; then TEST_FILE="Web/typo3conf/ext/toujou_api/${1}" -else - case ${TEST_SUITE} in - unit) - TEST_FILE="Web/typo3conf/ext/toujou_api/Tests/Unit" - ;; - functional) - TEST_FILE="Web/typo3conf/ext/toujou_api/Tests/Functional" - ;; - esac fi if [ ${SCRIPT_VERBOSE} -eq 1 ]; then @@ -219,31 +200,18 @@ fi # Suite execution case ${TEST_SUITE} in - acceptance) - setUpDockerComposeDotEnv - docker-compose run acceptance_backend_mariadb10 - SUITE_EXIT_CODE=$? - docker-compose down - ;; - cgl) - # Active dry-run for cgl needs not "-n" but specific options - if [[ ! -z ${CGLCHECK_DRY_RUN} ]]; then - CGLCHECK_DRY_RUN="--dry-run --diff --diff-format udiff" - fi - setUpDockerComposeDotEnv - docker-compose run cgl - SUITE_EXIT_CODE=$? - docker-compose down + clean) + rm -rf ../../composer.lock ../../.Build/ ../../composer.json.testing ;; composerUpdate) setUpDockerComposeDotEnv + cp ../../composer.json ../../composer.json.orig + if [ -f "../../composer.json.testing" ]; then + cp ../../composer.json ../../composer.json.orig + fi docker-compose run composer_update - SUITE_EXIT_CODE=$? - docker-compose down - ;; - composerValidate) - setUpDockerComposeDotEnv - docker-compose run composer_validate + cp ../../composer.json ../../composer.json.testing + mv ../../composer.json.orig ../../composer.json SUITE_EXIT_CODE=$? docker-compose down ;; @@ -254,10 +222,6 @@ case ${TEST_SUITE} in docker-compose run functional_mariadb10 SUITE_EXIT_CODE=$? ;; - mssql) - docker-compose run functional_mssql2019latest - SUITE_EXIT_CODE=$? - ;; postgres) docker-compose run functional_postgres10 SUITE_EXIT_CODE=$? @@ -285,12 +249,6 @@ case ${TEST_SUITE} in SUITE_EXIT_CODE=$? docker-compose down ;; - phpstan) - setUpDockerComposeDotEnv - docker-compose run phpstan - SUITE_EXIT_CODE=$? - docker-compose down - ;; unit) setUpDockerComposeDotEnv docker-compose run unit diff --git a/etc/testing-docker/docker-compose.yml b/etc/testing-docker/docker-compose.yml index f6197b3..0ac3c1c 100644 --- a/etc/testing-docker/docker-compose.yml +++ b/etc/testing-docker/docker-compose.yml @@ -1,22 +1,12 @@ version: '2.3' services: mariadb10: - # not using mariadb:10 for the time being, because 10.5.7 (currently latest) is broken - image: mariadb:10.5.6 + image: mariadb:10 environment: MYSQL_ROOT_PASSWORD: funcp tmpfs: - /var/lib/mysql/:rw,noexec,nosuid - mssql2019latest: - image: typo3/core-testing-mssql2019:latest - environment: - ACCEPT_EULA: "Y" - SA_PASSWORD: "Test1234!" - MSSQL_PID: Developer - # No tmpfs setup here since mssql fails on tmpfs o_direct. - # This makes mssql sloooow for functionals. - postgres10: image: postgres:10-alpine environment: @@ -25,152 +15,51 @@ services: tmpfs: - /var/lib/postgresql/data:rw,noexec,nosuid - web: - image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" - stop_grace_period: 1s - volumes: - - ${ROOT_DIR}:${ROOT_DIR} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro - environment: - TYPO3_PATH_ROOT: ${ROOT_DIR}/.Build/Web/typo3temp/var/tests/acceptance - TYPO3_PATH_APP: ${ROOT_DIR}/.Build/Web/typo3temp/var/tests/acceptance - TYPO3_OAUTH2_PRIVATE_KEY: ${ROOT_DIR}/.Build/Web/typo3temp/var/tests/acceptance/typo3conf/ext/toujou_api/Tests/Acceptance/_data/private.key - TYPO3_OAUTH2_PUBLIC_KEY: ${ROOT_DIR}/.Build/Web/typo3temp/var/tests/acceptance/typo3conf/ext/toujou_api/Tests/Acceptance/_data/public.key - TYPO3_OAUTH2_ENCRYPTION_KEY: def000003cde1910c7bdd30ad21d949a2d7e2c9d330b4cfcabd43d146c22fb2c4d5e66dd9d1ca33b06c3c101dce34de019c21fe48ec3f5a924f27e05717bddd5f6c6cdf5 - command: php -dxdebug.mode=off -S web:8000 -t ${ROOT_DIR}/.Build/Web - - acceptance_backend_mariadb10: - image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" - links: - - mariadb10 - - web - environment: - typo3DatabaseName: func_test - typo3DatabaseUsername: root - typo3DatabasePassword: funcp - typo3DatabaseHost: mariadb10 - volumes: - - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro - working_dir: ${ROOT_DIR}/.Build - command: > - /bin/sh -c " - if [ ${SCRIPT_VERBOSE} -eq 1 ]; then - set -x - fi - echo Waiting for database start...; - while ! nc -z mariadb10 3306; do - sleep 1; - done; - echo Database is up; - php -v | grep '^PHP'; - ln -sfn ${ROOT_DIR} Web/typo3conf/ext/toujou_api - mkdir -p Web/typo3temp/var/tests/ - COMMAND=\"vendor/codeception/codeception/codecept run Api -d -c Web/typo3conf/ext/toujou_api/Tests/codeception.yml ${TEST_FILE}\" - if [ ${PHP_XDEBUG_ON} -eq 0 ]; then - XDEBUG_MODE=\"off\" \ - $${COMMAND}; - else - XDEBUG_MODE=\"debug,develop\" \ - XDEBUG_TRIGGER=\"foo\" \ - XDEBUG_CONFIG=\"client_port=${PHP_XDEBUG_PORT} client_host=host.docker.internal\" \ - $${COMMAND}; - fi - " - - cgl: - image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" - volumes: - - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro - working_dir: ${ROOT_DIR} - command: > - /bin/sh -c " - if [ ${SCRIPT_VERBOSE} -eq 1 ]; then - set -x - fi - php -v | grep '^PHP'; - if [ ${PHP_XDEBUG_ON} -eq 0 ]; then - php -dxdebug.mode=off \ - .Build/bin/php-cs-fixer fix \ - -v \ - ${CGLCHECK_DRY_RUN} \ - --config=.Build/vendor/typo3/coding-standards/templates/extension_php_cs.dist \ - --using-cache=no . - else - DOCKER_HOST=`route -n | awk '/^0.0.0.0/ { print $$2 }'` - XDEBUG_MODE=\"debug,develop\" \ - XDEBUG_TRIGGER=\"foo\" \ - XDEBUG_CONFIG=\"client_port=${PHP_XDEBUG_PORT} client_host=$${DOCKER_HOST}\" \ - PHP_CS_FIXER_ALLOW_XDEBUG=1 \ - .Build/bin/php-cs-fixer fix \ - -v \ - ${CGLCHECK_DRY_RUN} \ - --config=.Build/vendor/typo3/coding-standards/templates/extension_php_cs.dist \ - --using-cache=no . - fi - " - composer_update: image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest user: "${HOST_UID}" volumes: - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro - working_dir: ${ROOT_DIR} - command: > - /bin/sh -c " - if [ ${SCRIPT_VERBOSE} -eq 1 ]; then - set -x - fi - php -v | grep '^PHP'; - COMPOSER_HOME=${ROOT_DIR}/.Build/.composer composer update --no-progress --no-interaction; - " - - composer_validate: - image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" - volumes: - - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro working_dir: ${ROOT_DIR} + environment: + COMPOSER_CACHE_DIR: ".cache/composer" command: > /bin/sh -c " if [ ${SCRIPT_VERBOSE} -eq 1 ]; then set -x fi php -v | grep '^PHP'; - composer validate; + if [ ${TYPO3_VERSION} -eq 11 ]; then + composer req --dev --no-update \ + typo3/cms-composer-installers:^3.0 + composer req typo3/cms-core:^11.5 --no-update + fi + if [ ${TYPO3_VERSION} -eq 12 ]; then + composer req --dev --no-update \ + "typo3/cms-composer-installers:^5.0" \ + typo3/cms-backend:^12.4 \ + typo3/cms-frontend:^12.4 \ + typo3/cms-extbase:^12.4 \ + typo3/cms-fluid:^12.4 \ + typo3/cms-install:^12.4 + composer req typo3/cms-core:^12.4 -W --no-update + fi + composer update --no-progress --no-interaction; " functional_mariadb10: image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" + user: ${HOST_UID} links: - mariadb10 volumes: - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro environment: typo3DatabaseName: func_test typo3DatabaseUsername: root typo3DatabasePassword: funcp typo3DatabaseHost: mariadb10 - working_dir: ${ROOT_DIR}/.Build + working_dir: ${ROOT_DIR} command: > /bin/sh -c " if [ ${SCRIPT_VERBOSE} -eq 1 ]; then @@ -184,76 +73,30 @@ services: php -v | grep '^PHP'; if [ ${PHP_XDEBUG_ON} -eq 0 ]; then XDEBUG_MODE=\"off\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE}; - else - DOCKER_HOST=`route -n | awk '/^0.0.0.0/ { print $$2 }'` - XDEBUG_MODE=\"debug,develop\" \ - XDEBUG_TRIGGER=\"foo\" \ - XDEBUG_CONFIG=\"client_port=${PHP_XDEBUG_PORT} client_host=$${DOCKER_HOST}\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE}; - fi - " - - functional_mssql2019latest: - image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" - links: - - mssql2019latest - volumes: - - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro - environment: - typo3DatabaseDriver: sqlsrv - typo3DatabaseName: func - typo3DatabasePassword: "Test1234!" - typo3DatabaseUsername: SA - typo3DatabasePort: 1433 - typo3DatabaseCharset: utf-8 - typo3DatabaseHost: mssql2019latest - working_dir: ${ROOT_DIR}/.Build - command: > - /bin/sh -c " - if [ ${SCRIPT_VERBOSE} -eq 1 ]; then - set -x - fi - echo Waiting for database start...; - while ! nc -z mssql2019latest 1433; do - sleep 1; - done; - sleep 5; - echo Database is up; - php -v | grep '^PHP'; - if [ ${PHP_XDEBUG_ON} -eq 0 ]; then - XDEBUG_MODE=\"off\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-mssql ${TEST_FILE}; + .Build/bin/phpunit -c etc/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE}; else DOCKER_HOST=`route -n | awk '/^0.0.0.0/ { print $$2 }'` XDEBUG_MODE=\"debug,develop\" \ XDEBUG_TRIGGER=\"foo\" \ XDEBUG_CONFIG=\"client_port=${PHP_XDEBUG_PORT} client_host=$${DOCKER_HOST}\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-mssql ${TEST_FILE}; + .Build/bin/phpunit -c etc/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE}; fi " functional_postgres10: image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" + user: ${HOST_UID} links: - postgres10 volumes: - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro environment: typo3DatabaseDriver: pdo_pgsql typo3DatabaseName: bamboo typo3DatabaseUsername: ${HOST_USER} typo3DatabaseHost: postgres10 typo3DatabasePassword: funcp - working_dir: ${ROOT_DIR}/.Build + working_dir: ${ROOT_DIR} command: > /bin/sh -c " if [ ${SCRIPT_VERBOSE} -eq 1 ]; then @@ -267,29 +110,26 @@ services: php -v | grep '^PHP'; if [ ${PHP_XDEBUG_ON} -eq 0 ]; then XDEBUG_MODE=\"off\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-postgres ${TEST_FILE}; + .Build/bin/phpunit -c etc/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-postgres ${TEST_FILE}; else DOCKER_HOST=`route -n | awk '/^0.0.0.0/ { print $$2 }'` XDEBUG_MODE=\"debug,develop\" \ XDEBUG_TRIGGER=\"foo\" \ XDEBUG_CONFIG=\"client_port=${PHP_XDEBUG_PORT} client_host=$${DOCKER_HOST}\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-postgres ${TEST_FILE}; + .Build/bin/phpunit -c etc/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-postgres ${TEST_FILE}; fi " functional_sqlite: image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" + user: ${HOST_UID} volumes: - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro tmpfs: - ${ROOT_DIR}/.Build/Web/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid,uid=${HOST_UID} environment: typo3DatabaseDriver: pdo_sqlite - working_dir: ${ROOT_DIR}/.Build + working_dir: ${ROOT_DIR} command: > /bin/sh -c " if [ ${SCRIPT_VERBOSE} -eq 1 ]; then @@ -298,23 +138,21 @@ services: php -v | grep '^PHP'; if [ ${PHP_XDEBUG_ON} -eq 0 ]; then XDEBUG_MODE=\"off\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-sqlite ${TEST_FILE}; + .Build/bin/phpunit -c etc/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-sqlite ${TEST_FILE}; else DOCKER_HOST=`route -n | awk '/^0.0.0.0/ { print $$2 }'` XDEBUG_MODE=\"debug,develop\" \ XDEBUG_TRIGGER=\"foo\" \ XDEBUG_CONFIG=\"client_port=${PHP_XDEBUG_PORT} client_host=$${DOCKER_HOST}\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-sqlite ${TEST_FILE}; + .Build/bin/phpunit -c etc/FunctionalTests.xml ${EXTRA_TEST_OPTIONS} --exclude-group not-sqlite ${TEST_FILE}; fi " lint: image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" + user: ${HOST_UID} volumes: - ${ROOT_DIR}:${ROOT_DIR} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro working_dir: ${ROOT_DIR} command: > /bin/sh -c " @@ -325,48 +163,26 @@ services: find . -name \\*.php ! -path "./.Build/\\*" -print0 | xargs -0 -n1 -P4 php -dxdebug.mode=off -l >/dev/null " - phpstan: - image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" - volumes: - - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro - working_dir: ${ROOT_DIR} - command: > - /bin/sh -c " - if [ ${SCRIPT_VERBOSE} -eq 1 ]; then - set -x - fi - php -v | grep '^PHP'; - php -dxdebug.mode=off .Build/bin/phpstan analyze -c Build/phpstan.neon - " - unit: image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest - user: "${HOST_UID}" + user: ${HOST_UID} volumes: - ${ROOT_DIR}:${ROOT_DIR} - - ${HOST_HOME}:${HOST_HOME} - - /etc/passwd:/etc/passwd:ro - - /etc/group:/etc/group:ro - working_dir: ${ROOT_DIR}/.Build + working_dir: ${ROOT_DIR} command: > /bin/sh -c " if [ ${SCRIPT_VERBOSE} -eq 1 ]; then set -x fi - php -v | grep '^PHP'; - ln -sfn ${ROOT_DIR} Web/typo3conf/ext/toujou_api + php -v | grep '^PHP' if [ ${PHP_XDEBUG_ON} -eq 0 ]; then XDEBUG_MODE=\"off\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/UnitTests.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE}; + .Build/bin/phpunit -c etc/UnitTests.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE}; else DOCKER_HOST=`route -n | awk '/^0.0.0.0/ { print $$2 }'` XDEBUG_MODE=\"debug,develop\" \ XDEBUG_TRIGGER=\"foo\" \ XDEBUG_CONFIG=\"client_port=${PHP_XDEBUG_PORT} client_host=$${DOCKER_HOST}\" \ - bin/phpunit -c vendor/typo3/testing-framework/Resources/Core/Build/UnitTests.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE}; + .Build/bin/phpunit -c etc/UnitTests.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE}; fi " diff --git a/ext_tables.php b/ext_tables.php index 816f85c..6cabc65 100644 --- a/ext_tables.php +++ b/ext_tables.php @@ -1,13 +1,14 @@