diff --git a/src/Context/LoginContext.php b/src/Context/LoginContext.php index b6ce32c..900c148 100644 --- a/src/Context/LoginContext.php +++ b/src/Context/LoginContext.php @@ -4,9 +4,11 @@ namespace SilverStripe\BehatExtension\Context; use Behat\Behat\Context\Context; use Behat\Mink\Element\NodeElement; +use SilverStripe\Security\Authenticator; use SilverStripe\Security\Group; use SilverStripe\Security\Member; use SilverStripe\Security\Permission; +use SilverStripe\Security\Security; /** * LoginContext @@ -127,7 +129,10 @@ class LoginContext implements Context /** @var Member $member */ $member = Member::get()->filter('Email', $id)->First(); assertNotNull($member); - assertTrue($member->checkPassword($password)->isValid()); + $authenticators = Security::singleton()->getApplicableAuthenticators(Authenticator::CHECK_PASSWORD); + foreach ($authenticators as $authenticator) { + assertTrue($authenticator->checkPassword($member, $password)->isValid()); + } } /** diff --git a/src/Controllers/ModuleCommandTrait.php b/src/Controllers/ModuleCommandTrait.php index 3c30d3f..a4a572c 100644 --- a/src/Controllers/ModuleCommandTrait.php +++ b/src/Controllers/ModuleCommandTrait.php @@ -12,15 +12,16 @@ trait ModuleCommandTrait * Find target module being tested * * @param string $name + * @param bool $error Throw error if not found * @return Module */ - protected function getModule($name) + protected function getModule($name, $error = true) { if (strpos($name, '@') === 0) { $name = substr($name, 1); } $module = ModuleLoader::inst()->getManifest()->getModule($name); - if (!$module) { + if (!$module && $error) { throw new InvalidArgumentException("No module $name installed"); } return $module; diff --git a/src/Controllers/ModuleSuiteLocator.php b/src/Controllers/ModuleSuiteLocator.php index 022bec7..a78eb95 100644 --- a/src/Controllers/ModuleSuiteLocator.php +++ b/src/Controllers/ModuleSuiteLocator.php @@ -7,18 +7,22 @@ use Behat\Testwork\Suite\Cli\SuiteController; use Behat\Testwork\Suite\ServiceContainer\SuiteExtension; use Behat\Testwork\Suite\SuiteRegistry; use Exception; +use InvalidArgumentException; +use RuntimeException; use SilverStripe\Core\Manifest\Module; -use Symfony\Component\DependencyInjection\Container; -use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\DependencyInjection\Container; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Yaml\Parser; /** * Locates test suite configuration based on module name. * + * Replaces: * @see SuiteController for similar core behat controller */ class ModuleSuiteLocator implements Controller @@ -72,6 +76,12 @@ class ModuleSuiteLocator implements Controller . "Must be in @modulename format. Supports @vendor/name syntax for vendor installed modules. " . "Ensure that a modulename/behat.yml exists containing a behat suite of the same name." ); + $command->addOption( + '--suite', + '-s', + InputOption::VALUE_REQUIRED, + 'Only execute a specific suite.' + ); } /** @@ -79,13 +89,20 @@ class ModuleSuiteLocator implements Controller * * @param InputInterface $input * @param OutputInterface $output - * - * @throws \RuntimeException + * @throws RuntimeException * @return null */ public function execute(InputInterface $input, OutputInterface $output) { - if (!$input->hasArgument('module')) { + // Register all suites if no arguments given + if (!$input->getArgument('module') && !$input->getOption('suite')) { + foreach ($this->suiteConfigurations as $name => $config) { + $this->registry->registerSuiteConfiguration( + $name, + $config['type'], + $config['settings'] + ); + } return null; } @@ -94,23 +111,36 @@ class ModuleSuiteLocator implements Controller return; } - // Get module - $moduleName = $input->getArgument('module'); - $module = $this->getModule($moduleName); + // Get module either via @module or --suite module + if ($input->getArgument('module')) { + // Get suite from module + $moduleName = $input->getArgument('module'); + $module = $this->getModule($moduleName); - // Suite name always omits vendor - $suiteName = $module->getShortName(); - - // Suite doesn't exist, so load dynamically from nested `behat.yml` - if (!isset($this->suiteConfigurations[$suiteName])) { - $config = $this->loadSuiteConfiguration($suiteName, $module); - $this->registry->registerSuiteConfiguration( - $suiteName, - $config['type'], - $config['settings'] - ); + // Suite name always omits vendor + $suiteName = $module->getShortName(); + } else { + // Get module from suite + $suiteName = $input->getOption('suite'); + $module = $this->getModule($suiteName, false); } + // Load registered suite + if (isset($this->suiteConfigurations[$suiteName])) { + $config = $this->suiteConfigurations[$suiteName]; + } elseif ($module) { + // Suite doesn't exist, so load dynamically from nested `behat.yml` + $config = $this->loadSuiteConfiguration($suiteName, $module); + } else { + throw new InvalidArgumentException("Could not find suite config {$suiteName}"); + } + + // Register config + $this->registry->registerSuiteConfiguration( + $suiteName, + $config['type'], + $config['settings'] + ); return null; } @@ -133,7 +163,7 @@ class ModuleSuiteLocator implements Controller } } } - throw new \InvalidArgumentException("No behat.yml found for module " . $module->getName()); + throw new InvalidArgumentException("No behat.yml found for module " . $module->getName()); } /** diff --git a/src/Extension.php b/src/Extension.php index e6a5478..a864af8 100644 --- a/src/Extension.php +++ b/src/Extension.php @@ -149,11 +149,9 @@ class Extension implements ExtensionInterface new Reference(SuiteExtension::REGISTRY_ID) ]); $definition->addTag(CliExtension::CONTROLLER_TAG, ['priority' => 9999]); - $container->setDefinition(CliExtension::CONTROLLER_TAG . '.sslocator', $definition); + $container->setDefinition(CliExtension::CONTROLLER_TAG . '.suite', $definition); } - - /** * Loads suite bootstrap controller. * This is responsible for invoking --init commands for modules.