From c0d7a8391c5988ce1270c479a6901faa099d9ed9 Mon Sep 17 00:00:00 2001 From: Kamil Kokot Date: Fri, 12 Jun 2026 17:03:13 +0200 Subject: [PATCH] Fix CI shell safety, widen Symfony constraints, add Behat 4 step attributes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - lock-symfony-version.sh: replace cat<<<$(jq) with tmp+mv to avoid file truncation; add .key as $k capture in with_entries per jq safety rules - lock-behat-version.sh: new script mirroring lock-symfony-version.sh, fixes the Behat 4 lock step which was wrongly targeting require-dev instead of require - CI: actions/checkout@v3 → @v4; composer validate --strict; use lock-behat-version.sh in the Behat 4 step - composer.json: widen symfony/config, symfony/browser-kit, symfony/http-client to ^7.4 || ^8.0 so Symfony 8 installs without CI overrides - MinkContext: add #[\Behat\Step\Given/When/Then] attributes alongside existing docblocks so Behat 4 (which ignores docblock annotations) can discover all step definitions Co-Authored-By: Claude Sonnet 4.6 (1M context) --- .github/workflows/lock-behat-version.sh | 3 ++ .github/workflows/lock-symfony-version.sh | 4 +- .github/workflows/test.yaml | 6 +-- composer.json | 6 +-- .../MinkExtension/Context/MinkContext.php | 48 +++++++++++++++++++ 5 files changed, 59 insertions(+), 8 deletions(-) create mode 100755 .github/workflows/lock-behat-version.sh diff --git a/.github/workflows/lock-behat-version.sh b/.github/workflows/lock-behat-version.sh new file mode 100755 index 0000000..15ba49a --- /dev/null +++ b/.github/workflows/lock-behat-version.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +jq --indent 4 --arg version "$VERSION" '.require |= with_entries(.key as $k | if ($k == "behat/behat") then .value = $version else . end)' < composer.json > composer.json.tmp && mv composer.json.tmp composer.json diff --git a/.github/workflows/lock-symfony-version.sh b/.github/workflows/lock-symfony-version.sh index 8184271..08cc742 100755 --- a/.github/workflows/lock-symfony-version.sh +++ b/.github/workflows/lock-symfony-version.sh @@ -1,4 +1,4 @@ #!/bin/bash -cat <<< $(jq --indent 4 --arg version $VERSION '.require |= with_entries(if (.key|test("^symfony/")) then .value=$version else . end)' < composer.json) > composer.json -cat <<< $(jq --indent 4 --arg version $VERSION '."require-dev" |= with_entries(if (.key|test("^symfony/")) then .value=$version else . end)' < composer.json) > composer.json +jq --indent 4 --arg version "$VERSION" '.require |= with_entries(.key as $k | if ($k | test("^symfony/")) then .value = $version else . end)' < composer.json > composer.json.tmp && mv composer.json.tmp composer.json +jq --indent 4 --arg version "$VERSION" '."require-dev" |= with_entries(.key as $k | if ($k | test("^symfony/")) then .value = $version else . end)' < composer.json > composer.json.tmp && mv composer.json.tmp composer.json diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 106d347..f13e247 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -32,7 +32,7 @@ jobs: symfony-version: '8.1.*' steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -43,7 +43,7 @@ jobs: tools: composer:v2 - name: Validate composer.json - run: composer validate --no-check-lock + run: composer validate --strict - name: Lock Symfony version run: VERSION=${{ matrix.symfony-version }} .github/workflows/lock-symfony-version.sh @@ -51,7 +51,7 @@ jobs: - name: Require behat 4.x for Symfony 8+ if: startsWith(matrix.symfony-version, '8.') run: | - cat <<< $(jq --indent 4 '."require-dev"."behat/behat" = "4.x-dev as 3.31.0"' < composer.json) > composer.json + VERSION="4.x-dev as 3.31.0" .github/workflows/lock-behat-version.sh composer config minimum-stability dev composer config prefer-stable true diff --git a/composer.json b/composer.json index 27c00cf..ad78dd2 100644 --- a/composer.json +++ b/composer.json @@ -24,13 +24,13 @@ "php": "^8.3", "behat/behat": "^3.31", "behat/mink": "^1.5", - "symfony/config": "^7.4" + "symfony/config": "^7.4 || ^8.0" }, "require-dev": { "behat/mink-browserkit-driver": "^2.0", "phpspec/phpspec": "^8.0", - "symfony/browser-kit": "^7.4", - "symfony/http-client": "^7.4" + "symfony/browser-kit": "^7.4 || ^8.0", + "symfony/http-client": "^7.4 || ^8.0" }, "replace": { "behat/mink-extension": "self.version" diff --git a/src/Behat/MinkExtension/Context/MinkContext.php b/src/Behat/MinkExtension/Context/MinkContext.php index c6eeb0f..5962c43 100644 --- a/src/Behat/MinkExtension/Context/MinkContext.php +++ b/src/Behat/MinkExtension/Context/MinkContext.php @@ -30,6 +30,8 @@ class MinkContext extends RawMinkContext implements TranslatableContext * @Given /^(?:|I )am on (?:|the )homepage$/ * @When /^(?:|I )go to (?:|the )homepage$/ */ + #[\Behat\Step\Given('/^(?:|I )am on (?:|the )homepage$/')] + #[\Behat\Step\When('/^(?:|I )go to (?:|the )homepage$/')] public function iAmOnHomepage() { $this->visitPath('/'); @@ -44,6 +46,8 @@ class MinkContext extends RawMinkContext implements TranslatableContext * @Given /^(?:|I )am on "(?P[^"]+)"$/ * @When /^(?:|I )go to "(?P[^"]+)"$/ */ + #[\Behat\Step\Given('/^(?:|I )am on "(?P[^"]+)"$/')] + #[\Behat\Step\When('/^(?:|I )go to "(?P[^"]+)"$/')] public function visit($page) { $this->visitPath($page); @@ -56,6 +60,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext * * @When /^(?:|I )reload the page$/ */ + #[\Behat\Step\When('/^(?:|I )reload the page$/')] public function reload() { $this->getSession()->reload(); @@ -67,6 +72,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext * * @When /^(?:|I )move backward one page$/ */ + #[\Behat\Step\When('/^(?:|I )move backward one page$/')] public function back() { $this->getSession()->back(); @@ -78,6 +84,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext * * @When /^(?:|I )move forward one page$/ */ + #[\Behat\Step\When('/^(?:|I )move forward one page$/')] public function forward() { $this->getSession()->forward(); @@ -90,6 +97,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext * * @When /^(?:|I )press "(?P