From 01fe9425a114a473ad26a90c442d74f5e1cb7a6b Mon Sep 17 00:00:00 2001 From: Kamil Kokot Date: Fri, 15 Mar 2019 14:44:54 +0100 Subject: [PATCH] Fix bug preventing changes of Mink default session service --- composer.json | 1 + .../switching_mink_sessions.feature | 70 +++++++++++++++++++ ...riendsOfBehatSymfonyExtensionExtension.php | 13 +++- 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 features/mink_integration/switching_mink_sessions.feature diff --git a/composer.json b/composer.json index 8883805..8978e37 100644 --- a/composer.json +++ b/composer.json @@ -21,6 +21,7 @@ "behat/mink": "^1.7", "behat/mink-browserkit-driver": "^1.3", "behat/mink-extension": "^2.2", + "behat/mink-selenium2-driver": "^1.3", "friends-of-behat/service-container-extension": "^1.0", "phpstan/phpstan-shim": "^0.11", "sylius-labs/coding-standard": "^3.0", diff --git a/features/mink_integration/switching_mink_sessions.feature b/features/mink_integration/switching_mink_sessions.feature new file mode 100644 index 0000000..453218f --- /dev/null +++ b/features/mink_integration/switching_mink_sessions.feature @@ -0,0 +1,70 @@ +Feature: Switching Mink sessions + + Scenario: Switching Mink sessions + Given a working Symfony application with SymfonyExtension configured + And a Behat configuration containing: + """ + default: + extensions: + Behat\MinkExtension: + base_url: "http://localhost:8080/" + default_session: symfony + javascript_session: selenium2 + sessions: + symfony: + symfony: ~ + selenium2: + selenium2: ~ + + + suites: + default: + contexts: + - App\Tests\SomeContext + """ + And a feature file containing: + """ + Feature: + Scenario: + Then I should use Mink session with "FriendsOfBehat\SymfonyExtension\Driver\SymfonyDriver" as a driver + + @javascript + Scenario: + Then I should use Mink session with "Behat\Mink\Driver\Selenium2Driver" as a driver + """ + And a context file "tests/SomeContext.php" containing: + """ + session = $session; + } + + /** @Then I should use Mink session with :driver as a driver*/ + public function shouldUseDriver(string $driverClass): void + { + var_dump(get_class($this->session)); + var_dump(get_class($this->session->getDriver())); + assert($this->session->getDriver() instanceof $driverClass); + } + } + """ + And a YAML services file containing: + """ + services: + App\Tests\SomeContext: + public: true + arguments: + - '@behat.mink.default_session' + """ + When I run Behat + Then it should pass diff --git a/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php b/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php index 7e081e0..b45b378 100644 --- a/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php +++ b/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace FriendsOfBehat\SymfonyExtension\Bundle\DependencyInjection; use Behat\Behat\Context\Context; +use Behat\Mink\Mink; use Behat\Mink\Session; use FriendsOfBehat\SymfonyExtension\Mink\MinkParameters; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; @@ -51,10 +52,18 @@ final class FriendsOfBehatSymfonyExtensionExtension extends Extension implements private function registerMinkDefaultSession(ContainerBuilder $container): void { - $minkDefaultSessionDefinition = new Definition(Session::class, ['fob_symfony.mink.default_session']); + $minkDefinition = new Definition(Mink::class, ['mink']); + $minkDefinition->setPublic(true); + $minkDefinition->setLazy(true); + $minkDefinition->setFactory([new Reference('behat.service_container'), 'get']); + + $container->setDefinition('behat.mink', $minkDefinition); + $container->setAlias(Mink::class, 'behat.mink'); + + $minkDefaultSessionDefinition = new Definition(Session::class); $minkDefaultSessionDefinition->setPublic(true); $minkDefaultSessionDefinition->setLazy(true); - $minkDefaultSessionDefinition->setFactory([new Reference('behat.service_container'), 'get']); + $minkDefaultSessionDefinition->setFactory([new Reference('behat.mink'), 'getSession']); $container->setDefinition('behat.mink.default_session', $minkDefaultSessionDefinition); $container->setAlias(Session::class, 'behat.mink.default_session');