diff --git a/.vortex/installer/composer.json b/.vortex/installer/composer.json
index 83ec76bc9..f2c600cbd 100644
--- a/.vortex/installer/composer.json
+++ b/.vortex/installer/composer.json
@@ -18,7 +18,7 @@
},
"require": {
"php": ">=8.2",
- "alexskrypnyk/file": "^0.9",
+ "alexskrypnyk/file": "^0.11",
"alexskrypnyk/str2name": "^1.4",
"composer/composer": "^2.8",
"cweagans/composer-patches": "^1.7",
@@ -31,7 +31,7 @@
"symfony/yaml": "^7.2"
},
"require-dev": {
- "alexskrypnyk/phpunit-helpers": "^0.8.2",
+ "alexskrypnyk/phpunit-helpers": "^0.10",
"bamarni/composer-bin-plugin": "^1.8",
"dealerdirect/phpcodesniffer-composer-installer": "^1",
"drupal/coder": "^8.3",
diff --git a/.vortex/installer/composer.lock b/.vortex/installer/composer.lock
index bd4910fc4..79183845e 100644
--- a/.vortex/installer/composer.lock
+++ b/.vortex/installer/composer.lock
@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "e0084072fc06b8ca899e6958d111e813",
+ "content-hash": "3cb225b1e6a0e40a218f12441448b002",
"packages": [
{
"name": "alexskrypnyk/file",
- "version": "0.9.0",
+ "version": "0.11.0",
"source": {
"type": "git",
"url": "https://github.com/AlexSkrypnyk/file.git",
- "reference": "df98e9ba70357433061533e9cc747708ce92500c"
+ "reference": "3719d79a6ea64a76f8856bc2ff9d2029a4a3d895"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AlexSkrypnyk/file/zipball/df98e9ba70357433061533e9cc747708ce92500c",
- "reference": "df98e9ba70357433061533e9cc747708ce92500c",
+ "url": "https://api.github.com/repos/AlexSkrypnyk/file/zipball/3719d79a6ea64a76f8856bc2ff9d2029a4a3d895",
+ "reference": "3719d79a6ea64a76f8856bc2ff9d2029a4a3d895",
"shasum": ""
},
"require": {
@@ -25,7 +25,7 @@
"symfony/filesystem": "^7.2"
},
"require-dev": {
- "alexskrypnyk/phpunit-helpers": "^0.8.1",
+ "alexskrypnyk/phpunit-helpers": "^0.10.0",
"dealerdirect/phpcodesniffer-composer-installer": "^1",
"drupal/coder": "^8.3",
"ergebnis/composer-normalize": "^2.42",
@@ -70,7 +70,7 @@
"type": "patreon"
}
],
- "time": "2025-08-24T03:16:48+00:00"
+ "time": "2025-09-14T00:12:13+00:00"
},
{
"name": "alexskrypnyk/str2name",
@@ -861,16 +861,16 @@
},
{
"name": "justinrainbow/json-schema",
- "version": "6.4.2",
+ "version": "6.5.2",
"source": {
"type": "git",
"url": "https://github.com/jsonrainbow/json-schema.git",
- "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02"
+ "reference": "ac0d369c09653cf7af561f6d91a705bc617a87b8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02",
- "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02",
+ "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ac0d369c09653cf7af561f6d91a705bc617a87b8",
+ "reference": "ac0d369c09653cf7af561f6d91a705bc617a87b8",
"shasum": ""
},
"require": {
@@ -880,7 +880,7 @@
},
"require-dev": {
"friendsofphp/php-cs-fixer": "3.3.0",
- "json-schema/json-schema-test-suite": "1.2.0",
+ "json-schema/json-schema-test-suite": "^23.2",
"marc-mabe/php-enum-phpstan": "^2.0",
"phpspec/prophecy": "^1.19",
"phpstan/phpstan": "^1.12",
@@ -930,9 +930,9 @@
],
"support": {
"issues": "https://github.com/jsonrainbow/json-schema/issues",
- "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2"
+ "source": "https://github.com/jsonrainbow/json-schema/tree/6.5.2"
},
- "time": "2025-06-03T18:27:04+00:00"
+ "time": "2025-09-09T09:42:27+00:00"
},
{
"name": "laravel/prompts",
@@ -992,7 +992,8 @@
],
"description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": {
- "source": "https://github.com/AlexSkrypnyk/prompts/tree/v0.3.7"
+ "source": "https://github.com/AlexSkrypnyk/prompts/tree/v0.3.7",
+ "issues": "https://github.com/AlexSkrypnyk/prompts/issues"
},
"time": "2025-09-03T00:55:15+00:00"
},
@@ -2421,16 +2422,16 @@
},
{
"name": "symfony/process",
- "version": "v7.3.0",
+ "version": "v7.3.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af"
+ "reference": "32241012d521e2e8a9d713adb0812bb773b907f1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
- "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
+ "url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1",
+ "reference": "32241012d521e2e8a9d713adb0812bb773b907f1",
"shasum": ""
},
"require": {
@@ -2462,7 +2463,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.3.0"
+ "source": "https://github.com/symfony/process/tree/v7.3.3"
},
"funding": [
{
@@ -2473,12 +2474,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-04-17T09:11:12+00:00"
+ "time": "2025-08-18T09:42:54+00:00"
},
{
"name": "symfony/service-contracts",
@@ -2565,16 +2570,16 @@
},
{
"name": "symfony/string",
- "version": "v7.3.2",
+ "version": "v7.3.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca"
+ "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/42f505aff654e62ac7ac2ce21033818297ca89ca",
- "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca",
+ "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c",
+ "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c",
"shasum": ""
},
"require": {
@@ -2632,7 +2637,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.3.2"
+ "source": "https://github.com/symfony/string/tree/v7.3.3"
},
"funding": [
{
@@ -2652,7 +2657,7 @@
"type": "tidelift"
}
],
- "time": "2025-07-10T08:47:49+00:00"
+ "time": "2025-08-25T06:35:40+00:00"
},
{
"name": "symfony/yaml",
@@ -2734,16 +2739,16 @@
"packages-dev": [
{
"name": "alexskrypnyk/phpunit-helpers",
- "version": "0.8.4",
+ "version": "0.10.0",
"source": {
"type": "git",
"url": "https://github.com/AlexSkrypnyk/phpunit-helpers.git",
- "reference": "0064df99be8f7b7146d8d69bd6ff9ea7a2e8395d"
+ "reference": "4967a0dae2f31d286ac66e069290cbed7c969bd0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AlexSkrypnyk/phpunit-helpers/zipball/0064df99be8f7b7146d8d69bd6ff9ea7a2e8395d",
- "reference": "0064df99be8f7b7146d8d69bd6ff9ea7a2e8395d",
+ "url": "https://api.github.com/repos/AlexSkrypnyk/phpunit-helpers/zipball/4967a0dae2f31d286ac66e069290cbed7c969bd0",
+ "reference": "4967a0dae2f31d286ac66e069290cbed7c969bd0",
"shasum": ""
},
"require": {
@@ -2797,7 +2802,7 @@
"type": "patreon"
}
],
- "time": "2025-09-05T06:52:25+00:00"
+ "time": "2025-09-12T03:20:47+00:00"
},
{
"name": "bamarni/composer-bin-plugin",
@@ -3089,16 +3094,16 @@
},
{
"name": "ergebnis/json",
- "version": "1.5.0",
+ "version": "1.6.0",
"source": {
"type": "git",
"url": "https://github.com/ergebnis/json.git",
- "reference": "fc4f1bdac2d54a3050dca16ef1fe16ae50993f7d"
+ "reference": "7b56d2b5d9e897e75b43e2e753075a0904c921b1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json/zipball/fc4f1bdac2d54a3050dca16ef1fe16ae50993f7d",
- "reference": "fc4f1bdac2d54a3050dca16ef1fe16ae50993f7d",
+ "url": "https://api.github.com/repos/ergebnis/json/zipball/7b56d2b5d9e897e75b43e2e753075a0904c921b1",
+ "reference": "7b56d2b5d9e897e75b43e2e753075a0904c921b1",
"shasum": ""
},
"require": {
@@ -3110,21 +3115,22 @@
"ergebnis/data-provider": "^3.3.0",
"ergebnis/license": "^2.5.0",
"ergebnis/php-cs-fixer-config": "^6.37.0",
+ "ergebnis/phpstan-rules": "^2.11.0",
"ergebnis/phpunit-slow-test-detector": "^2.16.1",
"fakerphp/faker": "^1.24.0",
"infection/infection": "~0.26.6",
"phpstan/extension-installer": "^1.4.3",
- "phpstan/phpstan": "^1.12.10",
- "phpstan/phpstan-deprecation-rules": "^1.2.1",
- "phpstan/phpstan-phpunit": "^1.4.0",
- "phpstan/phpstan-strict-rules": "^1.6.1",
- "phpunit/phpunit": "^9.6.18",
- "rector/rector": "^1.2.10"
+ "phpstan/phpstan": "^2.1.22",
+ "phpstan/phpstan-deprecation-rules": "^2.0.3",
+ "phpstan/phpstan-phpunit": "^2.0.7",
+ "phpstan/phpstan-strict-rules": "^2.0.6",
+ "phpunit/phpunit": "^9.6.24",
+ "rector/rector": "^2.1.4"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.4-dev"
+ "dev-main": "1.7-dev"
},
"composer-normalize": {
"indent-size": 2,
@@ -3157,20 +3163,20 @@
"security": "https://github.com/ergebnis/json/blob/main/.github/SECURITY.md",
"source": "https://github.com/ergebnis/json"
},
- "time": "2025-08-19T10:33:00+00:00"
+ "time": "2025-09-06T09:08:45+00:00"
},
{
"name": "ergebnis/json-normalizer",
- "version": "4.10.0",
+ "version": "4.10.1",
"source": {
"type": "git",
"url": "https://github.com/ergebnis/json-normalizer.git",
- "reference": "91b9914b13937926d3b1916fc72475703ce42156"
+ "reference": "77961faf2c651c3f05977b53c6c68e8434febf62"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/91b9914b13937926d3b1916fc72475703ce42156",
- "reference": "91b9914b13937926d3b1916fc72475703ce42156",
+ "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/77961faf2c651c3f05977b53c6c68e8434febf62",
+ "reference": "77961faf2c651c3f05977b53c6c68e8434febf62",
"shasum": ""
},
"require": {
@@ -3205,7 +3211,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.8-dev"
+ "dev-main": "4.11-dev"
},
"composer-normalize": {
"indent-size": 2,
@@ -3239,20 +3245,20 @@
"security": "https://github.com/ergebnis/json-normalizer/blob/main/.github/SECURITY.md",
"source": "https://github.com/ergebnis/json-normalizer"
},
- "time": "2025-08-19T10:29:01+00:00"
+ "time": "2025-09-06T09:18:13+00:00"
},
{
"name": "ergebnis/json-pointer",
- "version": "3.7.0",
+ "version": "3.7.1",
"source": {
"type": "git",
"url": "https://github.com/ergebnis/json-pointer.git",
- "reference": "cf3301710c99b54b844426c9cc46037d264fdf70"
+ "reference": "43bef355184e9542635e35dd2705910a3df4c236"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/cf3301710c99b54b844426c9cc46037d264fdf70",
- "reference": "cf3301710c99b54b844426c9cc46037d264fdf70",
+ "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/43bef355184e9542635e35dd2705910a3df4c236",
+ "reference": "43bef355184e9542635e35dd2705910a3df4c236",
"shasum": ""
},
"require": {
@@ -3277,7 +3283,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.6-dev"
+ "dev-main": "3.8-dev"
},
"composer-normalize": {
"indent-size": 2,
@@ -3312,20 +3318,20 @@
"security": "https://github.com/ergebnis/json-pointer/blob/main/.github/SECURITY.md",
"source": "https://github.com/ergebnis/json-pointer"
},
- "time": "2025-08-19T10:23:17+00:00"
+ "time": "2025-09-06T09:28:19+00:00"
},
{
"name": "ergebnis/json-printer",
- "version": "3.8.0",
+ "version": "3.8.1",
"source": {
"type": "git",
"url": "https://github.com/ergebnis/json-printer.git",
- "reference": "fe48d523392ab885bf581eb57f61526dcde44fbc"
+ "reference": "211d73fc7ec6daf98568ee6ed6e6d133dee8503e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/fe48d523392ab885bf581eb57f61526dcde44fbc",
- "reference": "fe48d523392ab885bf581eb57f61526dcde44fbc",
+ "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/211d73fc7ec6daf98568ee6ed6e6d133dee8503e",
+ "reference": "211d73fc7ec6daf98568ee6ed6e6d133dee8503e",
"shasum": ""
},
"require": {
@@ -3352,7 +3358,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.7-dev"
+ "dev-main": "3.9-dev"
},
"composer-normalize": {
"indent-size": 2,
@@ -3387,20 +3393,20 @@
"security": "https://github.com/ergebnis/json-printer/blob/main/.github/SECURITY.md",
"source": "https://github.com/ergebnis/json-printer"
},
- "time": "2025-08-19T10:18:47+00:00"
+ "time": "2025-09-06T09:59:26+00:00"
},
{
"name": "ergebnis/json-schema-validator",
- "version": "4.5.0",
+ "version": "4.5.1",
"source": {
"type": "git",
"url": "https://github.com/ergebnis/json-schema-validator.git",
- "reference": "0c8349baba70fd2449b799bc73650985c27ed321"
+ "reference": "b739527a480a9e3651360ad351ea77e7e9019df2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/0c8349baba70fd2449b799bc73650985c27ed321",
- "reference": "0c8349baba70fd2449b799bc73650985c27ed321",
+ "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/b739527a480a9e3651360ad351ea77e7e9019df2",
+ "reference": "b739527a480a9e3651360ad351ea77e7e9019df2",
"shasum": ""
},
"require": {
@@ -3429,7 +3435,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.4-dev"
+ "dev-main": "4.6-dev"
},
"composer-normalize": {
"indent-size": 2,
@@ -3464,7 +3470,7 @@
"security": "https://github.com/ergebnis/json-schema-validator/blob/main/.github/SECURITY.md",
"source": "https://github.com/ergebnis/json-schema-validator"
},
- "time": "2025-08-19T08:41:00+00:00"
+ "time": "2025-09-06T11:37:35+00:00"
},
{
"name": "hamcrest/hamcrest-php",
@@ -3954,16 +3960,16 @@
},
{
"name": "phpstan/phpdoc-parser",
- "version": "2.2.0",
+ "version": "2.3.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8"
+ "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
- "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495",
+ "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495",
"shasum": ""
},
"require": {
@@ -3995,22 +4001,22 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/2.2.0"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0"
},
- "time": "2025-07-13T07:04:09+00:00"
+ "time": "2025-08-30T15:50:23+00:00"
},
{
"name": "phpstan/phpstan",
- "version": "2.1.22",
+ "version": "2.1.25",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4"
+ "reference": "4087d28bd252895874e174d65e26b2c202ed893a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/41600c8379eb5aee63e9413fe9e97273e25d57e4",
- "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/4087d28bd252895874e174d65e26b2c202ed893a",
+ "reference": "4087d28bd252895874e174d65e26b2c202ed893a",
"shasum": ""
},
"require": {
@@ -4055,7 +4061,7 @@
"type": "github"
}
],
- "time": "2025-08-04T19:17:37+00:00"
+ "time": "2025-09-12T14:26:42+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -4394,16 +4400,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "11.5.36",
+ "version": "11.5.38",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "264a87c7ef68b1ab9af7172357740dc266df5957"
+ "reference": "5bd0e4f64a2261b7ade7054c51547beaf2d99e43"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/264a87c7ef68b1ab9af7172357740dc266df5957",
- "reference": "264a87c7ef68b1ab9af7172357740dc266df5957",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5bd0e4f64a2261b7ade7054c51547beaf2d99e43",
+ "reference": "5bd0e4f64a2261b7ade7054c51547beaf2d99e43",
"shasum": ""
},
"require": {
@@ -4475,7 +4481,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.36"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.38"
},
"funding": [
{
@@ -4499,20 +4505,20 @@
"type": "tidelift"
}
],
- "time": "2025-09-03T06:24:17+00:00"
+ "time": "2025-09-11T10:34:07+00:00"
},
{
"name": "rector/rector",
- "version": "2.1.6",
+ "version": "2.1.7",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
- "reference": "729aabc0ec66e700ef164e26454a1357f222a2f3"
+ "reference": "c34cc07c4698f007a20dc5c99ff820089ae413ce"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/rector/zipball/729aabc0ec66e700ef164e26454a1357f222a2f3",
- "reference": "729aabc0ec66e700ef164e26454a1357f222a2f3",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/c34cc07c4698f007a20dc5c99ff820089ae413ce",
+ "reference": "c34cc07c4698f007a20dc5c99ff820089ae413ce",
"shasum": ""
},
"require": {
@@ -4551,7 +4557,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
- "source": "https://github.com/rectorphp/rector/tree/2.1.6"
+ "source": "https://github.com/rectorphp/rector/tree/2.1.7"
},
"funding": [
{
@@ -4559,7 +4565,7 @@
"type": "github"
}
],
- "time": "2025-09-05T15:43:08+00:00"
+ "time": "2025-09-10T11:13:58+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -5527,32 +5533,32 @@
},
{
"name": "slevomat/coding-standard",
- "version": "8.20.0",
+ "version": "8.22.1",
"source": {
"type": "git",
"url": "https://github.com/slevomat/coding-standard.git",
- "reference": "b4f9f02edd4e6a586777f0cabe8d05574323f3eb"
+ "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/b4f9f02edd4e6a586777f0cabe8d05574323f3eb",
- "reference": "b4f9f02edd4e6a586777f0cabe8d05574323f3eb",
+ "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/1dd80bf3b93692bedb21a6623c496887fad05fec",
+ "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec",
"shasum": ""
},
"require": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2",
"php": "^7.4 || ^8.0",
- "phpstan/phpdoc-parser": "^2.2.0",
- "squizlabs/php_codesniffer": "^3.13.2"
+ "phpstan/phpdoc-parser": "^2.3.0",
+ "squizlabs/php_codesniffer": "^3.13.4"
},
"require-dev": {
"phing/phing": "3.0.1|3.1.0",
"php-parallel-lint/php-parallel-lint": "1.4.0",
- "phpstan/phpstan": "2.1.19",
+ "phpstan/phpstan": "2.1.24",
"phpstan/phpstan-deprecation-rules": "2.0.3",
"phpstan/phpstan-phpunit": "2.0.7",
"phpstan/phpstan-strict-rules": "2.0.6",
- "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.27|12.2.7"
+ "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.10"
},
"type": "phpcodesniffer-standard",
"extra": {
@@ -5576,7 +5582,7 @@
],
"support": {
"issues": "https://github.com/slevomat/coding-standard/issues",
- "source": "https://github.com/slevomat/coding-standard/tree/8.20.0"
+ "source": "https://github.com/slevomat/coding-standard/tree/8.22.1"
},
"funding": [
{
@@ -5588,20 +5594,20 @@
"type": "tidelift"
}
],
- "time": "2025-07-26T15:35:10+00:00"
+ "time": "2025-09-13T08:53:30+00:00"
},
{
"name": "squizlabs/php_codesniffer",
- "version": "3.13.2",
+ "version": "3.13.4",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
- "reference": "5b5e3821314f947dd040c70f7992a64eac89025c"
+ "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5b5e3821314f947dd040c70f7992a64eac89025c",
- "reference": "5b5e3821314f947dd040c70f7992a64eac89025c",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ad545ea9c1b7d270ce0fc9cbfb884161cd706119",
+ "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119",
"shasum": ""
},
"require": {
@@ -5672,7 +5678,7 @@
"type": "thanks_dev"
}
],
- "time": "2025-06-17T22:17:01+00:00"
+ "time": "2025-09-05T05:47:09+00:00"
},
{
"name": "staabm/side-effects-detector",
diff --git a/.vortex/installer/src/Prompts/Handlers/Tools.php b/.vortex/installer/src/Prompts/Handlers/Tools.php
index b2698774e..ea1ec3fe2 100644
--- a/.vortex/installer/src/Prompts/Handlers/Tools.php
+++ b/.vortex/installer/src/Prompts/Handlers/Tools.php
@@ -186,6 +186,7 @@ public static function getToolDefinitions(string $filter = 'all'): array {
},
'composer.json' => function (JsonManipulator $cj): void {
$cj->removeSubNode('require-dev', 'dealerdirect/phpcodesniffer-composer-installer');
+ $cj->removeConfigSetting('allow-plugins.dealerdirect/phpcodesniffer-composer-installer');
$cj->removeSubNode('require-dev', 'drupal/coder');
$cj->removeSubNode('require-dev', 'squizlabs/php_codesniffer');
},
diff --git a/.vortex/installer/tests/Fixtures/install/tools_groups_no_be_lint/composer.json b/.vortex/installer/tests/Fixtures/install/tools_groups_no_be_lint/composer.json
index 01b2927d0..67c350251 100644
--- a/.vortex/installer/tests/Fixtures/install/tools_groups_no_be_lint/composer.json
+++ b/.vortex/installer/tests/Fixtures/install/tools_groups_no_be_lint/composer.json
@@ -22,7 +22,12 @@
"vincentlanglet/twig-cs-fixer": "__VERSION__"
},
"conflict": {
-@@ -79,7 +72,6 @@
+@@ -74,12 +67,10 @@
+ "allow-plugins": {
+ "composer/installers": true,
+ "cweagans/composer-patches": true,
+- "dealerdirect/phpcodesniffer-composer-installer": true,
+ "drupal/core-composer-scaffold": true,
"ergebnis/composer-normalize": true,
"oomphinc/composer-installers-extender": true,
"php-http/discovery": true,
diff --git a/.vortex/installer/tests/Fixtures/install/tools_groups_no_be_lint_circleci/composer.json b/.vortex/installer/tests/Fixtures/install/tools_groups_no_be_lint_circleci/composer.json
index 01b2927d0..67c350251 100644
--- a/.vortex/installer/tests/Fixtures/install/tools_groups_no_be_lint_circleci/composer.json
+++ b/.vortex/installer/tests/Fixtures/install/tools_groups_no_be_lint_circleci/composer.json
@@ -22,7 +22,12 @@
"vincentlanglet/twig-cs-fixer": "__VERSION__"
},
"conflict": {
-@@ -79,7 +72,6 @@
+@@ -74,12 +67,10 @@
+ "allow-plugins": {
+ "composer/installers": true,
+ "cweagans/composer-patches": true,
+- "dealerdirect/phpcodesniffer-composer-installer": true,
+ "drupal/core-composer-scaffold": true,
"ergebnis/composer-normalize": true,
"oomphinc/composer-installers-extender": true,
"php-http/discovery": true,
diff --git a/.vortex/installer/tests/Fixtures/install/tools_no_phpcs/composer.json b/.vortex/installer/tests/Fixtures/install/tools_no_phpcs/composer.json
index 8ad592cec..b7745daf7 100644
--- a/.vortex/installer/tests/Fixtures/install/tools_no_phpcs/composer.json
+++ b/.vortex/installer/tests/Fixtures/install/tools_no_phpcs/composer.json
@@ -6,3 +6,11 @@
"drevops/behat-format-progress-fail": "__VERSION__",
"drevops/behat-screenshot": "__VERSION__",
"drevops/behat-steps": "__VERSION__",
+@@ -74,7 +73,6 @@
+ "allow-plugins": {
+ "composer/installers": true,
+ "cweagans/composer-patches": true,
+- "dealerdirect/phpcodesniffer-composer-installer": true,
+ "drupal/core-composer-scaffold": true,
+ "ergebnis/composer-normalize": true,
+ "oomphinc/composer-installers-extender": true,
diff --git a/.vortex/installer/tests/Fixtures/install/tools_no_phpcs_circleci/composer.json b/.vortex/installer/tests/Fixtures/install/tools_no_phpcs_circleci/composer.json
index 8ad592cec..b7745daf7 100644
--- a/.vortex/installer/tests/Fixtures/install/tools_no_phpcs_circleci/composer.json
+++ b/.vortex/installer/tests/Fixtures/install/tools_no_phpcs_circleci/composer.json
@@ -6,3 +6,11 @@
"drevops/behat-format-progress-fail": "__VERSION__",
"drevops/behat-screenshot": "__VERSION__",
"drevops/behat-steps": "__VERSION__",
+@@ -74,7 +73,6 @@
+ "allow-plugins": {
+ "composer/installers": true,
+ "cweagans/composer-patches": true,
+- "dealerdirect/phpcodesniffer-composer-installer": true,
+ "drupal/core-composer-scaffold": true,
+ "ergebnis/composer-normalize": true,
+ "oomphinc/composer-installers-extender": true,
diff --git a/.vortex/installer/tests/Fixtures/install/tools_none/composer.json b/.vortex/installer/tests/Fixtures/install/tools_none/composer.json
index 18262899f..9976c7490 100644
--- a/.vortex/installer/tests/Fixtures/install/tools_none/composer.json
+++ b/.vortex/installer/tests/Fixtures/install/tools_none/composer.json
@@ -23,7 +23,7 @@
"vincentlanglet/twig-cs-fixer": "__VERSION__"
},
"conflict": {
-@@ -65,11 +51,6 @@
+@@ -65,21 +51,14 @@
"scripts/composer/ScriptHandler.php"
]
},
@@ -35,7 +35,9 @@
"config": {
"allow-plugins": {
"composer/installers": true,
-@@ -79,7 +60,6 @@
+ "cweagans/composer-patches": true,
+- "dealerdirect/phpcodesniffer-composer-installer": true,
+ "drupal/core-composer-scaffold": true,
"ergebnis/composer-normalize": true,
"oomphinc/composer-installers-extender": true,
"php-http/discovery": true,
diff --git a/.vortex/installer/tests/Functional/FunctionalTestCase.php b/.vortex/installer/tests/Functional/FunctionalTestCase.php
index 92b40d15a..e18ca6def 100644
--- a/.vortex/installer/tests/Functional/FunctionalTestCase.php
+++ b/.vortex/installer/tests/Functional/FunctionalTestCase.php
@@ -124,12 +124,12 @@ protected function assertSutContains(string|array $needles): void {
foreach ($needles as $needle) {
if (Strings::isRegex($needle)) {
- $this->assertDirectoryContainsString($needle, static::$sut, [
+ $this->assertDirectoryContainsString(static::$sut, $needle, [
'scripts/vortex',
]);
}
else {
- $this->assertDirectoryContainsWord($needle, static::$sut, [
+ $this->assertDirectoryContainsWord(static::$sut, $needle, [
'scripts/vortex',
]);
}
@@ -141,12 +141,12 @@ protected function assertSutNotContains(string|array $needles): void {
foreach ($needles as $needle) {
if (Strings::isRegex($needle)) {
- $this->assertDirectoryNotContainsString($needle, static::$sut, [
+ $this->assertDirectoryNotContainsString(static::$sut, $needle, [
'scripts/vortex',
]);
}
else {
- $this->assertDirectoryNotContainsWord($needle, static::$sut, [
+ $this->assertDirectoryNotContainsWord(static::$sut, $needle, [
'scripts/vortex',
]);
}
diff --git a/.vortex/installer/tests/Functional/Handlers/CodeProviderInstallTest.php b/.vortex/installer/tests/Functional/Handlers/CodeProviderInstallTest.php
index db7ba0910..89fa8088f 100644
--- a/.vortex/installer/tests/Functional/Handlers/CodeProviderInstallTest.php
+++ b/.vortex/installer/tests/Functional/Handlers/CodeProviderInstallTest.php
@@ -19,7 +19,7 @@ public static function dataProviderInstall(): array {
static::cw(fn() => Env::put(PromptManager::makeEnvName(CodeProvider::id()), CodeProvider::GITHUB)),
static::cw(function (FunctionalTestCase $test): void {
$test->assertFileDoesNotExist(static::$sut . '/.github/PULL_REQUEST_TEMPLATE.dist.md');
- $test->assertFileContainsString('Checklist before requesting a review', static::$sut . '/.github/PULL_REQUEST_TEMPLATE.md');
+ $test->assertFileContainsString(static::$sut . '/.github/PULL_REQUEST_TEMPLATE.md', 'Checklist before requesting a review');
}),
],
diff --git a/.vortex/installer/tests/Functional/Handlers/StarterInstallTest.php b/.vortex/installer/tests/Functional/Handlers/StarterInstallTest.php
index 2dcd383b0..152d3c9d3 100644
--- a/.vortex/installer/tests/Functional/Handlers/StarterInstallTest.php
+++ b/.vortex/installer/tests/Functional/Handlers/StarterInstallTest.php
@@ -17,15 +17,25 @@ public static function dataProviderInstall(): array {
return [
'starter, demo db' => [
static::cw(fn() => Env::put(PromptManager::makeEnvName(Starter::id()), Starter::LOAD_DATABASE_DEMO)),
+ static::cw(fn(FunctionalTestCase $test) => $test->assertSutNotContains([
+ 'drupal/cms',
+ 'wikimedia/composer-merge-plugin',
+ 'vendor/drupal/cms/composer.json',
+ ])),
],
'starter, Drupal profile' => [
static::cw(fn() => Env::put(PromptManager::makeEnvName(Starter::id()), Starter::INSTALL_PROFILE_CORE)),
+ static::cw(fn(FunctionalTestCase $test) => $test->assertSutNotContains([
+ 'drupal/cms',
+ 'wikimedia/composer-merge-plugin',
+ 'vendor/drupal/cms/composer.json',
+ ])),
],
'starter, Drupal CMS profile' => [
static::cw(fn() => Env::put(PromptManager::makeEnvName(Starter::id()), Starter::INSTALL_PROFILE_DRUPALCMS)),
- static::cw(fn(FunctionalTestCase $test) => $test->assertSutNotContains([
+ static::cw(fn(FunctionalTestCase $test) => $test->assertSutContains([
'drupal/cms',
'wikimedia/composer-merge-plugin',
'vendor/drupal/cms/composer.json',
diff --git a/.vortex/installer/tests/Functional/Handlers/ThemeInstallTest.php b/.vortex/installer/tests/Functional/Handlers/ThemeInstallTest.php
index 5a9cd4de4..39ff30cb1 100644
--- a/.vortex/installer/tests/Functional/Handlers/ThemeInstallTest.php
+++ b/.vortex/installer/tests/Functional/Handlers/ThemeInstallTest.php
@@ -21,7 +21,7 @@ public static function dataProviderInstall(): array {
Env::put(PromptManager::makeEnvName(Theme::id()), '');
Env::put(PromptManager::makeEnvName(AiCodeInstructions::id()), AiCodeInstructions::CLAUDE);
}),
- static::cw(fn(FunctionalTestCase $test) => $test->assertDirectoryNotContainsString('themes/custom', static::$sut, [
+ static::cw(fn(FunctionalTestCase $test) => $test->assertDirectoryNotContainsString(static::$sut, 'themes/custom', [
'.gitignore',
'scripts/vortex',
'composer.json',
@@ -31,7 +31,7 @@ public static function dataProviderInstall(): array {
'theme, custom' => [
static::cw(fn() => Env::put(PromptManager::makeEnvName(Theme::id()), 'light_saber')),
- static::cw(fn(FunctionalTestCase $test) => $test->assertDirectoryNotContainsString('your_site_theme', static::$sut)),
+ static::cw(fn(FunctionalTestCase $test) => $test->assertDirectoryNotContainsString(static::$sut, 'your_site_theme')),
],
];
diff --git a/.vortex/installer/tests/Functional/Handlers/TimezoneInstallTest.php b/.vortex/installer/tests/Functional/Handlers/TimezoneInstallTest.php
index c65e1d296..57ad70e8f 100644
--- a/.vortex/installer/tests/Functional/Handlers/TimezoneInstallTest.php
+++ b/.vortex/installer/tests/Functional/Handlers/TimezoneInstallTest.php
@@ -24,21 +24,21 @@ public static function dataProviderInstall(): array {
}),
static::cw(function (FunctionalTestCase $test): void {
// Timezone should be replaced in .env file.
- $test->assertFileContainsString('TZ=America/New_York', static::$sut . '/.env');
- $test->assertFileNotContainsString('UTC', static::$sut . '/.env');
+ $test->assertFileContainsString(static::$sut . '/.env', 'TZ=America/New_York');
+ $test->assertFileNotContainsString(static::$sut . '/.env', 'UTC');
// Timezone should be replaced in Renovate config.
- $test->assertFileContainsString('"timezone": "America/New_York"', static::$sut . '/renovate.json');
- $test->assertFileNotContainsString('UTC', static::$sut . '/renovate.json');
+ $test->assertFileContainsString(static::$sut . '/renovate.json', '"timezone": "America/New_York"');
+ $test->assertFileNotContainsString(static::$sut . '/renovate.json', 'UTC');
// Timezone should not be replaced in GHA config in code as it should
// be overridden via UI.
- $test->assertFileNotContainsString('America/New_York', static::$sut . '/.github/workflows/build-test-deploy.yml');
- $test->assertFileContainsString('UTC', static::$sut . '/.github/workflows/build-test-deploy.yml');
+ $test->assertFileNotContainsString(static::$sut . '/.github/workflows/build-test-deploy.yml', 'America/New_York');
+ $test->assertFileContainsString(static::$sut . '/.github/workflows/build-test-deploy.yml', 'UTC');
// Timezone should not be replaced in Docker Compose config.
- $test->assertFileNotContainsString('America/New_York', static::$sut . '/docker-compose.yml');
- $test->assertFileContainsString('UTC', static::$sut . '/docker-compose.yml');
+ $test->assertFileNotContainsString(static::$sut . '/docker-compose.yml', 'America/New_York');
+ $test->assertFileContainsString(static::$sut . '/docker-compose.yml', 'UTC');
}),
],
@@ -50,8 +50,8 @@ public static function dataProviderInstall(): array {
static::cw(function (FunctionalTestCase $test): void {
// Timezone should not be replaced in CircleCI config in code as it
// should be overridden via UI.
- $test->assertFileNotContainsString('TZ: America/New_York', static::$sut . '/.circleci/config.yml');
- $test->assertFileContainsString('TZ: UTC', static::$sut . '/.circleci/config.yml');
+ $test->assertFileNotContainsString(static::$sut . '/.circleci/config.yml', 'TZ: America/New_York');
+ $test->assertFileContainsString(static::$sut . '/.circleci/config.yml', 'TZ: UTC');
}),
],
];
diff --git a/.vortex/installer/tests/Unit/EnvTest.php b/.vortex/installer/tests/Unit/EnvTest.php
index 9fadc015e..eef338fc6 100644
--- a/.vortex/installer/tests/Unit/EnvTest.php
+++ b/.vortex/installer/tests/Unit/EnvTest.php
@@ -151,7 +151,7 @@ public function testWriteValueDotenv(): void {
// Add new variable.
Env::writeValueDotenv('NEW_VAR', 'new_added_value', $actual_file);
- $this->assertDirectoryEqualsDirectory($fixture_dir . '/after', static::$sut);
+ $this->assertDirectoryEqualsDirectory(static::$sut, $fixture_dir . '/after');
}
#[DataProvider('dataProviderFormatValueForDotenv')]
diff --git a/.vortex/installer/tests/Unit/SelfTest.php b/.vortex/installer/tests/Unit/SelfTest.php
index 13987dcdc..aaef319c9 100644
--- a/.vortex/installer/tests/Unit/SelfTest.php
+++ b/.vortex/installer/tests/Unit/SelfTest.php
@@ -17,7 +17,7 @@ public function testVersionReplacement(): void {
static::replaceVersions(static::$sut);
- $this->assertDirectoryEqualsDirectory($expected, static::$sut);
+ $this->assertDirectoryEqualsDirectory(static::$sut, $expected);
}
}
diff --git a/.vortex/tests/composer.json b/.vortex/tests/composer.json
index d074c4786..93fedc260 100644
--- a/.vortex/tests/composer.json
+++ b/.vortex/tests/composer.json
@@ -12,8 +12,8 @@
"php": ">=8.2"
},
"require-dev": {
- "alexskrypnyk/file": "^0.9",
- "alexskrypnyk/phpunit-helpers": "main-dev",
+ "alexskrypnyk/file": "^0.11.0",
+ "alexskrypnyk/phpunit-helpers": "^0.10",
"alexskrypnyk/shellvar": "^1.2",
"czproject/git-php": "^4.4",
"dealerdirect/phpcodesniffer-composer-installer": "^1",
diff --git a/.vortex/tests/composer.lock b/.vortex/tests/composer.lock
index 4e9fc71e4..65ea1fd10 100644
--- a/.vortex/tests/composer.lock
+++ b/.vortex/tests/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "612fdc9548a46c100c72d38090aa6067",
+ "content-hash": "cc22670886a902fdcd8911f876bbab23",
"packages": [],
"packages-dev": [
{
@@ -65,16 +65,16 @@
},
{
"name": "alexskrypnyk/file",
- "version": "0.9.0",
+ "version": "0.11.0",
"source": {
"type": "git",
"url": "https://github.com/AlexSkrypnyk/file.git",
- "reference": "df98e9ba70357433061533e9cc747708ce92500c"
+ "reference": "3719d79a6ea64a76f8856bc2ff9d2029a4a3d895"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AlexSkrypnyk/file/zipball/df98e9ba70357433061533e9cc747708ce92500c",
- "reference": "df98e9ba70357433061533e9cc747708ce92500c",
+ "url": "https://api.github.com/repos/AlexSkrypnyk/file/zipball/3719d79a6ea64a76f8856bc2ff9d2029a4a3d895",
+ "reference": "3719d79a6ea64a76f8856bc2ff9d2029a4a3d895",
"shasum": ""
},
"require": {
@@ -82,7 +82,7 @@
"symfony/filesystem": "^7.2"
},
"require-dev": {
- "alexskrypnyk/phpunit-helpers": "^0.8.1",
+ "alexskrypnyk/phpunit-helpers": "^0.10.0",
"dealerdirect/phpcodesniffer-composer-installer": "^1",
"drupal/coder": "^8.3",
"ergebnis/composer-normalize": "^2.42",
@@ -127,11 +127,11 @@
"type": "patreon"
}
],
- "time": "2025-08-24T03:16:48+00:00"
+ "time": "2025-09-14T00:12:13+00:00"
},
{
"name": "alexskrypnyk/phpunit-helpers",
- "version": "dev-main",
+ "version": "0.10.0",
"source": {
"type": "git",
"url": "https://github.com/AlexSkrypnyk/phpunit-helpers.git",
@@ -160,7 +160,6 @@
"squizlabs/php_codesniffer": "^3.7",
"symfony/console": "^6.4 || ^7.2"
},
- "default-branch": true,
"type": "library",
"autoload": {
"psr-4": {
@@ -4164,9 +4163,7 @@
],
"aliases": [],
"minimum-stability": "alpha",
- "stability-flags": {
- "alexskrypnyk/phpunit-helpers": 20
- },
+ "stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
diff --git a/.vortex/tests/phpunit/Functional/FunctionalTestCase.php b/.vortex/tests/phpunit/Functional/FunctionalTestCase.php
index a436a1202..e1c7c6654 100644
--- a/.vortex/tests/phpunit/Functional/FunctionalTestCase.php
+++ b/.vortex/tests/phpunit/Functional/FunctionalTestCase.php
@@ -8,16 +8,15 @@
use AlexSkrypnyk\PhpunitHelpers\Traits\AssertArrayTrait;
use AlexSkrypnyk\PhpunitHelpers\Traits\EnvTrait;
use AlexSkrypnyk\PhpunitHelpers\Traits\LocationsTrait;
+use AlexSkrypnyk\PhpunitHelpers\Traits\LoggerTrait;
use AlexSkrypnyk\PhpunitHelpers\Traits\ProcessTrait;
use AlexSkrypnyk\PhpunitHelpers\UnitTestCase;
-use DrevOps\Vortex\Tests\Traits\AssertFilesTrait;
+use DrevOps\Vortex\Tests\Traits\AssertProjectFilesTrait;
use DrevOps\Vortex\Tests\Traits\GitTrait;
-use DrevOps\Vortex\Tests\Traits\LoggerTrait;
use DrevOps\Vortex\Tests\Traits\Steps\StepBuildTrait;
-use DrevOps\Vortex\Tests\Traits\Steps\StepDownloadDbTrait;
+use DrevOps\Vortex\Tests\Traits\Steps\StepDatabaseTrait;
use DrevOps\Vortex\Tests\Traits\Steps\StepPrepareSutTrait;
-use DrevOps\Vortex\Tests\Traits\Steps\StepTestBddAllTrait;
-use DrevOps\Vortex\Tests\Traits\Steps\StepTestBddTrait;
+use DrevOps\Vortex\Tests\Traits\Steps\StepTestTrait;
use Symfony\Component\Process\Process;
/**
@@ -25,8 +24,16 @@
*/
class FunctionalTestCase extends UnitTestCase {
+ /**
+ * URL to the test demo database.
+ *
+ * Tests use demo database and 'ahoy download-db' command, so we need
+ * to set the CURL DB to test DB.
+ */
+ const VORTEX_INSTALLER_DEMO_DB_TEST = 'https://github.com/drevops/vortex/releases/download/25.4.0/db_d11_2.test.sql';
+
use AssertArrayTrait;
- use AssertFilesTrait;
+ use AssertProjectFilesTrait;
use EnvTrait;
use GitTrait;
use LocationsTrait;
@@ -35,10 +42,9 @@ class FunctionalTestCase extends UnitTestCase {
ProcessTrait::processRun as traitProcessRun;
}
use StepBuildTrait;
- use StepDownloadDbTrait;
use StepPrepareSutTrait;
- use StepTestBddAllTrait;
- use StepTestBddTrait;
+ use StepTestTrait;
+ use StepDatabaseTrait;
protected function setUp(): void {
self::locationsInit(File::cwd() . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..');
@@ -165,64 +171,70 @@ public function volumesMounted(): bool {
return getenv('VORTEX_DEV_VOLUMES_SKIP_MOUNT') != 1;
}
- protected function assertFilesExist(string $directory, array $files): void {
- foreach ($files as $file) {
- $this->assertFileExists($directory . DIRECTORY_SEPARATOR . $file);
- }
+ protected function trimFile(string $file): void {
+ $content = File::read($file);
+ $lines = explode("\n", $content);
+ // Remove last line.
+ array_pop($lines);
+ File::dump($file, implode("\n", $lines));
}
- /**
- * Assert that files matching wildcard pattern(s) exist.
- *
- * @param string|array $patterns
- * Wildcard pattern(s) to match files against.
- */
- protected function assertFilesWildcardExists(string|array $patterns): void {
- $patterns = is_array($patterns) ? $patterns : [$patterns];
-
- if (empty($patterns)) {
- throw new \InvalidArgumentException('Empty patterns - no files to check');
- }
+ protected function stepWarmCaches(): void {
+ $this->logSubstep('Warming up caches');
+ $this->cmd('ahoy drush cr');
+ $this->cmd('ahoy cli curl -- -sSL -o /dev/null -w "%{http_code}" http://nginx:8080 | grep -q 200');
+ }
- foreach ($patterns as $pattern) {
- $matches = glob($pattern);
+ protected function addVarToFile(string $file, string $var, string $value): void {
+ // Backup original file first.
+ $this->backupFile($file);
+ $content = File::read($file);
+ $content .= sprintf('%s%s=%s%s', PHP_EOL, $var, $value, PHP_EOL);
+ File::dump($file, $content);
+ }
- if ($matches === FALSE) {
- throw new \RuntimeException(sprintf('Failed to read files matching wildcard pattern: %s', $pattern));
- }
+ protected function backupFile(string $file): void {
+ $backup_dir = '/tmp/bkp';
+ if (!is_dir($backup_dir)) {
+ mkdir($backup_dir, 0755, TRUE);
+ }
+ File::copy($file, $backup_dir . '/' . basename($file));
+ }
- $this->assertNotEmpty(
- $matches,
- sprintf('No files found matching wildcard pattern: %s', $pattern)
- );
+ protected function restoreFile(string $file): void {
+ $backup_file = '/tmp/bkp/' . basename($file);
+ if (file_exists($backup_file)) {
+ File::copy($backup_file, $file);
}
}
- /**
- * Assert that files matching wildcard pattern(s) do not exist.
- *
- * @param string|array $patterns
- * Wildcard pattern(s) to match files against.
- */
- protected function assertFilesWildcardDoNotExist(string|array $patterns): void {
- $patterns = is_array($patterns) ? $patterns : [$patterns];
+ protected function createDevelopmentSettings(string $webroot = 'web'): void {
+ File::copy($webroot . '/sites/default/example.settings.local.php', $webroot . '/sites/default/settings.local.php');
+ // Assert manually created local settings file exists.
+ $this->assertFileExists($webroot . '/sites/default/settings.local.php');
- if (empty($patterns)) {
- throw new \InvalidArgumentException('Empty patterns - no files to check');
- }
+ File::copy($webroot . '/sites/default/example.services.local.yml', $webroot . '/sites/default/services.local.yml');
+ // Assert manually created local services file exists.
+ $this->assertFileExists($webroot . '/sites/default/services.local.yml');
+ }
- foreach ($patterns as $pattern) {
- $matches = glob($pattern);
+ protected function removeDevelopmentSettings(string $webroot = 'web'): void {
+ File::remove([
+ $webroot . '/sites/default/settings.local.php',
+ $webroot . '/sites/default/services.local.yml',
+ ]);
+ $this->assertFileDoesNotExist($webroot . '/sites/default/settings.local.php');
+ $this->assertFileDoesNotExist($webroot . '/sites/default/services.local.yml');
+ }
- if ($matches === FALSE) {
- throw new \RuntimeException(sprintf('Failed to read files matching wildcard pattern: %s', $pattern));
- }
+ protected function assertFilesPresent(string $webroot): void {
+ // Use existing method from base class with correct signature.
+ $this->assertCommonFilesPresent($webroot);
+ }
- $this->assertEmpty(
- $matches,
- sprintf('Found %d file(s) matching wildcard pattern that should not exist: %s', count($matches), $pattern)
- );
- }
+ protected function assertGitRepo(): void {
+ // @todp Use gitAssertIsRepository().
+ $this->assertDirectoryExists('.git');
}
}
diff --git a/.vortex/tests/phpunit/Functional/SelfTest.php b/.vortex/tests/phpunit/Functional/SelfTest.php
deleted file mode 100644
index 74308bfb4..000000000
--- a/.vortex/tests/phpunit/Functional/SelfTest.php
+++ /dev/null
@@ -1,173 +0,0 @@
-assertFilesWildcardExists($patterns);
- }
- else {
- if (!is_string($expected_exception) || !class_exists($expected_exception)) {
- throw new \RuntimeException('Expected a string, got a ' . gettype($expected_exception));
- }
- /** @var class-string<\Throwable> $expected_exception */
- $this->expectException($expected_exception);
- if ($expected_message !== NULL) {
- $this->expectExceptionMessage($expected_message);
- }
- $this->assertFilesWildcardExists($patterns);
- }
- }
-
- /**
- * Data provider for assertFilesWildcardExists tests.
- */
- public static function dataProviderAssertFilesWildcardExists(): array {
- return [
- 'single pattern exists' => [
- 'wildcard_test/*.html',
- TRUE,
- ],
- 'single pattern not exists' => [
- 'wildcard_test/*.xml',
- FALSE,
- AssertionFailedError::class,
- 'No files found matching wildcard pattern',
- ],
- 'array patterns all exist' => [
- ['wildcard_test/*.html', 'wildcard_test/*.log'],
- TRUE,
- ],
- 'array patterns mixed' => [
- ['wildcard_test/*.html', 'wildcard_test/*.xml'],
- FALSE,
- AssertionFailedError::class,
- 'No files found matching wildcard pattern',
- ],
- 'subdirectory pattern' => [
- 'wildcard_test/*/*.html',
- TRUE,
- ],
- 'empty array' => [
- [],
- FALSE,
- \InvalidArgumentException::class,
- 'Empty patterns - no files to check',
- ],
- ];
- }
-
- /**
- * Test assertFilesWildcardDoNotExist method.
- */
- #[DataProvider('dataProviderAssertFilesWildcardDoNotExist')]
- public function testAssertFilesWildcardDoNotExist(string|array $patterns, bool $should_pass, ?string $expected_exception = NULL, ?string $expected_message = NULL): void {
- // Convert relative patterns to absolute paths.
- $workspace = static::$workspace;
- if (is_array($patterns)) {
- $patterns = array_map(function (string $pattern) use ($workspace): string {
- return $workspace . DIRECTORY_SEPARATOR . $pattern;
- }, $patterns);
- }
- elseif (!empty($patterns)) {
- $patterns = $workspace . DIRECTORY_SEPARATOR . $patterns;
- }
-
- if ($should_pass) {
- $this->assertFilesWildcardDoNotExist($patterns);
- }
- else {
- if (!is_string($expected_exception) || !class_exists($expected_exception)) {
- throw new \RuntimeException('Expected a string, got a ' . gettype($expected_exception));
- }
- /** @var class-string<\Throwable> $expected_exception */
- $this->expectException($expected_exception);
- if ($expected_message !== NULL) {
- $this->expectExceptionMessage($expected_message);
- }
- $this->assertFilesWildcardDoNotExist($patterns);
- }
- }
-
- /**
- * Data provider for assertFilesWildcardDoNotExist tests.
- */
- public static function dataProviderAssertFilesWildcardDoNotExist(): array {
- return [
- 'single pattern not exists' => [
- 'wildcard_test/*.xml',
- TRUE,
- ],
- 'single pattern exists' => [
- 'wildcard_test/*.html',
- FALSE,
- AssertionFailedError::class,
- 'Found 2 file(s) matching wildcard pattern that should not exist',
- ],
- 'array patterns none exist' => [
- ['wildcard_test/*.xml', 'wildcard_test/*.php'],
- TRUE,
- ],
- 'array patterns some exist' => [
- ['wildcard_test/*.xml', 'wildcard_test/*.html'],
- FALSE,
- AssertionFailedError::class,
- 'Found 2 file(s) matching wildcard pattern that should not exist',
- ],
- 'empty array' => [
- [],
- FALSE,
- \InvalidArgumentException::class,
- 'Empty patterns - no files to check',
- ],
- ];
- }
-
-}
diff --git a/.vortex/tests/phpunit/Functional/WorkflowInstallDbTest.php b/.vortex/tests/phpunit/Functional/WorkflowInstallDbTest.php
index 169393417..e46dfddac 100644
--- a/.vortex/tests/phpunit/Functional/WorkflowInstallDbTest.php
+++ b/.vortex/tests/phpunit/Functional/WorkflowInstallDbTest.php
@@ -9,7 +9,8 @@
use DrevOps\Vortex\Tests\Traits\Steps\StepEnvironmentTrait;
use DrevOps\Vortex\Tests\Traits\Steps\StepFrontendTrait;
use DrevOps\Vortex\Tests\Traits\Steps\StepServicesTrait;
-use DrevOps\Vortex\Tests\Traits\Steps\StepTestingTrait;
+use DrevOps\Vortex\Tests\Traits\Steps\StepTestTrait;
+use DrevOps\Vortex\Tests\Traits\Steps\StepLintTrait;
/**
* Tests DB-driven workflow.
@@ -20,8 +21,9 @@ class WorkflowInstallDbTest extends FunctionalTestCase {
use StepDatabaseTrait;
use StepEnvironmentTrait;
use StepFrontendTrait;
+ use StepLintTrait;
use StepServicesTrait;
- use StepTestingTrait;
+ use StepTestTrait;
protected function setUp(): void {
parent::setUp();
diff --git a/.vortex/tests/phpunit/Functional/WorkflowTest.php b/.vortex/tests/phpunit/Functional/WorkflowTest.php
index 876e70053..2b86d4b05 100644
--- a/.vortex/tests/phpunit/Functional/WorkflowTest.php
+++ b/.vortex/tests/phpunit/Functional/WorkflowTest.php
@@ -23,20 +23,25 @@ protected function setUp(): void {
public function testSmoke(): void {
$this->assertDirectoryExists(static::$sut, 'SUT directory exists');
$this->assertEquals(static::$sut, File::cwd(), 'SUT is the current working directory');
+
+ // Assert all special comments were removed.
+ $this->assertDirectoryNotContainsString('.', '#;', ['.png', '.jpg']);
+ $this->assertDirectoryNotContainsString('.', '#;<', ['.png', '.jpg']);
+ $this->assertDirectoryNotContainsString('.', '#;>', ['.png', '.jpg']);
}
public function testIdempotence(): void {
$this->stepBuild();
$this->assertFilesTrackedInGit();
- $this->stepTestBdd();
+ $this->stepAhoyTestBddFast();
$this->logSubstep('Re-build project to check that the results are identical.');
$this->stepBuild();
$this->assertFilesTrackedInGit(skip_commit: TRUE);
$this->logSubstep('Run BDD tests again on re-built project');
- $this->stepTestBdd();
+ $this->stepAhoyTestBddFast();
}
/**
@@ -96,7 +101,7 @@ public function testDockerComposeNoAhoy(): void {
$this->assertFilesTrackedInGit();
- $this->stepTestBdd();
+ $this->stepAhoyTestBdd();
}
}
diff --git a/.vortex/tests/phpunit/Traits/AssertFilesTrait.php b/.vortex/tests/phpunit/Traits/AssertProjectFilesTrait.php
similarity index 93%
rename from .vortex/tests/phpunit/Traits/AssertFilesTrait.php
rename to .vortex/tests/phpunit/Traits/AssertProjectFilesTrait.php
index ef27fc8fd..f556721be 100644
--- a/.vortex/tests/phpunit/Traits/AssertFilesTrait.php
+++ b/.vortex/tests/phpunit/Traits/AssertProjectFilesTrait.php
@@ -12,7 +12,7 @@
/**
* Provides file and directory assertion methods.
*/
-trait AssertFilesTrait {
+trait AssertProjectFilesTrait {
use DirectoryAssertionsTrait;
use FileAssertionsTrait;
@@ -22,17 +22,17 @@ protected function assertCommonFilesPresent(string $webroot = 'web', string $pro
// Assert that project name is correct.
Assert::assertFileExists('.env');
- $this->assertFileContainsString('VORTEX_PROJECT=' . $project_name, '.env');
+ $this->assertFileContainsString('.env', 'VORTEX_PROJECT=' . $project_name);
// Assert that Vortex version was replaced in README.md.
Assert::assertFileExists('README.md');
$vortex_version = getenv('TEST_VORTEX_VERSION') ?: 'develop';
- $this->assertFileContainsString(sprintf('badge/Vortex-%s-65ACBC.svg', $vortex_version), 'README.md');
- $this->assertFileContainsString('https://github.com/drevops/vortex/tree/' . $vortex_version, 'README.md');
- $this->assertFileNotContainsString('The following list includes', 'README.md');
+ $this->assertFileContainsString('README.md', sprintf('badge/Vortex-%s-65ACBC.svg', $vortex_version));
+ $this->assertFileContainsString('README.md', 'https://github.com/drevops/vortex/tree/' . $vortex_version);
+ $this->assertFileNotContainsString('README.md', 'The following list includes');
Assert::assertFileDoesNotExist('README.dist.md');
- $this->assertFileContainsString('This repository was created using the [Vortex](https://github.com/drevops/vortex) Drupal project template', 'README.md', 'Assert that Vortex footnote remains.');
+ $this->assertFileContainsString('README.md', 'This repository was created using the [Vortex](https://github.com/drevops/vortex) Drupal project template', 'Assert that Vortex footnote remains.');
// Assert Drupal files are present.
$this->assertDrupalFilesPresent($webroot);
@@ -200,12 +200,12 @@ protected function assertVortexFilesPresent(string $webroot = 'web'): void {
Assert::assertFileDoesNotExist('.github/workflows/vortex-test-installer.yml');
if (file_exists('.circleci/config.yml')) {
- $this->assertFileNotContainsString('vortex-dev', '.circleci/config.yml', 'CircleCI config should not contain development Vortex references');
+ $this->assertFileNotContainsString('.circleci/config.yml', 'vortex-dev', 'CircleCI config should not contain development Vortex references');
}
// Assert that documentation was processed correctly.
if (file_exists('README.md')) {
- $this->assertFileNotContainsString('# Vortex', 'README.md');
+ $this->assertFileNotContainsString('README.md', '# Vortex');
}
// Check directory doesn't contain .vortex references.
@@ -341,4 +341,40 @@ protected function removeLocalDrupalSettings(string $webroot = 'web'): void {
]);
}
+ /**
+ * {@inheritdoc}
+ */
+ public function ignoredPaths(): array {
+ return [
+ '.7z',
+ '.avif',
+ '.bz2',
+ '.gz',
+ '.heic',
+ '.heif',
+ '.pdf',
+ '.rar',
+ '.tar',
+ '.woff',
+ '.woff2',
+ '.xz',
+ '.zip',
+ '.bmp',
+ '.gif',
+ '.ico',
+ '.jpeg',
+ '.jpg',
+ '.png',
+ '.svg',
+ '.svgz',
+ '.tif',
+ '.tiff',
+ '.webp',
+ 'modules.README.txt',
+ 'modules/README.txt',
+ 'themes.README.txt',
+ 'themes/README.txt',
+ ];
+ }
+
}
diff --git a/.vortex/tests/phpunit/Traits/LoggerTrait.php b/.vortex/tests/phpunit/Traits/LoggerTrait.php
deleted file mode 100644
index 6cbd2759f..000000000
--- a/.vortex/tests/phpunit/Traits/LoggerTrait.php
+++ /dev/null
@@ -1,16 +0,0 @@
-logStepStart();
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepBuildTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepBuildTrait.php
index f2e53efe4..10b320084 100644
--- a/.vortex/tests/phpunit/Traits/Steps/StepBuildTrait.php
+++ b/.vortex/tests/phpunit/Traits/Steps/StepBuildTrait.php
@@ -4,15 +4,11 @@
namespace DrevOps\Vortex\Tests\Traits\Steps;
-use DrevOps\Vortex\Tests\Traits\LoggerTrait;
-
/**
* Provides build step.
*/
trait StepBuildTrait {
- use LoggerTrait;
-
protected function stepBuild(string $webroot = 'web', array $env = []): void {
$this->logStepStart();
@@ -43,12 +39,12 @@ protected function stepBuild(string $webroot = 'web', array $env = []): void {
$this->logSubstep('Assert only minified compiled CSS exists');
$this->assertFileExists($webroot . '/themes/custom/star_wars/build/css/star_wars.min.css', 'Minified CSS file should exist');
- $this->assertFileNotContainsString('background: #7e57e2', $webroot . '/themes/custom/star_wars/build/css/star_wars.min.css', 'CSS should not contain development colors');
+ $this->assertFileNotContainsString($webroot . '/themes/custom/star_wars/build/css/star_wars.min.css', 'background: #7e57e2', 'CSS should not contain development colors');
$this->assertFileDoesNotExist($webroot . '/themes/custom/star_wars/build/css/star_wars.css', 'Non-minified CSS should not exist');
$this->logSubstep('Assert only minified compiled JS exists');
$this->assertFileExists($webroot . '/themes/custom/star_wars/build/js/star_wars.min.js', 'Minified JS file should exist');
- $this->assertFileContainsString('!function(Drupal){"use strict";Drupal.behaviors.star_wars', $webroot . '/themes/custom/star_wars/build/js/star_wars.min.js', 'JS should contain expected minified content');
+ $this->assertFileContainsString($webroot . '/themes/custom/star_wars/build/js/star_wars.min.js', '!function(Drupal){"use strict";Drupal.behaviors.star_wars', 'JS should contain expected minified content');
$this->assertFileDoesNotExist($webroot . '/themes/custom/star_wars/build/js/star_wars.js', 'Non-minified JS should not exist');
$this->logStepFinish();
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepDatabaseTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepDatabaseTrait.php
index 8ab5e2032..6fcc05459 100644
--- a/.vortex/tests/phpunit/Traits/Steps/StepDatabaseTrait.php
+++ b/.vortex/tests/phpunit/Traits/Steps/StepDatabaseTrait.php
@@ -5,14 +5,27 @@
namespace DrevOps\Vortex\Tests\Traits\Steps;
use AlexSkrypnyk\File\File;
-use DrevOps\Vortex\Tests\Traits\LoggerTrait;
/**
* Provides database operation testing steps.
*/
trait StepDatabaseTrait {
- use LoggerTrait;
+ protected function stepDownloadDb(): void {
+ $this->logStepStart();
+
+ File::remove('.data/db.sql');
+ $this->assertFileDoesNotExist('.data/db.sql', 'File .data/db.sql should not exist before downloading the database.');
+
+ $this->logSubstep('Downloading demo database from ' . static::VORTEX_INSTALLER_DEMO_DB_TEST);
+ $this->cmd('ahoy download-db', env: [
+ 'VORTEX_DB_DOWNLOAD_URL' => static::VORTEX_INSTALLER_DEMO_DB_TEST,
+ ]);
+
+ $this->assertFileExists('.data/db.sql', 'File .data/db.sql should exist after downloading the database.');
+
+ $this->logStepFinish();
+ }
protected function stepAhoyExportDb(string $filename = ''): void {
$this->logStepStart();
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepDownloadDbTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepDownloadDbTrait.php
deleted file mode 100644
index 253491e3e..000000000
--- a/.vortex/tests/phpunit/Traits/Steps/StepDownloadDbTrait.php
+++ /dev/null
@@ -1,38 +0,0 @@
-logStepStart();
-
- File::remove('.data/db.sql');
- $this->assertFileDoesNotExist('.data/db.sql', 'File .data/db.sql should not exist before downloading the database.');
-
- $this->logSubstep('Downloading demo database from ' . static::VORTEX_INSTALLER_DEMO_DB_TEST);
- $this->cmd('ahoy download-db', env: [
- 'VORTEX_DB_DOWNLOAD_URL' => static::VORTEX_INSTALLER_DEMO_DB_TEST,
- ]);
-
- $this->assertFileExists('.data/db.sql', 'File .data/db.sql should exist after downloading the database.');
-
- $this->logStepFinish();
- }
-
-}
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepEnvironmentTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepEnvironmentTrait.php
index f3793a839..317726251 100644
--- a/.vortex/tests/phpunit/Traits/Steps/StepEnvironmentTrait.php
+++ b/.vortex/tests/phpunit/Traits/Steps/StepEnvironmentTrait.php
@@ -5,15 +5,12 @@
namespace DrevOps\Vortex\Tests\Traits\Steps;
use AlexSkrypnyk\File\File;
-use DrevOps\Vortex\Tests\Traits\LoggerTrait;
/**
* Provides environment and configuration testing steps.
*/
trait StepEnvironmentTrait {
- use LoggerTrait;
-
protected function stepGitignore(): void {
$this->logStepStart();
@@ -29,14 +26,11 @@ protected function stepGitignore(): void {
protected function stepEnvChanges(): void {
$this->logStepStart();
- // Assert that .env does not contain test values.
- $this->assertFileNotContainsString('MY_CUSTOM_VAR', '.env');
- $this->assertFileNotContainsString('my_custom_var_value', '.env');
+ $this->assertFileNotContainsString('.env', 'MY_CUSTOM_VAR', '.env does not contain test values');
+ $this->assertFileNotContainsString('.env', 'my_custom_var_value', '.env does not contain test values');
- // Assert that test variable is not available inside of containers.
$this->cmdFail('ahoy cli "printenv | grep -q MY_CUSTOM_VAR"');
- // Assert that test value is not available inside of containers.
$this->cmdFail('ahoy cli \'echo $MY_CUSTOM_VAR | grep -q my_custom_var_value\'', '! my_custom_var_value');
// Add variable to the .env file and apply the change to container.
@@ -44,15 +38,10 @@ protected function stepEnvChanges(): void {
$this->cmd('ahoy up cli');
$this->syncToContainer();
- // Assert that .env contains test values.
- $this->assertFileContainsString('MY_CUSTOM_VAR', '.env');
- $this->assertFileContainsString('my_custom_var_value', '.env');
-
- // Assert that test variable and values are available inside of containers.
- $this->cmd('ahoy cli "printenv | grep MY_CUSTOM_VAR"', 'my_custom_var_value');
-
- // Assert that test variable and value are available inside of containers.
- $this->cmd('ahoy cli \'echo $MY_CUSTOM_VAR | grep my_custom_var_value\'', 'my_custom_var_value');
+ $this->assertFileContainsString('.env', 'MY_CUSTOM_VAR', '.env contains test values');
+ $this->assertFileContainsString('.env', 'my_custom_var_value', '.env contains test values');
+ $this->cmd('ahoy cli "printenv | grep MY_CUSTOM_VAR"', 'my_custom_var_value', 'Assert that test variable and values are available inside of containers.');
+ $this->cmd('ahoy cli \'echo $MY_CUSTOM_VAR | grep my_custom_var_value\'', 'my_custom_var_value', 'Assert that test variable and values are available inside of containers.');
// Restore file, apply changes and assert that original behaviour has been
// restored.
@@ -60,8 +49,8 @@ protected function stepEnvChanges(): void {
$this->cmd('ahoy up cli');
$this->syncToContainer();
- $this->assertFileNotContainsString('MY_CUSTOM_VAR', '.env');
- $this->assertFileNotContainsString('my_custom_var_value', '.env');
+ $this->assertFileNotContainsString('.env', 'MY_CUSTOM_VAR');
+ $this->assertFileNotContainsString('.env', 'my_custom_var_value');
$this->cmdFail('ahoy cli "printenv | grep -q MY_CUSTOM_VAR"');
$this->cmdFail('ahoy cli \'echo $MY_CUSTOM_VAR | grep my_custom_var_value\'', '! my_custom_var_value');
@@ -71,26 +60,25 @@ protected function stepEnvChanges(): void {
protected function stepTimezone(): void {
$this->logStepStart();
- // Assert that .env contains a default value.
- // Note that AEDT changes to AEST during winter.
- $this->assertFileContainsString('TZ=UTC', '.env');
- $this->cmd('docker compose exec -T cli date', 'UTC');
- $this->cmd('docker compose exec -T php date', 'UTC');
- $this->cmd('docker compose exec -T nginx date', 'UTC');
- $this->cmd('docker compose exec -T database date', 'UTC');
+ $this->logSubstep('Assert default timezone values.');
+ $this->assertFileContainsString('.env', 'TZ=UTC', '.env contains a default value.');
+ $this->cmd('docker compose exec -T cli date', 'UTC', 'Date is in default timezone inside CLI container by default');
+ $this->cmd('docker compose exec -T php date', 'UTC', 'Date is in default timezone inside PHP container by default');
+ $this->cmd('docker compose exec -T nginx date', 'UTC', 'Date is in default timezone inside Nginx container by default');
+ $this->cmd('docker compose exec -T database date', 'UTC', 'Date is in default timezone inside Database container by default');
- // Add variable to the .env file and apply the change to container.
+ $this->logSubstep('Add variable to the .env file and apply the change to container.');
$this->addVarToFile('.env', 'TZ', '"Australia/Perth"');
$this->syncToContainer();
$this->cmd('ahoy up');
- $this->cmd('docker compose exec -T cli date', 'AWST');
- $this->cmd('docker compose exec -T php date', 'AWST');
- $this->cmd('docker compose exec -T nginx date', 'AWST');
- $this->cmd('docker compose exec -T database date', 'AWST');
+ $this->logSubstep('Assert custom timezone values.');
+ $this->cmd('docker compose exec -T cli date', 'AWST', 'Date is in custom timezone inside CLI container');
+ $this->cmd('docker compose exec -T php date', 'AWST', 'Date is in custom timezone inside PHP container');
+ $this->cmd('docker compose exec -T nginx date', 'AWST', 'Date is in custom timezone inside Nginx container');
+ $this->cmd('docker compose exec -T database date', 'AWST', 'Date is in custom timezone inside Database container');
- // Restore file, apply changes and assert that original behaviour has been
- // restored.
+ $this->logSubstep('Restore file, apply changes and assert that original behaviour has been restored.');
$this->restoreFile('.env');
$this->syncToContainer();
$this->cmd('ahoy up');
@@ -214,55 +202,4 @@ protected function stepAhoyResetHard(string $webroot = 'web'): void {
$this->logStepFinish();
}
- protected function addVarToFile(string $file, string $var, string $value): void {
- // Backup original file first.
- $this->backupFile($file);
- $content = File::read($file);
- $content .= sprintf('%s%s=%s%s', PHP_EOL, $var, $value, PHP_EOL);
- File::dump($file, $content);
- }
-
- protected function backupFile(string $file): void {
- $backup_dir = '/tmp/bkp';
- if (!is_dir($backup_dir)) {
- mkdir($backup_dir, 0755, TRUE);
- }
- File::copy($file, $backup_dir . '/' . basename($file));
- }
-
- protected function restoreFile(string $file): void {
- $backup_file = '/tmp/bkp/' . basename($file);
- if (file_exists($backup_file)) {
- File::copy($backup_file, $file);
- }
- }
-
- protected function createDevelopmentSettings(string $webroot = 'web'): void {
- File::copy($webroot . '/sites/default/example.settings.local.php', $webroot . '/sites/default/settings.local.php');
- // Assert manually created local settings file exists.
- $this->assertFileExists($webroot . '/sites/default/settings.local.php');
-
- File::copy($webroot . '/sites/default/example.services.local.yml', $webroot . '/sites/default/services.local.yml');
- // Assert manually created local services file exists.
- $this->assertFileExists($webroot . '/sites/default/services.local.yml');
- }
-
- protected function removeDevelopmentSettings(string $webroot = 'web'): void {
- File::remove([
- $webroot . '/sites/default/settings.local.php',
- $webroot . '/sites/default/services.local.yml',
- ]);
- $this->assertFileDoesNotExist($webroot . '/sites/default/settings.local.php');
- $this->assertFileDoesNotExist($webroot . '/sites/default/services.local.yml');
- }
-
- protected function assertFilesPresent(string $webroot): void {
- // Use existing method from base class with correct signature.
- $this->assertCommonFilesPresent($webroot);
- }
-
- protected function assertGitRepo(): void {
- $this->assertDirectoryExists('.git');
- }
-
}
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepFrontendTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepFrontendTrait.php
index 84c987abc..326ec7dc2 100644
--- a/.vortex/tests/phpunit/Traits/Steps/StepFrontendTrait.php
+++ b/.vortex/tests/phpunit/Traits/Steps/StepFrontendTrait.php
@@ -5,15 +5,12 @@
namespace DrevOps\Vortex\Tests\Traits\Steps;
use AlexSkrypnyk\File\File;
-use DrevOps\Vortex\Tests\Traits\LoggerTrait;
/**
* Provides frontend development testing steps.
*/
trait StepFrontendTrait {
- use LoggerTrait;
-
protected function stepAhoyFei(string $webroot = 'web'): void {
$this->logStepStart();
@@ -40,7 +37,7 @@ protected function stepAhoyFe(string $webroot = 'web'): void {
$variables_file = $webroot . '/themes/custom/star_wars/scss/_variables.scss';
$minified_file = $webroot . '/themes/custom/star_wars/build/css/star_wars.min.css';
- $this->assertFileNotContainsString($test_color1, $webroot . '/themes/custom/star_wars/build/css/star_wars.min.css');
+ $this->assertFileNotContainsString($minified_file, $test_color1);
$original_content = File::read($variables_file);
$new_content = $original_content . "\n\$color-tester: {$test_color1};\n\$color-primary: \$color-tester;\n";
@@ -50,13 +47,11 @@ protected function stepAhoyFe(string $webroot = 'web'): void {
$this->syncToContainer();
$this->cmd('ahoy fe');
$this->syncToHost();
- // Assets compiled for production are minified (no spaces between
- // properties and their values).
- $this->assertFileContainsString('background:' . $test_color1, $minified_file);
+ $this->assertFileContainsString($minified_file, 'background:' . $test_color1, 'Assets compiled for production are minified (no spaces between properties and their values)');
$this->logSubstep('Build FE assets for development');
- $this->assertFileNotContainsString($test_color2, $minified_file);
+ $this->assertFileNotContainsString($minified_file, $test_color2);
$dev_content = $new_content . "\n\$color-please: {$test_color2};\n\$color-primary: \$color-please;\n";
File::remove($variables_file);
@@ -65,9 +60,7 @@ protected function stepAhoyFe(string $webroot = 'web'): void {
$this->syncToContainer();
$this->cmd('ahoy fed');
$this->syncToHost();
- // Note that assets compiled for development are not minified (contains
- // spaces between properties and their values).
- $this->assertFileContainsString('background: ' . $test_color2, $minified_file);
+ $this->assertFileContainsString($minified_file, 'background: ' . $test_color2, 'Assets compiled for development are not minified (contains spaces between properties and their values)');
$this->logStepFinish();
}
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepLintTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepLintTrait.php
new file mode 100644
index 000000000..ef3740cbf
--- /dev/null
+++ b/.vortex/tests/phpunit/Traits/Steps/StepLintTrait.php
@@ -0,0 +1,91 @@
+logStepStart();
+
+ $this->logSubstep('Assert that lint works');
+ $this->cmd('ahoy lint', tio: 120, ito: 90);
+
+ $this->stepAhoyLintBe($webroot);
+ $this->stepAhoyLintFe($webroot);
+ $this->stepAhoyLintTest();
+
+ $this->logStepFinish();
+ }
+
+ protected function stepAhoyLintBe(string $webroot = 'web'): void {
+ $this->logStepStart();
+
+ $this->logSubstep('Assert that BE lint failure works');
+ File::dump($webroot . '/modules/custom/sw_base/sw_base.module', File::read($webroot . '/modules/custom/sw_base/sw_base.module') . '$a=1;');
+ $this->syncToContainer();
+ $this->cmdFail('ahoy lint-be', tio: 120, ito: 90);
+
+ $this->logSubstep('Assert that BE lint tool disabling works');
+ // Replace with some valid XML element to avoid XML parsing errors.
+ File::replaceContentInFile('phpcs.xml', '' . $webroot . '/modules/custom', 'somefile');
+ $this->syncToContainer();
+ $this->cmd('ahoy lint-be', tio: 120, ito: 90);
+
+ // @todo Add restoring of the file.
+ $this->logStepFinish();
+ }
+
+ protected function stepAhoyLintFe(string $webroot = 'web'): void {
+ $this->logStepStart();
+
+ $this->logSubstep('Assert that FE lint failure works for npm lint');
+ File::dump($webroot . '/themes/custom/star_wars/scss/components/_test.scss', '.abc{margin: 0px;}');
+ $this->syncToContainer();
+ $this->cmdFail('ahoy lint-fe', tio: 120, ito: 90);
+ File::remove($webroot . '/themes/custom/star_wars/scss/components/_test.scss');
+ $this->cmd('ahoy cli rm -f ' . $webroot . '/themes/custom/star_wars/scss/components/_test.scss');
+ $this->syncToContainer();
+
+ $this->logSubstep('Assert that FE lint failure works for Twig CS Fixer');
+ File::dump($webroot . '/modules/custom/sw_base/templates/block/test1.twig', "{{ set a='a' }}");
+ File::dump($webroot . '/themes/custom/star_wars/templates/block/test2.twig', "{{ set b='b' }}");
+ $this->syncToContainer();
+
+ $this->cmdFail('ahoy lint-fe', tio: 120, ito: 90);
+
+ File::remove([
+ $webroot . '/modules/custom/sw_base/templates/block/test1.twig',
+ $webroot . '/themes/custom/star_wars/templates/block/test2.twig',
+ ]);
+ $this->cmd('ahoy cli rm -f ' . $webroot . '/modules/custom/sw_base/templates/block/test1.twig');
+ $this->cmd('ahoy cli rm -f ' . $webroot . '/themes/custom/star_wars/templates/block/test2.twig');
+ $this->syncToContainer();
+
+ $this->logStepFinish();
+ }
+
+ protected function stepAhoyLintTest(): void {
+ $this->logStepStart();
+
+ $this->logSubstep('Assert that Test lint works for Gherkin Lint');
+ $this->cmd('ahoy lint-tests');
+
+ $this->logSubstep('Assert that Test lint failure works for Gherkin Lint');
+ File::dump('tests/behat/features/test.feature', 'Feature:');
+ $this->syncToContainer();
+ $this->cmdFail('ahoy lint-tests');
+ File::remove('tests/behat/features/test.feature');
+ $this->cmd('ahoy cli rm -f tests/behat/features/test.feature');
+ $this->syncToContainer();
+
+ $this->logStepFinish();
+ }
+
+}
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepPrepareSutTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepPrepareSutTrait.php
index 5380823d8..464ecea60 100644
--- a/.vortex/tests/phpunit/Traits/Steps/StepPrepareSutTrait.php
+++ b/.vortex/tests/phpunit/Traits/Steps/StepPrepareSutTrait.php
@@ -5,16 +5,12 @@
namespace DrevOps\Vortex\Tests\Traits\Steps;
use AlexSkrypnyk\File\File;
-use DrevOps\Vortex\Tests\Traits\LoggerTrait;
/**
* Provides system under test preparation step.
*/
trait StepPrepareSutTrait {
- use LoggerTrait;
- use StepDownloadDbTrait;
-
protected function stepPrepareSut(): void {
$this->logStepStart();
@@ -43,11 +39,16 @@ protected function runInstaller(array $arguments = []): void {
chdir(static::locationsRoot());
if (!is_dir('.vortex/installer/vendor')) {
- $this->log('Installing dependencies of the Vortex installer');
+ $this->logNote('Installing dependencies of the Vortex installer');
$this->cmd('composer --working-dir=.vortex/installer install');
}
- $this->cmd('php .vortex/installer/installer.php --no-interaction ' . static::locationsSut(), arg: $arguments, env: [
+ $arguments = array_merge([
+ '--no-interaction',
+ static::locationsSut(),
+ ], $arguments);
+
+ $this->cmd('php .vortex/installer/installer.php', arg: $arguments, env: [
// Force the installer script to be downloaded from the local repo for
// testing.
'VORTEX_INSTALLER_TEMPLATE_REPO' => static::locationsRoot(),
@@ -56,12 +57,10 @@ protected function runInstaller(array $arguments = []): void {
// to set the CURL DB to test DB.
//
// Override demo database with test demo database. This is required to
- // use
- // test assertions ("star wars") with demo database.
+ // use test assertions ("star wars") with demo database.
//
// Installer will load environment variable and it will take precedence
- // over
- // the value in .env file.
+ // over the value in .env file.
'VORTEX_DB_DOWNLOAD_URL' => static::VORTEX_INSTALLER_DEMO_DB_TEST,
// Use unique installer temporary directory for each run. This is where
// the installer script downloads the Vortex codebase for processing.
@@ -90,9 +89,9 @@ protected function adjustCodebaseForUnmountedVolumes(): void {
if (File::exists('docker-compose.yml')) {
$this->logSubstep('Fixing host dependencies in docker-compose.yml');
File::removeLine('docker-compose.yml', '###');
- $this->assertFileNotContainsString('###', 'docker-compose.yml', 'Lines with ### should be removed from docker-compose.yml');
+ $this->assertFileNotContainsString('docker-compose.yml', '###', 'Lines with ### should be removed from docker-compose.yml');
File::replaceContentInFile('docker-compose.yml', '##', '');
- $this->assertFileNotContainsString('##', 'docker-compose.yml', 'Lines with ## should be removed from docker-compose.yml');
+ $this->assertFileNotContainsString('docker-compose.yml', '##', 'Lines with ## should be removed from docker-compose.yml');
}
if (file_exists('.ahoy.yml')) {
@@ -104,8 +103,8 @@ protected function adjustCodebaseForUnmountedVolumes(): void {
$this->logSubstep('Pre-processing .ahoy.yml to copy database file to container');
$this->assertFileContainsString(
- 'ahoy cli ./scripts/vortex/provision.sh',
'.ahoy.yml',
+ 'ahoy cli ./scripts/vortex/provision.sh',
'Initial Ahoy command to provision the container should exist in .ahoy.yml'
);
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepServicesTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepServicesTrait.php
index 7e4b3ba05..3f011e2ad 100644
--- a/.vortex/tests/phpunit/Traits/Steps/StepServicesTrait.php
+++ b/.vortex/tests/phpunit/Traits/Steps/StepServicesTrait.php
@@ -4,15 +4,11 @@
namespace DrevOps\Vortex\Tests\Traits\Steps;
-use DrevOps\Vortex\Tests\Traits\LoggerTrait;
-
/**
* Provides service testing steps (Solr, Redis).
*/
trait StepServicesTrait {
- use LoggerTrait;
-
protected function stepSolr(): void {
$this->logStepStart();
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepTestBddAllTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepTestBddAllTrait.php
deleted file mode 100644
index b7c3528f8..000000000
--- a/.vortex/tests/phpunit/Traits/Steps/StepTestBddAllTrait.php
+++ /dev/null
@@ -1,21 +0,0 @@
-logStepStart();
-
- // BDD all tests implementation can be added here.
- $this->log('BDD all tests step completed');
-
- $this->logStepFinish();
- }
-
-}
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepTestBddTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepTestBddTrait.php
deleted file mode 100644
index ca6ab001b..000000000
--- a/.vortex/tests/phpunit/Traits/Steps/StepTestBddTrait.php
+++ /dev/null
@@ -1,52 +0,0 @@
-logStepStart();
-
- $this->stepWarmCaches();
-
- $this->logSubstep('Running all BDD tests');
- $process = $this->processRun('ahoy test-bdd');
-
- if (!$process->isSuccessful()) {
- $this->logSubstep('Re-running all BDD tests after random failure');
- $this->cmd('ahoy test-bdd');
- }
-
- $this->syncToHost();
-
- $this->logSubstep('Checking that BDD tests have created screenshots and test results');
- $this->assertDirectoryContainsString('html', '.logs/screenshots', message: 'Screenshots directory should not be empty after BDD tests');
- $this->assertFileExists('.logs/test_results/behat/default.xml', 'Behat test results XML file should exist');
-
- $this->logSubstep('Cleaning up after the test');
- File::remove(['.logs/screenshots', '.logs/test_results/behat']);
- $this->cmd('ahoy cli rm -rf /app/.logs/screenshots/*');
- $this->cmd('ahoy cli rm -rf /app/.logs/test_results/*');
-
- $this->logStepFinish();
- }
-
- protected function stepWarmCaches(): void {
- $this->logSubstep('Warming up caches');
- $this->cmd('ahoy drush cr');
- $this->cmd('ahoy cli curl -- -sSL -o /dev/null -w "%{http_code}" http://nginx:8080 | grep -q 200');
- }
-
-}
diff --git a/.vortex/tests/phpunit/Traits/Steps/StepTestingTrait.php b/.vortex/tests/phpunit/Traits/Steps/StepTestTrait.php
similarity index 60%
rename from .vortex/tests/phpunit/Traits/Steps/StepTestingTrait.php
rename to .vortex/tests/phpunit/Traits/Steps/StepTestTrait.php
index 48781a40f..2b2068130 100644
--- a/.vortex/tests/phpunit/Traits/Steps/StepTestingTrait.php
+++ b/.vortex/tests/phpunit/Traits/Steps/StepTestTrait.php
@@ -5,91 +5,11 @@
namespace DrevOps\Vortex\Tests\Traits\Steps;
use AlexSkrypnyk\File\File;
-use DrevOps\Vortex\Tests\Traits\LoggerTrait;
/**
* Provides testing operation steps (lint, test).
*/
-trait StepTestingTrait {
-
- use LoggerTrait;
-
- protected function stepAhoyLint(string $webroot = 'web'): void {
- $this->logStepStart();
-
- $this->logSubstep('Assert that lint works');
- $this->cmd('ahoy lint', tio: 120, ito: 90);
-
- $this->stepAhoyLintBe($webroot);
- $this->stepAhoyLintFe($webroot);
- $this->stepAhoyLintTest();
-
- $this->logStepFinish();
- }
-
- protected function stepAhoyLintBe(string $webroot = 'web'): void {
- $this->logStepStart();
-
- $this->logSubstep('Assert that BE lint failure works');
- File::dump($webroot . '/modules/custom/sw_base/sw_base.module', File::read($webroot . '/modules/custom/sw_base/sw_base.module') . '$a=1;');
- $this->syncToContainer();
- $this->cmdFail('ahoy lint-be', tio: 120, ito: 90);
-
- $this->logSubstep('Assert that BE lint tool disabling works');
- // Replace with some valid XML element to avoid XML parsing errors.
- File::replaceContentInFile('phpcs.xml', '' . $webroot . '/modules/custom', 'somefile');
- $this->syncToContainer();
- $this->cmd('ahoy lint-be', tio: 120, ito: 90);
-
- // @todo Add restoring of the file.
- $this->logStepFinish();
- }
-
- protected function stepAhoyLintFe(string $webroot = 'web'): void {
- $this->logStepStart();
-
- $this->logSubstep('Assert that FE lint failure works for npm lint');
- File::dump($webroot . '/themes/custom/star_wars/scss/components/_test.scss', '.abc{margin: 0px;}');
- $this->syncToContainer();
- $this->cmdFail('ahoy lint-fe', tio: 120, ito: 90);
- File::remove($webroot . '/themes/custom/star_wars/scss/components/_test.scss');
- $this->cmd('ahoy cli rm -f ' . $webroot . '/themes/custom/star_wars/scss/components/_test.scss');
- $this->syncToContainer();
-
- $this->logSubstep('Assert that FE lint failure works for Twig CS Fixer');
- File::dump($webroot . '/modules/custom/sw_base/templates/block/test1.twig', "{{ set a='a' }}");
- File::dump($webroot . '/themes/custom/star_wars/templates/block/test2.twig', "{{ set b='b' }}");
- $this->syncToContainer();
-
- $this->cmdFail('ahoy lint-fe', tio: 120, ito: 90);
-
- File::remove([
- $webroot . '/modules/custom/sw_base/templates/block/test1.twig',
- $webroot . '/themes/custom/star_wars/templates/block/test2.twig',
- ]);
- $this->cmd('ahoy cli rm -f ' . $webroot . '/modules/custom/sw_base/templates/block/test1.twig');
- $this->cmd('ahoy cli rm -f ' . $webroot . '/themes/custom/star_wars/templates/block/test2.twig');
- $this->syncToContainer();
-
- $this->logStepFinish();
- }
-
- protected function stepAhoyLintTest(): void {
- $this->logStepStart();
-
- $this->logSubstep('Assert that Test lint works for Gherkin Lint');
- $this->cmd('ahoy lint-tests');
-
- $this->logSubstep('Assert that Test lint failure works for Gherkin Lint');
- File::dump('tests/behat/features/test.feature', 'Feature:');
- $this->syncToContainer();
- $this->cmdFail('ahoy lint-tests');
- File::remove('tests/behat/features/test.feature');
- $this->cmd('ahoy cli rm -f tests/behat/features/test.feature');
- $this->syncToContainer();
-
- $this->logStepFinish();
- }
+trait StepTestTrait {
protected function stepAhoyTest(string $webroot = 'web', bool $is_fast = FALSE): void {
$this->logStepStart();
@@ -189,23 +109,25 @@ protected function stepAhoyTestFunctional(string $webroot = 'web'): void {
protected function stepAhoyTestBddFast(string $webroot = 'web'): void {
$this->logStepStart();
- // Sometimes, tests fail for random reasons. A workaround is to run BDD
- // tests to "cache" the environment and then run the tests again.
- $this->cmd('ahoy test-bdd || true');
+ $this->stepWarmCaches();
$this->logSubstep('Run all BDD tests');
- $this->cmd('ahoy test-bdd');
+ $process = $this->processRun('ahoy test-bdd');
+
+ if (!$process->isSuccessful()) {
+ $this->logSubstep('Re-run all BDD tests after random failure');
+ $this->cmd('ahoy test-bdd');
+ }
$this->syncToHost();
- $this->assertDirectoryExists('.logs/screenshots');
- File::remove('.logs/screenshots');
- $this->cmd('ahoy cli rm -rf /app/.logs/screenshots/*');
+ $this->logSubstep('Check that BDD tests have created screenshots and test results');
+ $this->assertDirectoryContainsString('.logs/screenshots', 'html', message: 'Screenshots directory should not be empty after BDD tests');
+ $this->assertFileExists('.logs/test_results/behat/default.xml', 'Behat test results XML file should exist');
- $this->assertDirectoryExists('.logs/test_results');
- $this->assertFileExists('.logs/test_results/behat/default.xml');
-
- File::remove('.logs/test_results');
+ $this->logSubstep('Clean up after the test');
+ File::remove(['.logs/screenshots', '.logs/test_results/behat']);
+ $this->cmd('ahoy cli rm -rf /app/.logs/screenshots/*');
$this->cmd('ahoy cli rm -rf /app/.logs/test_results/*');
$this->logStepFinish();
@@ -226,10 +148,10 @@ protected function stepAhoyTestBdd(string $webroot = 'web'): void {
$this->logSubstep('Assert that screenshots and test results are created');
$this->assertFileExists('.logs/screenshots/behat-test-screenshot.html');
- $this->assertFileContainsString('Current URL: http://nginx:8080/', '.logs/screenshots/behat-test-screenshot.html');
- $this->assertFileContainsString('Feature: Behat configuration', '.logs/screenshots/behat-test-screenshot.html');
- $this->assertFileContainsString('Step: save screenshot with name', '.logs/screenshots/behat-test-screenshot.html');
- $this->assertFileContainsString('Datetime:', '.logs/screenshots/behat-test-screenshot.html');
+ $this->assertFileContainsString('.logs/screenshots/behat-test-screenshot.html', 'Current URL: http://nginx:8080/');
+ $this->assertFileContainsString('.logs/screenshots/behat-test-screenshot.html', 'Feature: Behat configuration');
+ $this->assertFileContainsString('.logs/screenshots/behat-test-screenshot.html', 'Step: save screenshot with name');
+ $this->assertFileContainsString('.logs/screenshots/behat-test-screenshot.html', 'Datetime:');
File::remove('.logs/screenshots');
$this->cmd('ahoy cli rm -rf /app/.logs/screenshots/*');
@@ -276,12 +198,4 @@ protected function stepAhoyTestBdd(string $webroot = 'web'): void {
$this->logStepFinish();
}
- protected function trimFile(string $file): void {
- $content = File::read($file);
- $lines = explode("\n", $content);
- // Remove last line.
- array_pop($lines);
- File::dump($file, implode("\n", $lines));
- }
-
}