diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index b9bba79..ab9c55a 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -17,15 +17,15 @@ jobs:
fail-fast: false
matrix:
php-version:
- - '8.1'
- '8.2'
+ - '8.3'
+ - '8.4'
symfony-version:
- - '6.2.*'
- - '6.4.*'
- '7.0.*'
- exclude:
+ - '7.3.*'
+ include:
- php-version: '8.1'
- symfony-version: '7.0.*'
+ symfony-version: '6.4.*'
steps:
- name: Checkout
uses: actions/checkout@v3
diff --git a/.php-version b/.php-version
new file mode 100644
index 0000000..cf02201
--- /dev/null
+++ b/.php-version
@@ -0,0 +1 @@
+8.3
diff --git a/composer.json b/composer.json
index 8c1ccfd..1c8dc48 100644
--- a/composer.json
+++ b/composer.json
@@ -12,9 +12,9 @@
],
"require": {
"php": "^8.1",
- "behat/behat": "^3.6.1",
- "symfony/dependency-injection": "^6.2 || ^7.0",
- "symfony/http-kernel": "^6.2 || ^7.0"
+ "behat/behat": "^3.22",
+ "symfony/dependency-injection": "^6.4 || ^7.0",
+ "symfony/http-kernel": "^6.4 || ^7.0"
},
"require-dev": {
"behat/mink-browserkit-driver": "^2.0",
@@ -24,11 +24,11 @@
"friends-of-behat/page-object-extension": "^0.3.2",
"friends-of-behat/service-container-extension": "^1.1",
"sylius-labs/coding-standard": ">=4.1.1, <=4.2.1",
- "symfony/browser-kit": "^6.2 || ^7.0",
- "symfony/framework-bundle": "^6.2 || ^7.0",
- "symfony/process": "^6.2 || ^7.0",
- "symfony/yaml": "^6.2 || ^7.0",
- "vimeo/psalm": "4.30.0"
+ "symfony/browser-kit": "^6.4 || ^7.0",
+ "symfony/framework-bundle": "^6.4 || ^7.0",
+ "symfony/process": "^6.4 || ^7.0",
+ "symfony/yaml": "^6.4 || ^7.0",
+ "vimeo/psalm": "^6.0"
},
"suggest": {
"behat/mink-browserkit-driver": "^2.0",
diff --git a/psalm.xml b/psalm.xml
index f560e5f..f9a714b 100644
--- a/psalm.xml
+++ b/psalm.xml
@@ -14,24 +14,62 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php b/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php
index 3a9c36f..8196a59 100644
--- a/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php
+++ b/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php
@@ -22,6 +22,7 @@ use Symfony\Component\HttpKernel\KernelInterface;
final class FriendsOfBehatSymfonyExtensionExtension extends Extension implements CompilerPassInterface
{
+ #[\Override]
public function load(array $configs, ContainerBuilder $container): void
{
$this->provideMinkIntegration($container);
@@ -31,6 +32,7 @@ final class FriendsOfBehatSymfonyExtensionExtension extends Extension implements
$container->registerForAutoconfiguration(Context::class)->addTag('fob.context');
}
+ #[\Override]
public function process(ContainerBuilder $container): void
{
$this->provideBrowserKitIntegration($container);
diff --git a/src/Context/Environment/Handler/ContextServiceEnvironmentHandler.php b/src/Context/Environment/Handler/ContextServiceEnvironmentHandler.php
index 77f4309..b67b7ca 100644
--- a/src/Context/Environment/Handler/ContextServiceEnvironmentHandler.php
+++ b/src/Context/Environment/Handler/ContextServiceEnvironmentHandler.php
@@ -51,11 +51,13 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler
$this->contextInitializers[] = $contextInitializer;
}
+ #[\Override]
public function supportsSuite(Suite $suite): bool
{
return $suite->hasSetting('contexts');
}
+ #[\Override]
public function buildEnvironment(Suite $suite): Environment
{
$symfonyContexts = [];
@@ -65,7 +67,6 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler
continue;
}
- /** @var object $service */
$service = $this->getContainer()->get($serviceId);
$symfonyContexts[$serviceId] = get_class($service);
@@ -79,6 +80,7 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler
return new UninitializedSymfonyExtensionEnvironment($suite, $symfonyContexts, $delegatedEnvironment);
}
+ #[\Override]
public function supportsEnvironmentAndSubject(Environment $environment, $testSubject = null): bool
{
return $environment instanceof UninitializedSymfonyExtensionEnvironment;
@@ -87,6 +89,7 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler
/**
* @throws EnvironmentIsolationException
*/
+ #[\Override]
public function isolateEnvironment(Environment $environment, $testSubject = null): Environment
{
$this->assertEnvironmentCanBeIsolated($environment, $testSubject);
@@ -158,7 +161,12 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler
return new GenericSuite($suite->getName(), array_merge($suite->getSettings(), ['contexts' => $contexts]));
}
- private function normalizeContext($context): string
+ /**
+ * @return (int|string)|false
+ *
+ * @psalm-return array-key|false
+ */
+ private function normalizeContext($context)
{
if (is_array($context)) {
return current(array_keys($context));
diff --git a/src/Context/Environment/InitializedSymfonyExtensionEnvironment.php b/src/Context/Environment/InitializedSymfonyExtensionEnvironment.php
index 8a40dd2..e83b1a7 100644
--- a/src/Context/Environment/InitializedSymfonyExtensionEnvironment.php
+++ b/src/Context/Environment/InitializedSymfonyExtensionEnvironment.php
@@ -43,11 +43,13 @@ final class InitializedSymfonyExtensionEnvironment implements SymfonyExtensionEn
$this->contexts[get_class($context)] = $context;
}
+ #[\Override]
public function getSuite(): Suite
{
return $this->suite;
}
+ #[\Override]
public function bindCallee(Callee $callee): callable
{
$callable = $callee->getCallable();
@@ -59,16 +61,24 @@ final class InitializedSymfonyExtensionEnvironment implements SymfonyExtensionEn
return $callable;
}
+ #[\Override]
public function hasContexts(): bool
{
return count($this->contexts) > 0;
}
+ #[\Override]
+ /**
+ * @return key-of[]
+ *
+ * @psalm-return list>>
+ */
public function getContextClasses(): array
{
return array_keys($this->contexts);
}
+ #[\Override]
public function hasContextClass($class): bool
{
return isset($this->contexts[$class]);
diff --git a/src/Context/Environment/UninitializedSymfonyExtensionEnvironment.php b/src/Context/Environment/UninitializedSymfonyExtensionEnvironment.php
index db1504e..28bad54 100644
--- a/src/Context/Environment/UninitializedSymfonyExtensionEnvironment.php
+++ b/src/Context/Environment/UninitializedSymfonyExtensionEnvironment.php
@@ -42,16 +42,19 @@ final class UninitializedSymfonyExtensionEnvironment extends StaticEnvironment i
return array_keys($this->contexts);
}
+ #[\Override]
public function hasContexts(): bool
{
return count($this->contexts) > 0 || $this->delegatedEnvironment->hasContexts();
}
+ #[\Override]
public function getContextClasses(): array
{
return array_merge(array_values($this->contexts), $this->delegatedEnvironment->getContextClasses());
}
+ #[\Override]
public function hasContextClass($class): bool
{
return in_array($class, $this->contexts, true) || $this->delegatedEnvironment->hasContextClass($class);
diff --git a/src/Driver/Factory/SymfonyDriverFactory.php b/src/Driver/Factory/SymfonyDriverFactory.php
index a09b539..b148570 100644
--- a/src/Driver/Factory/SymfonyDriverFactory.php
+++ b/src/Driver/Factory/SymfonyDriverFactory.php
@@ -25,20 +25,24 @@ final class SymfonyDriverFactory implements DriverFactory
$this->kernel = $kernel;
}
+ #[\Override]
public function getDriverName(): string
{
return $this->name;
}
+ #[\Override]
public function supportsJavascript(): bool
{
return false;
}
+ #[\Override]
public function configure(ArrayNodeDefinition $builder): void
{
}
+ #[\Override]
public function buildDriver(array $config): Definition
{
if (!class_exists(BrowserKitDriver::class)) {
diff --git a/src/Driver/SymfonyDriver.php b/src/Driver/SymfonyDriver.php
index 77adad9..e7abf06 100644
--- a/src/Driver/SymfonyDriver.php
+++ b/src/Driver/SymfonyDriver.php
@@ -34,6 +34,7 @@ final class SymfonyDriver extends BrowserKitDriver
parent::__construct($this->createBrowser(), $this->baseUrl);
}
+ #[\Override]
public function reset()
{
parent::reset();
@@ -61,7 +62,6 @@ final class SymfonyDriver extends BrowserKitDriver
private function createBrowser(): AbstractBrowser
{
- /** @var object $testClient */
$testClient = $this->kernel->getContainer()->get('test.client');
if (!$testClient instanceof AbstractBrowser) {
diff --git a/src/Listener/KernelOrchestrator.php b/src/Listener/KernelOrchestrator.php
index 6daaaa5..dbd9fb0 100644
--- a/src/Listener/KernelOrchestrator.php
+++ b/src/Listener/KernelOrchestrator.php
@@ -28,6 +28,7 @@ final class KernelOrchestrator implements EventSubscriberInterface
$this->behatContainer = $behatContainer;
}
+ #[\Override]
public static function getSubscribedEvents(): array
{
return [
diff --git a/src/Mink/Mink.php b/src/Mink/Mink.php
index 6d38724..5c8fb87 100644
--- a/src/Mink/Mink.php
+++ b/src/Mink/Mink.php
@@ -6,6 +6,9 @@ namespace FriendsOfBehat\SymfonyExtension\Mink;
use Behat\Mink\Mink as BaseMink;
+/**
+ * @deprecated use Behat\Mink\Mink instead, it will be removed on 3.0.
+ */
class Mink extends BaseMink
{
/**
@@ -15,6 +18,7 @@ class Mink extends BaseMink
* in an invalid state. Therefore, not stopping all the sessions while destructing Mink
* saves our sanity.
*/
+ #[\Override]
public function __destruct()
{
// Intentionally left empty
diff --git a/src/Mink/MinkParameters.php b/src/Mink/MinkParameters.php
index 28ae204..7f79d95 100644
--- a/src/Mink/MinkParameters.php
+++ b/src/Mink/MinkParameters.php
@@ -17,11 +17,13 @@ class MinkParameters implements \Countable, \IteratorAggregate, \ArrayAccess
$this->minkParameters = $minkParameters;
}
+ #[\Override]
public function getIterator(): \Traversable
{
return new \ArrayIterator($this->minkParameters);
}
+ #[\Override]
public function offsetExists($offset): bool
{
return array_key_exists($offset, $this->minkParameters);
@@ -30,22 +32,26 @@ class MinkParameters implements \Countable, \IteratorAggregate, \ArrayAccess
/**
* @return mixed
*/
+ #[\Override]
#[ReturnTypeWillChange]
public function offsetGet($offset)
{
return $this->minkParameters[$offset] ?? null;
}
+ #[\Override]
public function offsetSet($offset, $value): void
{
throw new \BadMethodCallException(sprintf('"%s" is immutable.', self::class));
}
+ #[\Override]
public function offsetUnset($offset): void
{
throw new \BadMethodCallException(sprintf('"%s" is immutable.', self::class));
}
+ #[\Override]
public function count(): int
{
return count($this->minkParameters);
diff --git a/src/ServiceContainer/SymfonyExtension.php b/src/ServiceContainer/SymfonyExtension.php
index a233a76..714dbd4 100644
--- a/src/ServiceContainer/SymfonyExtension.php
+++ b/src/ServiceContainer/SymfonyExtension.php
@@ -14,7 +14,6 @@ use Behat\Testwork\ServiceContainer\ExtensionManager;
use FriendsOfBehat\SymfonyExtension\Context\Environment\Handler\ContextServiceEnvironmentHandler;
use FriendsOfBehat\SymfonyExtension\Driver\Factory\SymfonyDriverFactory;
use FriendsOfBehat\SymfonyExtension\Listener\KernelOrchestrator;
-use FriendsOfBehat\SymfonyExtension\Mink\Mink;
use FriendsOfBehat\SymfonyExtension\Mink\MinkParameters;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\DependencyInjection\Alias;
@@ -41,16 +40,19 @@ final class SymfonyExtension implements Extension
/** @var bool */
private $minkExtensionFound = false;
+ #[\Override]
public function getConfigKey(): string
{
return 'fob_symfony';
}
+ #[\Override]
public function initialize(ExtensionManager $extensionManager): void
{
$this->registerMinkDriver($extensionManager);
}
+ #[\Override]
public function configure(ArrayNodeDefinition $builder): void
{
$builder
@@ -70,6 +72,7 @@ final class SymfonyExtension implements Extension
;
}
+ #[\Override]
public function load(ContainerBuilder $container, array $config): void
{
$this->setupTestEnvironment($config['kernel']['environment'] ?? 'test');
@@ -90,13 +93,10 @@ final class SymfonyExtension implements Extension
}
}
+ #[\Override]
public function process(ContainerBuilder $container): void
{
$this->processEnvironmentHandler($container);
-
- if ($this->minkExtensionFound) {
- $container->getDefinition(MinkExtension::MINK_ID)->setClass(Mink::class);
- }
}
private function registerMinkDriver(ExtensionManager $extensionManager): void