From 7a7375df4d18543a0a3bf077b64bed0510ec97a1 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Mon, 8 Nov 2021 12:05:07 +0000 Subject: [PATCH] MDL-72696 behat: support inplace editable fields of type select. If an inplace editable field is using the "select" type, we should treat it as a select field when setting it's value during scenarios. --- lib/behat/behat_field_manager.php | 7 ++- .../behat_form_inplaceeditable_select.php | 51 +++++++++++++++++++ .../tests/behat/behat_reportbuilder.php | 4 -- 3 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 lib/behat/form_field/behat_form_inplaceeditable_select.php diff --git a/lib/behat/behat_field_manager.php b/lib/behat/behat_field_manager.php index 0f386b71514..1b78e535d27 100644 --- a/lib/behat/behat_field_manager.php +++ b/lib/behat/behat_field_manager.php @@ -181,7 +181,12 @@ class behat_field_manager { if ($tagname == 'span') { if ($node->hasAttribute('data-inplaceeditable') && $node->getAttribute('data-inplaceeditable')) { - return 'inplaceeditable'; + // Determine appropriate editable type of this field (text or select). + if ($node->getAttribute('data-type') == 'select') { + return 'inplaceeditable_select'; + } else { + return 'inplaceeditable'; + } } } diff --git a/lib/behat/form_field/behat_form_inplaceeditable_select.php b/lib/behat/form_field/behat_form_inplaceeditable_select.php new file mode 100644 index 00000000000..90b85a3dbe3 --- /dev/null +++ b/lib/behat/form_field/behat_form_inplaceeditable_select.php @@ -0,0 +1,51 @@ +. + +// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php. + +require_once(__DIR__ . '/behat_form_select.php'); + +/** + * Custom interaction with inplace editable elements of type select + * + * @package core_form + * @copyright 2021 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class behat_form_inplaceeditable_select extends behat_form_select { + + /** + * Sets the value to a field + * + * @param string $value + */ + public function set_value($value): void { + // Require JS to run this step. + self::require_javascript(); + + // Enable editing. + self::execute('behat_general::i_click_on_in_the', [ + '[data-inplaceeditablelink]', + 'css_element', + $this->field, + 'NodeElement', + ]); + + // After editing is enabled, set the select field value. + $select = $this->field->find('css', 'select'); + $select->selectOption($value); + } +} diff --git a/reportbuilder/tests/behat/behat_reportbuilder.php b/reportbuilder/tests/behat/behat_reportbuilder.php index 2c9c6a88401..02b2d6b8c8d 100644 --- a/reportbuilder/tests/behat/behat_reportbuilder.php +++ b/reportbuilder/tests/behat/behat_reportbuilder.php @@ -93,10 +93,6 @@ class behat_reportbuilder extends behat_base { } $editlabel = get_string('aggregatecolumn', 'core_reportbuilder', $column); - - // Work around for MDL-72696, which treats all inplace_editable elements as text boxes and causes unpredictable - // behaviour in Chrome when it types characters into an inplace_editable of type select (it selects the wrong option). - $this->execute('behat_general::i_click_on', [$this->escape($editlabel), 'link']); $this->execute('behat_forms::i_set_the_field_to', [$this->escape($editlabel), $this->escape($aggregation)]); } }