From a425be697a8756e94278780fdb09e96a046b9c5c Mon Sep 17 00:00:00 2001 From: Kamil Kokot Date: Thu, 21 Mar 2019 17:16:23 +0100 Subject: [PATCH] Initialize contexts registered as services --- .../mink_context_integration.feature | 59 +++++++++++++++++++ .../switching_mink_sessions.feature | 2 - .../context_initializer_compatibility.feature | 14 ++++- .../ContextServiceEnvironmentHandler.php | 18 ++++++ src/ServiceContainer/SymfonyExtension.php | 9 +++ 5 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 features/mink_integration/mink_context_integration.feature diff --git a/features/mink_integration/mink_context_integration.feature b/features/mink_integration/mink_context_integration.feature new file mode 100644 index 0000000..7197443 --- /dev/null +++ b/features/mink_integration/mink_context_integration.feature @@ -0,0 +1,59 @@ +Feature: Mink context 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: + Then I should have Mink injected + """ + And a context file "tests/SomeContext.php" containing: + """ + getMink() instanceof Mink); + } + } + """ + + Scenario: Mink context integration with vanilla context + When I run Behat + Then it should pass + + Scenario: Mink context integration with context as a service + Given a YAML services file containing: + """ + services: + App\Tests\SomeContext: + public: true + """ + When I run Behat + Then it should pass diff --git a/features/mink_integration/switching_mink_sessions.feature b/features/mink_integration/switching_mink_sessions.feature index 453218f..660caae 100644 --- a/features/mink_integration/switching_mink_sessions.feature +++ b/features/mink_integration/switching_mink_sessions.feature @@ -52,8 +52,6 @@ Feature: Switching Mink sessions /** @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); } } diff --git a/features/sanity_checks/context_initializer_compatibility.feature b/features/sanity_checks/context_initializer_compatibility.feature index df545f2..7852b3a 100644 --- a/features/sanity_checks/context_initializer_compatibility.feature +++ b/features/sanity_checks/context_initializer_compatibility.feature @@ -1,6 +1,6 @@ Feature: Context initializer compatibility - Scenario: Using class resolvers while handling context environment + Background: Given a working Symfony application with SymfonyExtension configured And a Behat configuration containing: """ @@ -67,5 +67,17 @@ Feature: Context initializer compatibility } } """ + + Scenario: Using context initializers while handling context environment for vanilla contexts + When I run Behat + Then it should pass + + Scenario: Using context initializers while handling context environment for contexts as a service + Given a YAML services file containing: + """ + services: + App\Tests\SomeContext: + public: true + """ When I run Behat Then it should pass diff --git a/src/Context/Environment/Handler/ContextServiceEnvironmentHandler.php b/src/Context/Environment/Handler/ContextServiceEnvironmentHandler.php index dca3f34..5fe4ab8 100644 --- a/src/Context/Environment/Handler/ContextServiceEnvironmentHandler.php +++ b/src/Context/Environment/Handler/ContextServiceEnvironmentHandler.php @@ -16,6 +16,7 @@ namespace FriendsOfBehat\SymfonyExtension\Context\Environment\Handler; use Behat\Behat\Context\Context; use Behat\Behat\Context\Environment\ContextEnvironment; use Behat\Behat\Context\Environment\InitializedContextEnvironment; +use Behat\Behat\Context\Initializer\ContextInitializer; use Behat\Testwork\Environment\Environment; use Behat\Testwork\Environment\Exception\EnvironmentIsolationException; use Behat\Testwork\Environment\Handler\EnvironmentHandler; @@ -36,12 +37,20 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler /** @var EnvironmentHandler */ private $decoratedEnvironmentHandler; + /** @var ContextInitializer[] */ + private $contextInitializers = []; + public function __construct(KernelInterface $symfonyKernel, EnvironmentHandler $decoratedEnvironmentHandler) { $this->symfonyKernel = $symfonyKernel; $this->decoratedEnvironmentHandler = $decoratedEnvironmentHandler; } + public function registerContextInitializer(ContextInitializer $contextInitializer): void + { + $this->contextInitializers[] = $contextInitializer; + } + public function supportsSuite(Suite $suite): bool { return $suite->hasSetting('contexts'); @@ -87,6 +96,8 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler /** @var Context $context */ $context = $this->getContainer()->get($serviceId); + $this->initializeContext($context); + $environment->registerContext($context); } @@ -100,6 +111,13 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler return $environment; } + private function initializeContext(Context $context): void + { + foreach ($this->contextInitializers as $contextInitializer) { + $contextInitializer->initializeContext($context); + } + } + /** * @return string[] * diff --git a/src/ServiceContainer/SymfonyExtension.php b/src/ServiceContainer/SymfonyExtension.php index fdcafd5..5eac28b 100644 --- a/src/ServiceContainer/SymfonyExtension.php +++ b/src/ServiceContainer/SymfonyExtension.php @@ -88,6 +88,7 @@ final class SymfonyExtension implements Extension public function process(ContainerBuilder $container): void { + $this->processEnvironmentHandler($container); } private function registerMinkDriver(ExtensionManager $extensionManager): void @@ -177,6 +178,14 @@ final class SymfonyExtension implements Extension } } + private function processEnvironmentHandler(ContainerBuilder $container): void + { + $definition = $container->findDefinition('fob_symfony.environment_handler.context_service'); + foreach ($container->findTaggedServiceIds(ContextExtension::INITIALIZER_TAG) as $serviceId => $tags) { + $definition->addMethodCall('registerContextInitializer', [$container->getDefinition($serviceId)]); + } + } + private function autodiscoverKernelConfiguration(array $config): array { if ($config['class'] !== null) {