Skip to content
This repository was archived by the owner on Feb 5, 2021. It is now read-only.

Commit f920ce9

Browse files
authored
Merge pull request #4 from pamil/cross-container-extension
Integration with FriendsOfBehat\CrossContainerExtension
2 parents 3656e7d + f8caaf7 commit f920ce9

8 files changed

+177
-12
lines changed

composer.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@
1616
"symfony/dependency-injection": "^2.8|^3.0"
1717
},
1818
"require-dev": {
19-
"friends-of-behat/test-context": "^0.2.0",
19+
"friends-of-behat/test-context": "^0.3",
20+
"friends-of-behat/cross-container-extension": "^0.1.3",
2021
"phpspec/phpspec": "^3.1"
2122
},
23+
"suggest": {
24+
"friends-of-behat/cross-container-extension": "^0.1"
25+
},
2226
"autoload": {
2327
"psr-4": { "FriendsOfBehat\\ContextServiceExtension\\": "src/" }
2428
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
Feature: Referencing cross containers parameters
2+
In order to allow my contexts services to be actually useful
3+
As a Behat Developer
4+
I want to be able to inject parameters from Behat container
5+
6+
Background:
7+
Given a context file "features/bootstrap/FeatureContext.php" containing:
8+
"""
9+
<?php
10+
11+
use Behat\Behat\Context\Context;
12+
13+
class FeatureContext implements Context
14+
{
15+
private $basePaths;
16+
17+
public function __construct($basePaths)
18+
{
19+
$this->basePaths = $basePaths;
20+
}
21+
22+
/**
23+
* @Then base paths should be injected to the context
24+
*/
25+
public function basePathsShouldBeInjectedToTheContext()
26+
{
27+
if (null === $this->basePaths) {
28+
throw new \DomainException('No base paths were injected!');
29+
}
30+
}
31+
}
32+
"""
33+
And a Behat configuration containing:
34+
"""
35+
default:
36+
suites:
37+
default:
38+
contexts_services:
39+
- feature_context
40+
41+
extensions:
42+
FriendsOfBehat\ContextServiceExtension:
43+
imports:
44+
- features/bootstrap/config/services.xml
45+
46+
FriendsOfBehat\CrossContainerExtension: ~
47+
"""
48+
And a config file "features/bootstrap/config/services.xml" containing:
49+
"""
50+
<container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://symfony.com/schema/dic/services">
51+
<services>
52+
<service id="feature_context" class="FeatureContext">
53+
<argument>%__behat__.paths.base%</argument>
54+
<tag name="fob.context_service" />
55+
</service>
56+
</services>
57+
</container>
58+
"""
59+
60+
Scenario: Referencing cross container parameters
61+
Given a feature file "features/referencing_cross_container_parameters.feature" containing:
62+
"""
63+
Feature: Referencing cross container parameters
64+
65+
Scenario:
66+
Then base paths should be injected to the context
67+
"""
68+
When I run Behat
69+
Then it should pass
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
Feature: Referencing cross containers services
2+
In order to allow my contexts services to be actually useful
3+
As a Behat Developer
4+
I want to be able to inject services from Behat container
5+
6+
Background:
7+
Given a context file "features/bootstrap/FeatureContext.php" containing:
8+
"""
9+
<?php
10+
11+
use Behat\Behat\Context\Context;
12+
use Symfony\Component\DependencyInjection\ContainerInterface;
13+
14+
class FeatureContext implements Context
15+
{
16+
private $container;
17+
18+
public function __construct(ContainerInterface $container = null)
19+
{
20+
$this->container = $container;
21+
}
22+
23+
/**
24+
* @Then Behat container should be injected to the context
25+
*/
26+
public function behatContainerShouldBeInjectedToTheContext()
27+
{
28+
if (null === $this->container) {
29+
throw new \DomainException('Nothing was injected!');
30+
}
31+
32+
if (!$this->container->hasParameter('paths.base')) {
33+
throw new \DomainException('Injected container does not have "paths.base" parameter!');
34+
}
35+
}
36+
}
37+
"""
38+
And a Behat configuration containing:
39+
"""
40+
default:
41+
suites:
42+
default:
43+
contexts_services:
44+
- feature_context
45+
46+
extensions:
47+
FriendsOfBehat\ContextServiceExtension:
48+
imports:
49+
- features/bootstrap/config/services.xml
50+
51+
FriendsOfBehat\CrossContainerExtension: ~
52+
"""
53+
And a config file "features/bootstrap/config/services.xml" containing:
54+
"""
55+
<container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://symfony.com/schema/dic/services">
56+
<services>
57+
<service id="feature_context" class="FeatureContext">
58+
<argument type="service" id="__behat__.service_container" />
59+
<tag name="fob.context_service" />
60+
</service>
61+
</services>
62+
</container>
63+
"""
64+
65+
Scenario: Referencing cross container services
66+
Given a feature file "features/referencing_cross_container_services.feature" containing:
67+
"""
68+
Feature: Referencing cross container services
69+
70+
Scenario:
71+
Then Behat container should be injected to the context
72+
"""
73+
When I run Behat
74+
Then it should pass

src/ServiceContainer/ContextServiceExtension.php

+27-5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
use FriendsOfBehat\ContextServiceExtension\Context\Environment\Handler\ContextServiceEnvironmentHandler;
2020
use FriendsOfBehat\ContextServiceExtension\Listener\ScenarioContainerResetter;
2121
use FriendsOfBehat\ContextServiceExtension\ServiceContainer\Scenario\ContainerFactory;
22+
use FriendsOfBehat\ContextServiceExtension\ServiceContainer\Scenario\ContextRegistryPass;
23+
use FriendsOfBehat\CrossContainerExtension\CrossContainerProcessor;
24+
use FriendsOfBehat\CrossContainerExtension\ServiceContainer\CrossContainerExtension;
2225
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
2326
use Symfony\Component\DependencyInjection\ContainerBuilder;
2427
use Symfony\Component\DependencyInjection\Definition;
@@ -29,6 +32,11 @@
2932
*/
3033
final class ContextServiceExtension implements Extension
3134
{
35+
/**
36+
* @var CrossContainerProcessor|null
37+
*/
38+
private $crossContainerProcessor;
39+
3240
/**
3341
* {@inheritdoc}
3442
*/
@@ -42,6 +50,11 @@ public function getConfigKey()
4250
*/
4351
public function initialize(ExtensionManager $extensionManager)
4452
{
53+
/** @var CrossContainerExtension|null $crossContainerExtension */
54+
$crossContainerExtension = $extensionManager->getExtension('fob_cross_container');
55+
if (null !== $crossContainerExtension) {
56+
$this->crossContainerProcessor = $crossContainerExtension->getCrossContainerProcessor();
57+
}
4558
}
4659

4760
/**
@@ -72,6 +85,15 @@ public function load(ContainerBuilder $container, array $config)
7285
*/
7386
public function process(ContainerBuilder $container)
7487
{
88+
/** @var ContainerBuilder $scenarioContainer */
89+
$scenarioContainer = $container->get('fob_context_service.service_container.scenario');
90+
91+
if (null !== $this->crossContainerProcessor) {
92+
$this->crossContainerProcessor->process($scenarioContainer);
93+
}
94+
95+
$scenarioContainer->addCompilerPass(new ContextRegistryPass($container->getDefinition('fob_context_service.context_registry')));
96+
$scenarioContainer->compile();
7597
}
7698

7799
/**
@@ -88,11 +110,11 @@ private function loadContextRegistry(ContainerBuilder $container)
88110
*/
89111
private function loadScenarioServiceContainer(ContainerBuilder $container, array $config)
90112
{
91-
$container->set('fob_context_service.service_container.scenario', (new ContainerFactory())->createContainer(
92-
$container->getParameter('paths.base'),
93-
$container->getDefinition('fob_context_service.context_registry'),
94-
$config['imports']
95-
));
113+
$container->set(
114+
'fob_context_service.service_container.scenario',
115+
(new ContainerFactory())->createContainer($container->getParameter('paths.base'), $config['imports'])
116+
);
117+
96118

97119
$definition = new Definition(ScenarioContainerResetter::class, [
98120
new Reference('fob_context_service.service_container.scenario'),

src/ServiceContainer/Scenario/ContainerFactory.php

+2-6
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,11 @@ final class ContainerFactory
2626
{
2727
/**
2828
* @param string $basePath
29-
* @param Definition $contextRegistryDefinition
3029
* @param array $importedFiles
3130
*
32-
* @return ContainerInterface
31+
* @return ContainerBuilder
3332
*/
34-
public function createContainer($basePath, Definition $contextRegistryDefinition, array $importedFiles = [])
33+
public function createContainer($basePath, array $importedFiles = [])
3534
{
3635
$container = new ContainerBuilder();
3736

@@ -40,9 +39,6 @@ public function createContainer($basePath, Definition $contextRegistryDefinition
4039
$loader->load($file);
4140
}
4241

43-
$container->addCompilerPass(new ContextRegistryPass($contextRegistryDefinition));
44-
$container->compile();
45-
4642
return $container;
4743
}
4844

0 commit comments

Comments
 (0)