3 namespace Drupal\DrupalExtension\Listener;
5 use Behat\Behat\EventDispatcher\Event\ExampleTested;
6 use Behat\Behat\EventDispatcher\Event\ScenarioLikeTested;
7 use Behat\Behat\EventDispatcher\Event\ScenarioTested;
9 use Drupal\DrupalDriverManager;
11 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
14 * Drupal driver listener.
16 * Determines which Drupal driver to use for a given scenario or outline.
18 class DriverListener implements EventSubscriberInterface {
21 * Drupal driver manager.
23 * @var \Drupal\DrupalDriverManager
34 public function __construct(DrupalDriverManager $drupal, array $parameters) {
35 $this->drupal = $drupal;
36 $this->parameters = $parameters;
42 public static function getSubscribedEvents() {
44 ScenarioTested::BEFORE => array('prepareDefaultDrupalDriver', 11),
45 ExampleTested::BEFORE => array('prepareDefaultDrupalDriver', 11),
50 * Configures default Drupal driver to use before each scenario or outline.
52 * `@api` tagged scenarios will get the `api_driver` as the default driver.
54 * Other scenarios get the `default_driver` as the default driver.
56 * @param ScenarioEvent|OutlineEvent $event
58 public function prepareDefaultDrupalDriver($event) {
59 $feature = $event->getFeature();
60 $scenario = $event instanceof ScenarioLikeTested ? $event->getScenario() : $event->getOutline();
62 // Get the default driver.
63 $driver = $this->parameters['default_driver'];
65 foreach (array_merge($feature->getTags(), $scenario->getTags()) as $tag) {
66 if (!empty($this->parameters[$tag . '_driver'])) {
67 $driver = $this->parameters[$tag . '_driver'];
71 // Set the default driver.
72 $this->drupal->setDefaultDriverName($driver);
74 // Set the environment.
75 $environment = $event->getEnvironment();
76 $this->drupal->setEnvironment($environment);