Permalink
Browse files

Merge branch 'MDL-44619_26' of git://github.com/dmonllao/moodle into …

…MOODLE_26_STABLE
  • Loading branch information...
danpoltawski committed Apr 17, 2014
2 parents 422737c + f791924 commit b2f7a0b31fe8a6810520d981a745af751119e246
@@ -349,9 +349,7 @@ protected function fill_backup_restore_form($options) {
foreach ($datahash as $locator => $value) {
try {
// Using $this->find* to enforce stability over speed.
$fieldnode = $this->find_field($locator);
$field = behat_field_manager::get_form_field($fieldnode, $this->getSession());
$field = behat_field_manager::get_form_field_from_label($locator, $this);
$field->set_value($value);
} catch (ElementNotFoundException $e) {
@@ -26,7 +26,9 @@
// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php.
use Behat\Mink\Session as Session,
Behat\Mink\Element\NodeElement as NodeElement;
Behat\Mink\Element\NodeElement as NodeElement,
Behat\Mink\Exception\ElementNotFoundException as ElementNotFoundException,
Behat\MinkExtension\Context\RawMinkContext as RawMinkContext;
/**
* Helper to interact with form fields.
@@ -38,6 +40,30 @@
*/
class behat_field_manager {
/**
* Gets an instance of the form field from it's label
*
* @param string $label
* @param RawMinkContext $context
* @return behat_form_field
*/
public static function get_form_field_from_label($label, RawMinkContext $context) {
// There are moodle form elements that are not directly related with
// a basic HTML form field, we should also take care of them.
try {
// The DOM node.
$fieldnode = $context->find_field($label);
} catch (ElementNotFoundException $e) {
// Looking for labels that points to filemanagers.
$fieldnode = $context->find_filemanager($label);
}
// The behat field manager.
return self::get_form_field($fieldnode, $context->getSession());
}
/**
* Gets an instance of the form field.
*
@@ -217,6 +243,7 @@ protected static function get_field_node_type(NodeElement $fieldnode, Session $s
* @todo MDL-XXXXX This will be deleted in Moodle 2.8
* @see behat_field_manager::get_form_field()
* @param NodeElement $fieldnode
* @param string $locator
* @param Session $session The behat browser session
* @return behat_form_field
*/
@@ -237,6 +264,7 @@ public static function get_field(NodeElement $fieldnode, $locator, Session $sess
* @todo MDL-XXXXX This will be deleted in Moodle 2.8
* @see behat_field_manager::get_field_node_type()
* @param NodeElement $fieldnode The current node.
* @param string $locator
* @param Session $session The behat browser session
* @return mixed A NodeElement if we continue looking for the element type and String or false when we are done.
*/
@@ -0,0 +1,111 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Helper to initialise behat contexts from moodle code.
*
* @package core
* @category test
* @copyright 2014 David Monllaó
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php.
use Behat\Mink\Session as Session,
Behat\Mink\Mink as Mink;
/**
* Helper to get behat contexts.
*
* @package core
* @category test
* @copyright 2014 David Monllaó
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class behat_context_helper {
/**
* List of already initialized contexts.
*
* @var array
*/
protected static $contexts = array();
/**
* @var Mink.
*/
protected static $mink = false;
/**
* Sets the browser session.
*
* @param Session $session
* @return void
*/
public static function set_session(Session $session) {
// Set mink to be able to init a context.
self::$mink = new Mink(array('mink' => $session));
self::$mink->setDefaultSessionName('mink');
}
/**
* Gets the required context.
*
* Getting a context you get access to all the steps
* that uses direct API calls; steps returning step chains
* can not be executed like this.
*
* @throws coding_exception
* @param string $classname Context identifier (the class name).
* @return behat_base
*/
public static function get($classname) {
if (!self::init_context($classname)) {
throw coding_exception('The required "' . $classname . '" class does not exist');
}
return self::$contexts[$classname];
}
/**
* Initializes the required context.
*
* @throws coding_exception
* @param string $classname
* @return bool
*/
protected static function init_context($classname) {
if (!empty(self::$contexts[$classname])) {
return true;
}
if (!class_exists($classname)) {
return false;
}
$instance = new $classname();
$instance->setMink(self::$mink);
self::$contexts[$classname] = $instance;
return true;
}
}
@@ -64,6 +64,7 @@ class behat_selectors {
'checkbox' => 'checkbox',
'radio' => 'radio',
'file' => 'file',
'filemanager' => 'filemanager',
'optgroup' => 'optgroup',
'option' => 'option',
'table' => 'table',
@@ -98,6 +99,9 @@ class behat_selectors {
XPATH
, 'table_row' => <<<XPATH
.//tr[contains(normalize-space(.), %locator%)]
XPATH
, 'filemanager' => <<<XPATH
//div[contains(concat(' ', normalize-space(@class), ' '), ' ffilemanager ')]/descendant::input[@id = //label[contains(normalize-space(string(.)), %locator%)]/@for]
XPATH
);
@@ -50,6 +50,12 @@ class behat_form_field {
*/
protected $field;
/**
* @var string The field's locator.
*/
protected $fieldlocator = false;
/**
* General constructor with the node and the session to interact with.
*
@@ -171,4 +177,63 @@ protected function text_matches($expectedvalue) {
}
return true;
}
/**
* Gets the field locator.
*
* Defaults to the field label but you can
* specify other locators if you are interested.
*
* Public visibility as in most cases will be hard to
* use this method in a generic way, as fields can
* be selected using multiple ways (label, id, name...).
*
* @throws coding_exception
* @param string $locatortype
* @return string
*/
protected function get_field_locator($locatortype = false) {
if (!empty($this->fieldlocator)) {
return $this->fieldlocator;
}
$fieldid = $this->field->getAttribute('id');
// Defaults to label.
if ($locatortype == 'label' || $locatortype == false) {
$labelnode = $this->session->getPage()->find('xpath', '//label[@for="' . $fieldid . '"]');
// Exception only if $locatortype was specified.
if (!$labelnode && $locatortype == 'label') {
throw new coding_exception('Field with "' . $fieldid . '" id does not have a label.');
}
$this->fieldlocator = $labelnode->getText();
}
// Let's look for the name as a second option (more popular than
// id's when pointing to fields).
if (($locatortype == 'name' || $locatortype == false) &&
empty($this->fieldlocator)) {
$name = $this->field->getAttribute('name');
// Exception only if $locatortype was specified.
if (!$name && $locatortype == 'name') {
throw new coding_exception('Field with "' . $fieldid . '" id does not have a name attribute.');
}
$this->fieldlocator = $name;
}
// Otherwise returns the id if no specific locator type was provided.
if (empty($this->fieldlocator)) {
$this->fieldlocator = $fieldid;
}
return $this->fieldlocator;
}
}
@@ -0,0 +1,122 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* File manager form element.
*
* @package core_form
* @category test
* @copyright 2014 David Monllaó
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php.
require_once(__DIR__ . '/behat_form_field.php');
/**
* File manager form field.
*
* Simple filemanager field manager to allow
* forms to be filled using TableNodes. It only
* adds files and checks the field contents in the
* root directory. If you want to run complex actions
* that involves subdirectories or other repositories
* than 'Upload a file' you should use steps related with
* behat_filepicker::i_add_file_from_repository_to_filemanager
* this is intended to be used with multi-field
*
* This field manager allows you to:
* - Get: A comma-separated list of the root directory
* file names, including folders.
* - Set: Add a file, in case you want to add more than
* one file you can always set two table rows using
* the same locator.
* - Match: A comma-separated list of file names.
*
* @package core_form
* @category test
* @copyright 2014 David Monllaó
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class behat_form_filemanager extends behat_form_field {
/**
* Gets the value.
*
* @return string A comma-separated list of the root directory file names.
*/
public function get_value() {
// Wait until DOM and JS is ready.
$this->session->wait(behat_base::TIMEOUT, behat_base::PAGE_READY_JS);
// Get the label to restrict the files to this single form field.
$fieldlabel = $this->get_field_locator();
// Get the name of the current directory elements.
$xpath = "//label[contains(., '" . $fieldlabel . "')]" .
"/ancestor::div[contains(concat(' ', normalize-space(@class), ' '), ' fitemtitle ')]" .
"/following-sibling::div[contains(concat(' ', normalize-space(@class), ' '), ' ffilemanager ')]" .
"/descendant::div[contains(concat(' ', normalize-space(@class), ' '), ' fp-filename ')]";
// We don't need to wait here, also we don't have access to protected
// contexts find* methods.
$files = $this->session->getPage()->findAll('xpath', $xpath);
if (!$files) {
return '';
}
$filenames = array();
foreach ($files as $filenode) {
$filenames[] = $filenode->getText();
}
return implode(',', $filenames);
}
/**
* Sets the field value.
*
* @param string $value
* @return void
*/
public function set_value($value) {
// Getting the filemanager label from the DOM.
$fieldlabel = $this->get_field_locator();
// Getting the filepicker context and using the step definition
// to upload the requested file.
$uploadcontext = behat_context_helper::get('behat_repository_upload');
$uploadcontext->i_upload_file_to_filemanager($value, $fieldlabel);
}
/**
* Matches the provided filename/s against the current field value.
*
* If the filemanager contains more than one file the $expectedvalue
* value should include all the file names separating them by comma.
*
* @param string $expectedvalue
* @return bool The provided value matches the field value?
*/
public function matches($expectedvalue) {
return $this->text_matches($expectedvalue);
}
}
Oops, something went wrong.

0 comments on commit b2f7a0b

Please sign in to comment.