Remove inline @var annotations; fix spec session name; fix @var placement

- Replace all local-variable @var annotations with proper type guards:
  - MinkExtension configure closure: build inner array directly
    ($sessions[$driverType] = [$driverType => ...]) to avoid mixed offset access
  - MinkExtension loadSessions: add is_array($session) guard inside foreach
    so PHPStan narrows $session from mixed to array before key() call
  - DriverFactory::buildDriver @param broadened from array<string, mixed>
    to array<mixed> — is_array() only narrows to array<mixed> (key type
    unknown), so array<string, mixed> was unreachable at the call site
  - MinkAwareInitializer: move @var from inside constructor parameter list
    to a proper @param on the method docblock
- SessionsListenerSpec: replace 'goutte' (deleted driver) with
  'browserkit_http' as the example default session name

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kamil Kokot
2026-06-12 18:04:18 +02:00
parent 2947994733
commit 41bac3c5b7
14 changed files with 26 additions and 27 deletions

View File

@@ -15,7 +15,7 @@ class SessionsListenerSpec extends ObjectBehavior
{ {
public function let(Mink $mink, ScenarioTested $event, FeatureNode $feature, ScenarioNode $scenario, Suite $suite) public function let(Mink $mink, ScenarioTested $event, FeatureNode $feature, ScenarioNode $scenario, Suite $suite)
{ {
$this->beConstructedWith($mink, 'goutte', 'selenium2', ['selenium2', 'sahi']); $this->beConstructedWith($mink, 'browserkit_http', 'selenium2', ['selenium2', 'sahi']);
$event->getSuite()->willReturn($suite); $event->getSuite()->willReturn($suite);
$event->getFeature()->willReturn($feature); $event->getFeature()->willReturn($feature);
@@ -38,7 +38,7 @@ class SessionsListenerSpec extends ObjectBehavior
public function it_resets_the_default_session_before_scenarios($event, $mink) public function it_resets_the_default_session_before_scenarios($event, $mink)
{ {
$mink->resetSessions()->shouldBeCalled(); $mink->resetSessions()->shouldBeCalled();
$mink->setDefaultSessionName('goutte')->shouldBeCalled(); $mink->setDefaultSessionName('browserkit_http')->shouldBeCalled();
$this->prepareDefaultMinkSession($event); $this->prepareDefaultMinkSession($event);
} }
@@ -120,7 +120,7 @@ class SessionsListenerSpec extends ObjectBehavior
public function it_fails_when_the_javascript_session_is_used_but_not_defined($event, $mink, $feature, $suite) public function it_fails_when_the_javascript_session_is_used_but_not_defined($event, $mink, $feature, $suite)
{ {
$suite->hasSetting('mink_javascript_session')->willReturn(false); $suite->hasSetting('mink_javascript_session')->willReturn(false);
$this->beConstructedWith($mink, 'goutte', null); $this->beConstructedWith($mink, 'browserkit_http', null);
$feature->getTags()->willReturn(['javascript']); $feature->getTags()->willReturn(['javascript']);
$this->shouldThrow(new ProcessingException('The @javascript tag cannot be used without enabling a javascript session')) $this->shouldThrow(new ProcessingException('The @javascript tag cannot be used without enabling a javascript session'))
@@ -151,7 +151,7 @@ class SessionsListenerSpec extends ObjectBehavior
{ {
$scenario->hasTag('insulated')->willReturn(true); $scenario->hasTag('insulated')->willReturn(true);
$mink->stopSessions()->shouldBeCalled(); $mink->stopSessions()->shouldBeCalled();
$mink->setDefaultSessionName('goutte')->shouldBeCalled(); $mink->setDefaultSessionName('browserkit_http')->shouldBeCalled();
$this->prepareDefaultMinkSession($event); $this->prepareDefaultMinkSession($event);
} }
@@ -160,7 +160,7 @@ class SessionsListenerSpec extends ObjectBehavior
{ {
$feature->hasTag('insulated')->willReturn(true); $feature->hasTag('insulated')->willReturn(true);
$mink->stopSessions()->shouldBeCalled(); $mink->stopSessions()->shouldBeCalled();
$mink->setDefaultSessionName('goutte')->shouldBeCalled(); $mink->setDefaultSessionName('browserkit_http')->shouldBeCalled();
$this->prepareDefaultMinkSession($event); $this->prepareDefaultMinkSession($event);
} }

View File

@@ -23,9 +23,11 @@ use Behat\MinkExtension\Context\MinkAwareContext;
*/ */
class MinkAwareInitializer implements ContextInitializer class MinkAwareInitializer implements ContextInitializer
{ {
/**
* @param array<string, mixed> $parameters
*/
public function __construct( public function __construct(
private readonly Mink $mink, private readonly Mink $mink,
/** @var array<string, mixed> */
private readonly array $parameters, private readonly array $parameters,
) { ) {
} }

View File

@@ -25,7 +25,7 @@ class AppiumFactory extends Selenium2Factory
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {

View File

@@ -41,7 +41,7 @@ class BrowserKitFactory implements DriverFactory
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {

View File

@@ -33,7 +33,7 @@ class BrowserStackFactory extends Selenium2Factory
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {

View File

@@ -25,7 +25,7 @@ interface DriverFactory
public function configure(ArrayNodeDefinition $builder): void; public function configure(ArrayNodeDefinition $builder): void;
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition; public function buildDriver(array $config): Definition;
} }

View File

@@ -39,7 +39,7 @@ class SahiFactory implements DriverFactory
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {

View File

@@ -34,7 +34,7 @@ class SauceLabsFactory extends Selenium2Factory
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {

View File

@@ -39,7 +39,7 @@ class Selenium2Factory implements DriverFactory
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {
@@ -47,9 +47,7 @@ class Selenium2Factory implements DriverFactory
throw new \RuntimeException(sprintf('Install MinkSelenium2Driver in order to use %s driver.', $this->getDriverName())); throw new \RuntimeException(sprintf('Install MinkSelenium2Driver in order to use %s driver.', $this->getDriverName()));
} }
/** @var array<string, mixed> $capabilities */
$capabilities = is_array($config['capabilities']) ? $config['capabilities'] : []; $capabilities = is_array($config['capabilities']) ? $config['capabilities'] : [];
/** @var array<string, mixed> $extraCapabilities */
$extraCapabilities = is_array($capabilities['extra_capabilities']) ? $capabilities['extra_capabilities'] : []; $extraCapabilities = is_array($capabilities['extra_capabilities']) ? $capabilities['extra_capabilities'] : [];
unset($capabilities['extra_capabilities']); unset($capabilities['extra_capabilities']);

View File

@@ -40,7 +40,7 @@ class Selenium4Factory implements DriverFactory
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {

View File

@@ -37,7 +37,7 @@ class SeleniumFactory implements DriverFactory
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {

View File

@@ -34,6 +34,9 @@ class WebdriverClassicFactory implements DriverFactory
->end(); ->end();
} }
/**
* @param array<mixed> $config
*/
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {
if (!class_exists(WebdriverClassicDriver::class)) { if (!class_exists(WebdriverClassicDriver::class)) {

View File

@@ -40,7 +40,7 @@ class ZombieFactory implements DriverFactory
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
public function buildDriver(array $config): Definition public function buildDriver(array $config): Definition
{ {

View File

@@ -124,13 +124,12 @@ class MinkExtension implements ExtensionInterface
if (!array_key_exists($driverType, $v)) { if (!array_key_exists($driverType, $v)) {
continue; continue;
} }
/** @var array<string, array<string, mixed>> $sessions */
$sessions = is_array($v['sessions']) ? $v['sessions'] : []; $sessions = is_array($v['sessions']) ? $v['sessions'] : [];
if (isset($sessions[$driverType])) { if (isset($sessions[$driverType])) {
continue; continue;
} }
$sessions[$driverType][$driverType] = $v[$driverType]; $sessions[$driverType] = [$driverType => $v[$driverType]];
$v['sessions'] = $sessions; $v['sessions'] = $sessions;
unset($v[$driverType]); unset($v[$driverType]);
} }
@@ -223,28 +222,25 @@ class MinkExtension implements ExtensionInterface
} }
/** /**
* @param array<string, mixed> $config * @param array<mixed> $config
*/ */
private function loadSessions(ContainerBuilder $container, array $config): void private function loadSessions(ContainerBuilder $container, array $config): void
{ {
/** @var string|null $defaultSession */
$defaultSession = is_string($config['default_session']) ? $config['default_session'] : null; $defaultSession = is_string($config['default_session']) ? $config['default_session'] : null;
/** @var string|null $javascriptSession */
$javascriptSession = is_string($config['javascript_session']) ? $config['javascript_session'] : null; $javascriptSession = is_string($config['javascript_session']) ? $config['javascript_session'] : null;
/** @var string[] $javascriptSessions */
$javascriptSessions = []; $javascriptSessions = [];
/** @var string[] $nonJavascriptSessions */
$nonJavascriptSessions = []; $nonJavascriptSessions = [];
$minkDefinition = $container->getDefinition(self::MINK_ID); $minkDefinition = $container->getDefinition(self::MINK_ID);
/** @var array<string, array<string, mixed>> $sessions */
$sessions = is_array($config['sessions']) ? $config['sessions'] : []; $sessions = is_array($config['sessions']) ? $config['sessions'] : [];
foreach ($sessions as $name => $session) { foreach ($sessions as $name => $session) {
if (!is_array($session)) {
continue;
}
$driver = (string) key($session); $driver = (string) key($session);
$factory = $this->driverFactories[$driver]; $factory = $this->driverFactories[$driver];
/** @var array<string, mixed> $driverConfig */
$driverConfig = is_array($session[$driver]) ? $session[$driver] : []; $driverConfig = is_array($session[$driver]) ? $session[$driver] : [];
$definition = new Definition('Behat\Mink\Session', [ $definition = new Definition('Behat\Mink\Session', [
$factory->buildDriver($driverConfig), $factory->buildDriver($driverConfig),