// params hierarchy. More info: http://docs.behat.org/guides/7.config.html
// Example:
// $CFG->behat_config = array(
-// 'default' => array(
-// 'formatter' => array(
-// 'name' => 'pretty',
-// 'parameters' => array(
-// 'decorated' => true,
-// 'verbose' => false
-// )
-// )
-// ),
// 'Mac-Firefox' => array(
// 'suites' => array (
// 'default' => array(
// )
// )
// );
+// You can also use the following config to override default Moodle configuration for Behat.
+// This config is limited to default suite and will be supported in later versions.
+// It will have precedence over $CFG->behat_config.
+// $CFG->behat_profiles = array(
+// 'phantomjs' => array(
+// 'browser' => 'phantomjs',
+// 'tags' => '~@_file_upload&&~@_alert&&~@_bug_phantomjs',
+// 'wd_host' => 'http://127.0.0.1:4443/wd/hub',
+// 'capabilities' => array(
+// 'platform' => 'Linux',
+// 'version' => 2.1
+// )
+// ),
+// );
//
// You can force the browser session (not user's sessions) to restart after N seconds. This could
// be useful if you are using a cloud-based service with time restrictions in the browser side.
*/
class behat_config_manager {
+ /**
+ * @var bool Keep track of the automatic profile conversion. So we can notify user.
+ */
+ public static $autoprofileconversion = false;
+
/**
* Updates a config file
*
// In case user defined overrides respect them over our default ones.
if (!empty($CFG->behat_config)) {
- $config = self::merge_config($config, $CFG->behat_config);
+ foreach ($CFG->behat_config as $profile => $values) {
+ $config = self::merge_config($config, self::merge_behat_config($profile, $values));
+ }
+ }
+ // Check for Moodle custom ones.
+ if (!empty($CFG->behat_profiles) && is_array($CFG->behat_profiles)) {
+ foreach ($CFG->behat_profiles as $profile => $values) {
+ $config = self::merge_config($config, self::get_behat_profile($profile, $values));
+ }
}
return Symfony\Component\Yaml\Yaml::dump($config, 10, 2);
}
+ /**
+ * Parse $CFG->behat_config and return the array with required config structure for behat.yml
+ *
+ * @param string $profile profile name
+ * @param array $values values for profile
+ * @return array
+ */
+ protected static function merge_behat_config($profile, $values) {
+ // Only add profile which are compatible with Behat 3.x
+ // Just check if any of Bheat 2.5 config is set. Not checking for 3.x as it might have some other configs
+ // Like : rerun_cache etc.
+ if (!isset($values['filters']['tags']) && !isset($values['extensions']['Behat\MinkExtension\Extension'])) {
+ return array($profile => $values);
+ }
+
+ // Parse 2.5 format and get related values.
+ $oldconfigvalues = array();
+ if (isset($values['extensions']['Behat\MinkExtension\Extension'])) {
+ $extensionvalues = $values['extensions']['Behat\MinkExtension\Extension'];
+ if (isset($extensionvalues['selenium2']['browser'])) {
+ $oldconfigvalues['browser'] = $extensionvalues['selenium2']['browser'];
+ }
+ if (isset($extensionvalues['selenium2']['wd_host'])) {
+ $oldconfigvalues['wd_host'] = $extensionvalues['selenium2']['wd_host'];
+ }
+ if (isset($extensionvalues['capabilities'])) {
+ $oldconfigvalues['capabilities'] = $extensionvalues['capabilities'];
+ }
+ }
+
+ if (isset($values['filters']['tags'])) {
+ $oldconfigvalues['tags'] = $values['filters']['tags'];
+ }
+
+ if (!empty($oldconfigvalues)) {
+ self::$autoprofileconversion = true;
+ return self::get_behat_profile($profile, $oldconfigvalues);
+ }
+
+ // If nothing set above then return empty array.
+ return array();
+ }
+
+ /**
+ * Parse $CFG->behat_profile and return the array with required config structure for behat.yml.
+ *
+ * $CFG->behat_profiles = array(
+ * 'profile' = array(
+ * 'browser' => 'firefox',
+ * 'tags' => '@javascript',
+ * 'wd_host' => 'http://127.0.0.1:4444/wd/hub',
+ * 'capabilities' => array(
+ * 'platform' => 'Linux',
+ * 'version' => 44
+ * )
+ * )
+ * );
+ *
+ * @param string $profile profile name
+ * @param array $values values for profile.
+ * @return array
+ */
+ protected static function get_behat_profile($profile, $values) {
+ // Values should be an array.
+ if (!is_array($values)) {
+ return array();
+ }
+
+ // Check suite values.
+ $behatprofilesuites = array();
+ // Fill tags information.
+ if (isset($values['tags'])) {
+ $behatprofilesuites = array(
+ 'suites' => array(
+ 'default' => array(
+ 'filters' => array(
+ 'tags' => $values['tags'],
+ )
+ )
+ )
+ );
+ }
+
+ // Selenium2 config values.
+ $behatprofileextension = array();
+ $seleniumconfig = array();
+ if (isset($values['browser'])) {
+ $seleniumconfig['browser'] = $values['browser'];
+ }
+ if (isset($values['wd_host'])) {
+ $seleniumconfig['wd_host'] = $values['wd_host'];
+ }
+ if (isset($values['capabilities'])) {
+ $seleniumconfig['capabilities'] = $values['capabilities'];
+ }
+ if (!empty($seleniumconfig)) {
+ $behatprofileextension = array(
+ 'extensions' => array(
+ 'Behat\MinkExtension' => array(
+ 'selenium2' => $seleniumconfig,
+ )
+ )
+ );
+ }
+
+ return array($profile => array_merge($behatprofilesuites, $behatprofileextension));
+ }
+
/**
* Attempt to split feature list into fairish buckets using timing information, if available.
* Simply add each one to lightest buckets until all files allocated.