Initial commit
This commit is contained in:
4
.gitattributes
vendored
Normal file
4
.gitattributes
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
/.gitattributes export-ignore
|
||||||
|
/.gitignore export-ignore
|
||||||
|
/.travis.yml export-ignore
|
||||||
|
/behat.yml.dist export-ignore
|
||||||
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
/vendor
|
||||||
|
|
||||||
|
/behat.yml
|
||||||
|
/composer.lock
|
||||||
32
.travis.yml
Normal file
32
.travis.yml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
language: php
|
||||||
|
|
||||||
|
php:
|
||||||
|
- 7.0
|
||||||
|
- 5.6
|
||||||
|
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- COMPOSER_OPTIONS=""
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
-
|
||||||
|
php: 5.6
|
||||||
|
env: COMPOSER_OPTIONS="--prefer-lowest"
|
||||||
|
|
||||||
|
cache:
|
||||||
|
directories:
|
||||||
|
- vendor
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- phpenv config-rm xdebug.ini || true
|
||||||
|
|
||||||
|
- composer self-update
|
||||||
|
|
||||||
|
install:
|
||||||
|
- composer update --prefer-dist $COMPOSER_OPTIONS
|
||||||
|
|
||||||
|
script:
|
||||||
|
- composer validate --strict
|
||||||
|
|
||||||
|
- vendor/bin/behat --strict
|
||||||
19
LICENSE
Normal file
19
LICENSE
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
Copyright (c) 2016 Kamil Kokot
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is furnished
|
||||||
|
to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
22
README.md
Normal file
22
README.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Symfony Extension [](https://packagist.org/packages/friends-of-behat/symfony-extension) [](https://packagist.org/packages/friends-of-behat/symfony-extension) [](http://travis-ci.org/FriendsOfBehat/SymfonyExtension) [](https://scrutinizer-ci.com/g/FriendsOfBehat/SymfonyExtension/)
|
||||||
|
|
||||||
|
Integrates Behat with Symfony (both 2 and 3).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Install it:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ composer require friends-of-behat/symfony-extension --dev
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Enable and configure in your Behat configuration:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
default:
|
||||||
|
# ...
|
||||||
|
extensions:
|
||||||
|
FriendsOfBehat\SymfonyExtension: Z
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Good luck & have fun!
|
||||||
3
behat.yml.dist
Normal file
3
behat.yml.dist
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
default:
|
||||||
|
extensions:
|
||||||
|
FriendsOfBehat\SymfonyExtension: ~
|
||||||
26
composer.json
Normal file
26
composer.json
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"name": "friends-of-behat/symfony-extension",
|
||||||
|
"description": "Allows to overwrite suites' default settings.",
|
||||||
|
"license": "MIT",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Kamil Kokot",
|
||||||
|
"email": "kamil@kokot.me",
|
||||||
|
"homepage": "http://kamil.kokot.me"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": "^5.6|^7.0",
|
||||||
|
|
||||||
|
"behat/behat": "^3.1",
|
||||||
|
"symfony/http-kernel": "^2.7|^3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"behat/mink": "^1.7",
|
||||||
|
"behat/mink-browserkit-driver": "^1.3",
|
||||||
|
"behat/mink-extension": "^2.2"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": { "FriendsOfBehat\\SymfonyExtension\\": "src/" }
|
||||||
|
}
|
||||||
|
}
|
||||||
70
src/Driver/Factory/SymfonyDriverFactory.php
Normal file
70
src/Driver/Factory/SymfonyDriverFactory.php
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FriendsOfBehat\SymfonyExtension\Driver\Factory;
|
||||||
|
|
||||||
|
use Behat\MinkExtension\ServiceContainer\Driver\DriverFactory;
|
||||||
|
use FriendsOfBehat\SymfonyExtension\Driver\SymfonyDriver;
|
||||||
|
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
|
||||||
|
use Symfony\Component\DependencyInjection\Definition;
|
||||||
|
use Symfony\Component\DependencyInjection\Reference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kamil Kokot <kamil@kokot.me>
|
||||||
|
*/
|
||||||
|
final class SymfonyDriverFactory implements DriverFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Reference
|
||||||
|
*/
|
||||||
|
private $kernel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
* @param Reference $kernel
|
||||||
|
*/
|
||||||
|
public function __construct($name, Reference $kernel)
|
||||||
|
{
|
||||||
|
$this->name = $name;
|
||||||
|
$this->kernel = $kernel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getDriverName()
|
||||||
|
{
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function supportsJavascript()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function configure(ArrayNodeDefinition $builder)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function buildDriver(array $config)
|
||||||
|
{
|
||||||
|
return new Definition(SymfonyDriver::class, [
|
||||||
|
$this->kernel,
|
||||||
|
'%mink.base_url%',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/Driver/SymfonyDriver.php
Normal file
21
src/Driver/SymfonyDriver.php
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FriendsOfBehat\SymfonyExtension\Driver;
|
||||||
|
|
||||||
|
use Behat\Mink\Driver\BrowserKitDriver;
|
||||||
|
use Symfony\Component\HttpKernel\KernelInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kamil Kokot <kamil@kokot.me>
|
||||||
|
*/
|
||||||
|
final class SymfonyDriver extends BrowserKitDriver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param KernelInterface $kernel
|
||||||
|
* @param string $baseUrl
|
||||||
|
*/
|
||||||
|
public function __construct(KernelInterface $kernel, $baseUrl)
|
||||||
|
{
|
||||||
|
parent::__construct($kernel->getContainer()->get('test.client'), $baseUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
44
src/Listener/KernelRebooter.php
Normal file
44
src/Listener/KernelRebooter.php
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FriendsOfBehat\SymfonyExtension\Listener;
|
||||||
|
|
||||||
|
use Behat\Behat\EventDispatcher\Event\ExampleTested;
|
||||||
|
use Behat\Behat\EventDispatcher\Event\ScenarioTested;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
use Symfony\Component\HttpKernel\KernelInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kamil Kokot <kamil@kokot.me>
|
||||||
|
*/
|
||||||
|
final class KernelRebooter implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var KernelInterface
|
||||||
|
*/
|
||||||
|
private $kernel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param KernelInterface $kernel
|
||||||
|
*/
|
||||||
|
public function __construct(KernelInterface $kernel)
|
||||||
|
{
|
||||||
|
$this->kernel = $kernel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
ScenarioTested::AFTER => ['rebootKernel', -15],
|
||||||
|
ExampleTested::AFTER => ['rebootKernel', -15],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rebootKernel()
|
||||||
|
{
|
||||||
|
$this->kernel->shutdown();
|
||||||
|
$this->kernel->boot();
|
||||||
|
}
|
||||||
|
}
|
||||||
197
src/ServiceContainer/SymfonyExtension.php
Normal file
197
src/ServiceContainer/SymfonyExtension.php
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FriendsOfBehat\SymfonyExtension\ServiceContainer;
|
||||||
|
|
||||||
|
use Behat\MinkExtension\ServiceContainer\MinkExtension;
|
||||||
|
use Behat\Testwork\EventDispatcher\ServiceContainer\EventDispatcherExtension;
|
||||||
|
use Behat\Testwork\ServiceContainer\Extension;
|
||||||
|
use Behat\Testwork\ServiceContainer\ExtensionManager;
|
||||||
|
use FriendsOfBehat\SymfonyExtension\Driver\Factory\SymfonyDriverFactory;
|
||||||
|
use FriendsOfBehat\SymfonyExtension\Listener\KernelRebooter;
|
||||||
|
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
|
||||||
|
use Symfony\Component\DependencyInjection\Container;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
use Symfony\Component\DependencyInjection\Definition;
|
||||||
|
use Symfony\Component\DependencyInjection\Reference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kamil Kokot <kamil@kokot.me>
|
||||||
|
*/
|
||||||
|
final class SymfonyExtension implements Extension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Kernel used inside Behat contexts or to create services injected to them.
|
||||||
|
* Container is built before every scenario.
|
||||||
|
*/
|
||||||
|
const KERNEL_ID = 'sylius_symfony_extension.kernel';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current container used in scenario contexts.
|
||||||
|
* To be used as a factory for current injected application services.
|
||||||
|
*/
|
||||||
|
const KERNEL_CONTAINER_ID = 'sylius_symfony_extension.kernel.container';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kernel used by Symfony2 driver to isolate web container from contexts' container.
|
||||||
|
* Container is built before every request.
|
||||||
|
*/
|
||||||
|
const DRIVER_KERNEL_ID = 'sylius_symfony_extension.driver_kernel';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kernel that should be used by extensions only.
|
||||||
|
* Container is built only once at the first use.
|
||||||
|
*/
|
||||||
|
const SHARED_KERNEL_ID = 'sylius_symfony_extension.shared_kernel';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The only container built by shared kernel.
|
||||||
|
* To be used as a factory for shared injected application services.
|
||||||
|
*/
|
||||||
|
const SHARED_KERNEL_CONTAINER_ID = 'sylius_symfony_extension.shared_kernel.container';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getConfigKey()
|
||||||
|
{
|
||||||
|
return 'fob_symfony';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function initialize(ExtensionManager $extensionManager)
|
||||||
|
{
|
||||||
|
$this->registerSymfonyDriverFactory($extensionManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function configure(ArrayNodeDefinition $builder)
|
||||||
|
{
|
||||||
|
$builder
|
||||||
|
->addDefaultsIfNotSet()
|
||||||
|
->children()
|
||||||
|
->arrayNode('kernel')
|
||||||
|
->addDefaultsIfNotSet()
|
||||||
|
->children()
|
||||||
|
->scalarNode('bootstrap')->defaultValue('app/autoload.php')->end()
|
||||||
|
->scalarNode('path')->defaultValue('app/AppKernel.php')->end()
|
||||||
|
->scalarNode('class')->defaultValue('AppKernel')->end()
|
||||||
|
->scalarNode('env')->defaultValue('test')->end()
|
||||||
|
->booleanNode('debug')->defaultTrue()->end()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function load(ContainerBuilder $container, array $config)
|
||||||
|
{
|
||||||
|
$this->loadKernel($container, $config['kernel']);
|
||||||
|
$this->loadKernelContainer($container);
|
||||||
|
|
||||||
|
$this->loadDriverKernel($container);
|
||||||
|
|
||||||
|
$this->loadSharedKernel($container);
|
||||||
|
$this->loadSharedKernelContainer($container);
|
||||||
|
|
||||||
|
$this->loadKernelRebooter($container);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function process(ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ContainerBuilder $container
|
||||||
|
*/
|
||||||
|
private function loadKernel(ContainerBuilder $container, array $config)
|
||||||
|
{
|
||||||
|
$definition = new Definition($config['class'], array(
|
||||||
|
$config['env'],
|
||||||
|
$config['debug'],
|
||||||
|
));
|
||||||
|
$definition->addMethodCall('boot');
|
||||||
|
$container->setDefinition(self::KERNEL_ID, $definition);
|
||||||
|
$container->setParameter(self::KERNEL_ID . '.path', $config['path']);
|
||||||
|
$container->setParameter(self::KERNEL_ID . '.bootstrap', $config['bootstrap']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ContainerBuilder $container
|
||||||
|
*/
|
||||||
|
private function loadKernelContainer(ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
$containerDefinition = new Definition(Container::class);
|
||||||
|
$containerDefinition->setFactory([
|
||||||
|
new Reference(self::KERNEL_ID),
|
||||||
|
'getContainer',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$container->setDefinition(self::KERNEL_CONTAINER_ID, $containerDefinition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ContainerBuilder $container
|
||||||
|
*/
|
||||||
|
private function loadDriverKernel(ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
$container->setDefinition(self::DRIVER_KERNEL_ID, $container->findDefinition(self::KERNEL_ID));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ContainerBuilder $container
|
||||||
|
*/
|
||||||
|
private function loadSharedKernel(ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
$container->setDefinition(self::SHARED_KERNEL_ID, $container->findDefinition(self::KERNEL_ID));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ContainerBuilder $container
|
||||||
|
*/
|
||||||
|
private function loadSharedKernelContainer(ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
$containerDefinition = new Definition(Container::class);
|
||||||
|
$containerDefinition->setFactory([
|
||||||
|
new Reference(self::SHARED_KERNEL_ID),
|
||||||
|
'getContainer',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$container->setDefinition(self::SHARED_KERNEL_CONTAINER_ID, $containerDefinition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ContainerBuilder $container
|
||||||
|
*/
|
||||||
|
private function loadKernelRebooter(ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
$definition = new Definition(KernelRebooter::class, [new Reference(self::KERNEL_ID)]);
|
||||||
|
$definition->addTag(EventDispatcherExtension::SUBSCRIBER_TAG);
|
||||||
|
|
||||||
|
$container->setDefinition(self::KERNEL_ID . '.rebooter', $definition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ExtensionManager $extensionManager
|
||||||
|
*/
|
||||||
|
private function registerSymfonyDriverFactory(ExtensionManager $extensionManager)
|
||||||
|
{
|
||||||
|
/** @var MinkExtension $minkExtension */
|
||||||
|
$minkExtension = $extensionManager->getExtension('mink');
|
||||||
|
if (null === $minkExtension) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$minkExtension->registerDriverFactory(new SymfonyDriverFactory(
|
||||||
|
'symfony',
|
||||||
|
new Reference(self::DRIVER_KERNEL_ID)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user