From d61600f563b166127c55487da56c6ec62810fe95 Mon Sep 17 00:00:00 2001 From: Kamil Kokot Date: Wed, 13 Feb 2019 17:02:21 +0100 Subject: [PATCH] Expose the Mink service --- docs/03_mink_integration.md | 2 + ...ession_and_parameters_integration.feature} | 2 +- .../mink_service_integration.feature | 87 +++++++++++++++++++ ...riendsOfBehatSymfonyExtensionExtension.php | 13 +++ src/ServiceContainer/SymfonyExtension.php | 8 ++ 5 files changed, 111 insertions(+), 1 deletion(-) rename features/mink_integration/{mink_integration.feature => mink_default_session_and_parameters_integration.feature} (98%) create mode 100644 features/mink_integration/mink_service_integration.feature diff --git a/docs/03_mink_integration.md b/docs/03_mink_integration.md index a6ac71a..ff5dafb 100644 --- a/docs/03_mink_integration.md +++ b/docs/03_mink_integration.md @@ -29,6 +29,8 @@ default: This integration provides two services to use inside Symfony container: + * **`behat.mink`** (autowired by `\Behat\Mink\Mink`) - the Mink service + * **`behat.mink.default_session`** (autowired by `\Behat\Mink\Session`) - the default Mink session for the current scenario * **`behat.mink.parameters`** (autowired by `\FriendsOfBehat\SymfonyExtension\Mink\MinkParameters`) - an object diff --git a/features/mink_integration/mink_integration.feature b/features/mink_integration/mink_default_session_and_parameters_integration.feature similarity index 98% rename from features/mink_integration/mink_integration.feature rename to features/mink_integration/mink_default_session_and_parameters_integration.feature index fbe9290..b7f3923 100644 --- a/features/mink_integration/mink_integration.feature +++ b/features/mink_integration/mink_default_session_and_parameters_integration.feature @@ -1,4 +1,4 @@ -Feature: Mink integration +Feature: Mink default session and parameters integration Background: Given a working Symfony application with SymfonyExtension configured diff --git a/features/mink_integration/mink_service_integration.feature b/features/mink_integration/mink_service_integration.feature new file mode 100644 index 0000000..d260561 --- /dev/null +++ b/features/mink_integration/mink_service_integration.feature @@ -0,0 +1,87 @@ +Feature: Mink service integration + + Background: + 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 + sessions: + symfony: + symfony: ~ + suites: + default: + contexts: + - App\Tests\SomeContext + """ + And a feature file containing: + """ + Feature: + Scenario: + When I visit the page "/hello-world" + Then I should see "Hello world!" on the page + + # Doubling the scenario to account for some weird error connected to Mink's session + Scenario: + When I visit the page "/hello-world" + Then I should see "Hello world!" on the page + """ + And a context file "tests/SomeContext.php" containing: + """ + mink = $mink; + } + + /** @When I visit the page :page */ + public function visitPage(string $page): void + { + $this->mink->getSession()->visit($page); + } + + /** @Then I should see :content on the page */ + public function shouldSeeContentOnPage(string $content): void + { + assert(false !== strpos($this->mink->getSession()->getPage()->getContent(), $content)); + } + } + """ + + Scenario: Injecting Mink serivce + Given a YAML services file containing: + """ + services: + App\Tests\SomeContext: + public: true + arguments: + - '@behat.mink' + """ + When I run Behat + Then it should pass + + Scenario: Autowiring and autoconfiguring Mink service + Given a YAML services file containing: + """ + services: + _defaults: + autowire: true + autoconfigure: true + + App\Tests\SomeContext: ~ + """ + When I run Behat + Then it should pass diff --git a/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php b/src/Bundle/DependencyInjection/FriendsOfBehatSymfonyExtensionExtension.php index 7e081e0..8cd3921 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; @@ -45,10 +46,22 @@ final class FriendsOfBehatSymfonyExtensionExtension extends Extension implements private function provideMinkIntegration(ContainerBuilder $container): void { + $this->registerMink($container); $this->registerMinkDefaultSession($container); $this->registerMinkParameters($container); } + private function registerMink(ContainerBuilder $container): void + { + $minkDefaultSessionDefinition = new Definition(Mink::class, ['fob_symfony.mink']); + $minkDefaultSessionDefinition->setPublic(true); + $minkDefaultSessionDefinition->setLazy(true); + $minkDefaultSessionDefinition->setFactory([new Reference('behat.service_container'), 'get']); + + $container->setDefinition('behat.mink', $minkDefaultSessionDefinition); + $container->setAlias(Mink::class, 'behat.mink'); + } + private function registerMinkDefaultSession(ContainerBuilder $container): void { $minkDefaultSessionDefinition = new Definition(Session::class, ['fob_symfony.mink.default_session']); diff --git a/src/ServiceContainer/SymfonyExtension.php b/src/ServiceContainer/SymfonyExtension.php index fdcafd5..da0e412 100644 --- a/src/ServiceContainer/SymfonyExtension.php +++ b/src/ServiceContainer/SymfonyExtension.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace FriendsOfBehat\SymfonyExtension\ServiceContainer; use Behat\Behat\Context\ServiceContainer\ContextExtension; +use Behat\Mink\Mink; use Behat\Mink\Session; use Behat\MinkExtension\ServiceContainer\MinkExtension; use Behat\Testwork\Environment\ServiceContainer\EnvironmentExtension; @@ -16,6 +17,7 @@ use FriendsOfBehat\SymfonyExtension\Driver\Factory\SymfonyDriverFactory; use FriendsOfBehat\SymfonyExtension\Listener\KernelOrchestrator; use FriendsOfBehat\SymfonyExtension\Mink\MinkParameters; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Parameter; @@ -81,6 +83,7 @@ final class SymfonyExtension implements Extension $this->loadEnvironmentHandler($container); if ($this->minkExtensionFound) { + $this->loadMink($container); $this->loadMinkDefaultSession($container); $this->loadMinkParameters($container); } @@ -143,6 +146,11 @@ final class SymfonyExtension implements Extension $container->setDefinition('fob_symfony.environment_handler.context_service', $definition); } + private function loadMink(ContainerBuilder $container): void + { + $container->setAlias('fob_symfony.mink', (new Alias('mink'))->setPublic(true)); + } + private function loadMinkDefaultSession(ContainerBuilder $container): void { $minkDefaultSessionDefinition = new Definition(Session::class);