Fix CI shell safety, widen Symfony constraints, add Behat 4 step attributes

- 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) <noreply@anthropic.com>
This commit is contained in:
Kamil Kokot
2026-06-12 17:03:13 +02:00
parent e4ce183e6f
commit c0d7a8391c
5 changed files with 59 additions and 8 deletions

3
.github/workflows/lock-behat-version.sh vendored Executable file
View File

@@ -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

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/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 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
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-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

View File

@@ -32,7 +32,7 @@ jobs:
symfony-version: '8.1.*' symfony-version: '8.1.*'
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
@@ -43,7 +43,7 @@ jobs:
tools: composer:v2 tools: composer:v2
- name: Validate composer.json - name: Validate composer.json
run: composer validate --no-check-lock run: composer validate --strict
- name: Lock Symfony version - name: Lock Symfony version
run: VERSION=${{ matrix.symfony-version }} .github/workflows/lock-symfony-version.sh run: VERSION=${{ matrix.symfony-version }} .github/workflows/lock-symfony-version.sh
@@ -51,7 +51,7 @@ jobs:
- name: Require behat 4.x for Symfony 8+ - name: Require behat 4.x for Symfony 8+
if: startsWith(matrix.symfony-version, '8.') if: startsWith(matrix.symfony-version, '8.')
run: | 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 minimum-stability dev
composer config prefer-stable true composer config prefer-stable true

View File

@@ -24,13 +24,13 @@
"php": "^8.3", "php": "^8.3",
"behat/behat": "^3.31", "behat/behat": "^3.31",
"behat/mink": "^1.5", "behat/mink": "^1.5",
"symfony/config": "^7.4" "symfony/config": "^7.4 || ^8.0"
}, },
"require-dev": { "require-dev": {
"behat/mink-browserkit-driver": "^2.0", "behat/mink-browserkit-driver": "^2.0",
"phpspec/phpspec": "^8.0", "phpspec/phpspec": "^8.0",
"symfony/browser-kit": "^7.4", "symfony/browser-kit": "^7.4 || ^8.0",
"symfony/http-client": "^7.4" "symfony/http-client": "^7.4 || ^8.0"
}, },
"replace": { "replace": {
"behat/mink-extension": "self.version" "behat/mink-extension": "self.version"

View File

@@ -30,6 +30,8 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* @Given /^(?:|I )am on (?:|the )homepage$/ * @Given /^(?:|I )am on (?:|the )homepage$/
* @When /^(?:|I )go to (?:|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() public function iAmOnHomepage()
{ {
$this->visitPath('/'); $this->visitPath('/');
@@ -44,6 +46,8 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* @Given /^(?:|I )am on "(?P<page>[^"]+)"$/ * @Given /^(?:|I )am on "(?P<page>[^"]+)"$/
* @When /^(?:|I )go to "(?P<page>[^"]+)"$/ * @When /^(?:|I )go to "(?P<page>[^"]+)"$/
*/ */
#[\Behat\Step\Given('/^(?:|I )am on "(?P<page>[^"]+)"$/')]
#[\Behat\Step\When('/^(?:|I )go to "(?P<page>[^"]+)"$/')]
public function visit($page) public function visit($page)
{ {
$this->visitPath($page); $this->visitPath($page);
@@ -56,6 +60,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )reload the page$/ * @When /^(?:|I )reload the page$/
*/ */
#[\Behat\Step\When('/^(?:|I )reload the page$/')]
public function reload() public function reload()
{ {
$this->getSession()->reload(); $this->getSession()->reload();
@@ -67,6 +72,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )move backward one page$/ * @When /^(?:|I )move backward one page$/
*/ */
#[\Behat\Step\When('/^(?:|I )move backward one page$/')]
public function back() public function back()
{ {
$this->getSession()->back(); $this->getSession()->back();
@@ -78,6 +84,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )move forward one page$/ * @When /^(?:|I )move forward one page$/
*/ */
#[\Behat\Step\When('/^(?:|I )move forward one page$/')]
public function forward() public function forward()
{ {
$this->getSession()->forward(); $this->getSession()->forward();
@@ -90,6 +97,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/ * @When /^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\When('/^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/')]
public function pressButton($button) public function pressButton($button)
{ {
$button = $this->fixStepArgument($button); $button = $this->fixStepArgument($button);
@@ -103,6 +111,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/ * @When /^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\When('/^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/')]
public function clickLink($link) public function clickLink($link)
{ {
$link = $this->fixStepArgument($link); $link = $this->fixStepArgument($link);
@@ -118,6 +127,9 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* @When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with:$/ * @When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with:$/
* @When /^(?:|I )fill in "(?P<value>(?:[^"]|\\")*)" for "(?P<field>(?:[^"]|\\")*)"$/ * @When /^(?:|I )fill in "(?P<value>(?:[^"]|\\")*)" for "(?P<field>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\When('/^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)"$/')]
#[\Behat\Step\When('/^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with:$/')]
#[\Behat\Step\When('/^(?:|I )fill in "(?P<value>(?:[^"]|\\")*)" for "(?P<field>(?:[^"]|\\")*)"$/')]
public function fillField($field, $value) public function fillField($field, $value)
{ {
$field = $this->fixStepArgument($field); $field = $this->fixStepArgument($field);
@@ -136,6 +148,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )fill in the following:$/ * @When /^(?:|I )fill in the following:$/
*/ */
#[\Behat\Step\When('/^(?:|I )fill in the following:$/')]
public function fillFields(TableNode $fields) public function fillFields(TableNode $fields)
{ {
foreach ($fields->getRowsHash() as $field => $value) { foreach ($fields->getRowsHash() as $field => $value) {
@@ -150,6 +163,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/ * @When /^(?:|I )select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\When('/^(?:|I )select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/')]
public function selectOption($select, $option) public function selectOption($select, $option)
{ {
$select = $this->fixStepArgument($select); $select = $this->fixStepArgument($select);
@@ -164,6 +178,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )additionally select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/ * @When /^(?:|I )additionally select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\When('/^(?:|I )additionally select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/')]
public function additionallySelectOption($select, $option) public function additionallySelectOption($select, $option)
{ {
$select = $this->fixStepArgument($select); $select = $this->fixStepArgument($select);
@@ -178,6 +193,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )check "(?P<option>(?:[^"]|\\")*)"$/ * @When /^(?:|I )check "(?P<option>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\When('/^(?:|I )check "(?P<option>(?:[^"]|\\")*)"$/')]
public function checkOption($option) public function checkOption($option)
{ {
$option = $this->fixStepArgument($option); $option = $this->fixStepArgument($option);
@@ -191,6 +207,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )uncheck "(?P<option>(?:[^"]|\\")*)"$/ * @When /^(?:|I )uncheck "(?P<option>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\When('/^(?:|I )uncheck "(?P<option>(?:[^"]|\\")*)"$/')]
public function uncheckOption($option) public function uncheckOption($option)
{ {
$option = $this->fixStepArgument($option); $option = $this->fixStepArgument($option);
@@ -204,6 +221,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @When /^(?:|I )attach the file "(?P<path>[^"]*)" to "(?P<field>(?:[^"]|\\")*)"$/ * @When /^(?:|I )attach the file "(?P<path>[^"]*)" to "(?P<field>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\When('/^(?:|I )attach the file "(?P<path>[^"]*)" to "(?P<field>(?:[^"]|\\")*)"$/')]
public function attachFileToField($field, $path) public function attachFileToField($field, $path)
{ {
$field = $this->fixStepArgument($field); $field = $this->fixStepArgument($field);
@@ -226,6 +244,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should be on "(?P<page>[^"]+)"$/ * @Then /^(?:|I )should be on "(?P<page>[^"]+)"$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should be on "(?P<page>[^"]+)"$/')]
public function assertPageAddress($page) public function assertPageAddress($page)
{ {
$this->assertSession()->addressEquals($this->locatePath($page)); $this->assertSession()->addressEquals($this->locatePath($page));
@@ -238,6 +257,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should be on (?:|the )homepage$/ * @Then /^(?:|I )should be on (?:|the )homepage$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should be on (?:|the )homepage$/')]
public function assertHomepage() public function assertHomepage()
{ {
$this->assertSession()->addressEquals($this->locatePath('/')); $this->assertSession()->addressEquals($this->locatePath('/'));
@@ -251,6 +271,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^the (?i)url(?-i) should match (?P<pattern>"(?:[^"]|\\")*")$/ * @Then /^the (?i)url(?-i) should match (?P<pattern>"(?:[^"]|\\")*")$/
*/ */
#[\Behat\Step\Then('/^the (?i)url(?-i) should match (?P<pattern>"(?:[^"]|\\")*")$/')]
public function assertUrlRegExp($pattern) public function assertUrlRegExp($pattern)
{ {
$this->assertSession()->addressMatches($this->fixStepArgument($pattern)); $this->assertSession()->addressMatches($this->fixStepArgument($pattern));
@@ -263,6 +284,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^the response status code should be (?P<code>\d+)$/ * @Then /^the response status code should be (?P<code>\d+)$/
*/ */
#[\Behat\Step\Then('/^the response status code should be (?P<code>\d+)$/')]
public function assertResponseStatus($code) public function assertResponseStatus($code)
{ {
$this->assertSession()->statusCodeEquals($code); $this->assertSession()->statusCodeEquals($code);
@@ -275,6 +297,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^the response status code should not be (?P<code>\d+)$/ * @Then /^the response status code should not be (?P<code>\d+)$/
*/ */
#[\Behat\Step\Then('/^the response status code should not be (?P<code>\d+)$/')]
public function assertResponseStatusIsNot($code) public function assertResponseStatusIsNot($code)
{ {
$this->assertSession()->statusCodeNotEquals($code); $this->assertSession()->statusCodeNotEquals($code);
@@ -287,6 +310,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)"$/ * @Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should see "(?P<text>(?:[^"]|\\")*)"$/')]
public function assertPageContainsText($text) public function assertPageContainsText($text)
{ {
$this->assertSession()->pageTextContains($this->fixStepArgument($text)); $this->assertSession()->pageTextContains($this->fixStepArgument($text));
@@ -299,6 +323,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)"$/ * @Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)"$/')]
public function assertPageNotContainsText($text) public function assertPageNotContainsText($text)
{ {
$this->assertSession()->pageTextNotContains($this->fixStepArgument($text)); $this->assertSession()->pageTextNotContains($this->fixStepArgument($text));
@@ -311,6 +336,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should see text matching (?P<pattern>"(?:[^"]|\\")*")$/ * @Then /^(?:|I )should see text matching (?P<pattern>"(?:[^"]|\\")*")$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should see text matching (?P<pattern>"(?:[^"]|\\")*")$/')]
public function assertPageMatchesText($pattern) public function assertPageMatchesText($pattern)
{ {
$this->assertSession()->pageTextMatches($this->fixStepArgument($pattern)); $this->assertSession()->pageTextMatches($this->fixStepArgument($pattern));
@@ -323,6 +349,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should not see text matching (?P<pattern>"(?:[^"]|\\")*")$/ * @Then /^(?:|I )should not see text matching (?P<pattern>"(?:[^"]|\\")*")$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should not see text matching (?P<pattern>"(?:[^"]|\\")*")$/')]
public function assertPageNotMatchesText($pattern) public function assertPageNotMatchesText($pattern)
{ {
$this->assertSession()->pageTextNotMatches($this->fixStepArgument($pattern)); $this->assertSession()->pageTextNotMatches($this->fixStepArgument($pattern));
@@ -335,6 +362,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^the response should contain "(?P<text>(?:[^"]|\\")*)"$/ * @Then /^the response should contain "(?P<text>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\Then('/^the response should contain "(?P<text>(?:[^"]|\\")*)"$/')]
public function assertResponseContains($text) public function assertResponseContains($text)
{ {
$this->assertSession()->responseContains($this->fixStepArgument($text)); $this->assertSession()->responseContains($this->fixStepArgument($text));
@@ -347,6 +375,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^the response should not contain "(?P<text>(?:[^"]|\\")*)"$/ * @Then /^the response should not contain "(?P<text>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\Then('/^the response should not contain "(?P<text>(?:[^"]|\\")*)"$/')]
public function assertResponseNotContains($text) public function assertResponseNotContains($text)
{ {
$this->assertSession()->responseNotContains($this->fixStepArgument($text)); $this->assertSession()->responseNotContains($this->fixStepArgument($text));
@@ -359,6 +388,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/ * @Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/')]
public function assertElementContainsText($element, $text) public function assertElementContainsText($element, $text)
{ {
$this->assertSession()->elementTextContains('css', $element, $this->fixStepArgument($text)); $this->assertSession()->elementTextContains('css', $element, $this->fixStepArgument($text));
@@ -371,6 +401,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/ * @Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/')]
public function assertElementNotContainsText($element, $text) public function assertElementNotContainsText($element, $text)
{ {
$this->assertSession()->elementTextNotContains('css', $element, $this->fixStepArgument($text)); $this->assertSession()->elementTextNotContains('css', $element, $this->fixStepArgument($text));
@@ -383,6 +414,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^the "(?P<element>[^"]*)" element should contain "(?P<value>(?:[^"]|\\")*)"$/ * @Then /^the "(?P<element>[^"]*)" element should contain "(?P<value>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\Then('/^the "(?P<element>[^"]*)" element should contain "(?P<value>(?:[^"]|\\")*)"$/')]
public function assertElementContains($element, $value) public function assertElementContains($element, $value)
{ {
$this->assertSession()->elementContains('css', $element, $this->fixStepArgument($value)); $this->assertSession()->elementContains('css', $element, $this->fixStepArgument($value));
@@ -395,6 +427,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^the "(?P<element>[^"]*)" element should not contain "(?P<value>(?:[^"]|\\")*)"$/ * @Then /^the "(?P<element>[^"]*)" element should not contain "(?P<value>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\Then('/^the "(?P<element>[^"]*)" element should not contain "(?P<value>(?:[^"]|\\")*)"$/')]
public function assertElementNotContains($element, $value) public function assertElementNotContains($element, $value)
{ {
$this->assertSession()->elementNotContains('css', $element, $this->fixStepArgument($value)); $this->assertSession()->elementNotContains('css', $element, $this->fixStepArgument($value));
@@ -407,6 +440,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should see an? "(?P<element>[^"]*)" element$/ * @Then /^(?:|I )should see an? "(?P<element>[^"]*)" element$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should see an? "(?P<element>[^"]*)" element$/')]
public function assertElementOnPage($element) public function assertElementOnPage($element)
{ {
$this->assertSession()->elementExists('css', $element); $this->assertSession()->elementExists('css', $element);
@@ -419,6 +453,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should not see an? "(?P<element>[^"]*)" element$/ * @Then /^(?:|I )should not see an? "(?P<element>[^"]*)" element$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should not see an? "(?P<element>[^"]*)" element$/')]
public function assertElementNotOnPage($element) public function assertElementNotOnPage($element)
{ {
$this->assertSession()->elementNotExists('css', $element); $this->assertSession()->elementNotExists('css', $element);
@@ -431,6 +466,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^the "(?P<field>(?:[^"]|\\")*)" field should contain "(?P<value>(?:[^"]|\\")*)"$/ * @Then /^the "(?P<field>(?:[^"]|\\")*)" field should contain "(?P<value>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\Then('/^the "(?P<field>(?:[^"]|\\")*)" field should contain "(?P<value>(?:[^"]|\\")*)"$/')]
public function assertFieldContains($field, $value) public function assertFieldContains($field, $value)
{ {
$field = $this->fixStepArgument($field); $field = $this->fixStepArgument($field);
@@ -445,6 +481,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^the "(?P<field>(?:[^"]|\\")*)" field should not contain "(?P<value>(?:[^"]|\\")*)"$/ * @Then /^the "(?P<field>(?:[^"]|\\")*)" field should not contain "(?P<value>(?:[^"]|\\")*)"$/
*/ */
#[\Behat\Step\Then('/^the "(?P<field>(?:[^"]|\\")*)" field should not contain "(?P<value>(?:[^"]|\\")*)"$/')]
public function assertFieldNotContains($field, $value) public function assertFieldNotContains($field, $value)
{ {
$field = $this->fixStepArgument($field); $field = $this->fixStepArgument($field);
@@ -459,6 +496,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^(?:|I )should see (?P<num>\d+) "(?P<element>[^"]*)" elements?$/ * @Then /^(?:|I )should see (?P<num>\d+) "(?P<element>[^"]*)" elements?$/
*/ */
#[\Behat\Step\Then('/^(?:|I )should see (?P<num>\d+) "(?P<element>[^"]*)" elements?$/')]
public function assertNumElements($num, $element) public function assertNumElements($num, $element)
{ {
$this->assertSession()->elementsCount('css', $element, intval($num)); $this->assertSession()->elementsCount('css', $element, intval($num));
@@ -473,6 +511,9 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* @Then /^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox is checked$/ * @Then /^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox is checked$/
* @Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" (?:is|should be) checked$/ * @Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" (?:is|should be) checked$/
*/ */
#[\Behat\Step\Then('/^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox should be checked$/')]
#[\Behat\Step\Then('/^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox is checked$/')]
#[\Behat\Step\Then('/^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" (?:is|should be) checked$/')]
public function assertCheckboxChecked($checkbox) public function assertCheckboxChecked($checkbox)
{ {
$this->assertSession()->checkboxChecked($this->fixStepArgument($checkbox)); $this->assertSession()->checkboxChecked($this->fixStepArgument($checkbox));
@@ -489,6 +530,10 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* @Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" should (?:be unchecked|not be checked)$/ * @Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" should (?:be unchecked|not be checked)$/
* @Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" is (?:unchecked|not checked)$/ * @Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" is (?:unchecked|not checked)$/
*/ */
#[\Behat\Step\Then('/^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox should (?:be unchecked|not be checked)$/')]
#[\Behat\Step\Then('/^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox is (?:unchecked|not checked)$/')]
#[\Behat\Step\Then('/^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" should (?:be unchecked|not be checked)$/')]
#[\Behat\Step\Then('/^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" is (?:unchecked|not checked)$/')]
public function assertCheckboxNotChecked($checkbox) public function assertCheckboxNotChecked($checkbox)
{ {
$this->assertSession()->checkboxNotChecked($this->fixStepArgument($checkbox)); $this->assertSession()->checkboxNotChecked($this->fixStepArgument($checkbox));
@@ -501,6 +546,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^print current URL$/ * @Then /^print current URL$/
*/ */
#[\Behat\Step\Then('/^print current URL$/')]
public function printCurrentUrl() public function printCurrentUrl()
{ {
echo $this->getSession()->getCurrentUrl(); echo $this->getSession()->getCurrentUrl();
@@ -513,6 +559,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^print last response$/ * @Then /^print last response$/
*/ */
#[\Behat\Step\Then('/^print last response$/')]
public function printLastResponse() public function printLastResponse()
{ {
echo ( echo (
@@ -528,6 +575,7 @@ class MinkContext extends RawMinkContext implements TranslatableContext
* *
* @Then /^show last response$/ * @Then /^show last response$/
*/ */
#[\Behat\Step\Then('/^show last response$/')]
public function showLastResponse() public function showLastResponse()
{ {
if (null === $this->getMinkParameter('show_cmd')) { if (null === $this->getMinkParameter('show_cmd')) {