diff --git a/lib/behat/form_field/behat_form_date.php b/lib/behat/form_field/behat_form_date.php new file mode 100644 index 0000000000000..010b5aaffc86f --- /dev/null +++ b/lib/behat/form_field/behat_form_date.php @@ -0,0 +1,101 @@ +. + +/** + * Date form field class. + * + * @package core_form + * @category test + * @copyright 2013 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_group.php'); + +use Behat\Mink\Exception\ExpectationException; + +/** + * Date form field. + * + * This class will be refactored in case we are interested in + * creating more complex formats to fill date and date-time fields. + * + * @package core_form + * @category test + * @copyright 2013 David Monllaó + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class behat_form_date extends behat_form_group { + + /** + * Sets the value to a date field. + * + * @param string $value The value to be assigned to the date selector field. The string value must be either + * parsable into a UNIX timestamp or equal to 'disabled' (if disabling the date selector). + * @return void + * @throws ExpectationException If the value is invalid. + */ + public function set_value($value) { + + if ($value === 'disabled') { + // Disable the given date selector field. + $this->set_child_field_value('enabled', false); + } else if (is_numeric($value)) { // The value is numeric (unix timestamp). + // Assign the mapped values to each form element in the date selector field. + foreach ($this->get_mapped_fields($value) as $childname => $childvalue) { + $this->set_child_field_value($childname, $childvalue); + } + } else { // Invalid value. + // Get the name of the field. + $fieldname = $this->field->find('css', 'legend')->getHtml(); + throw new ExpectationException("Invalid value for '{$fieldname}'", $this->session); + } + } + + /** + * Returns the date field identifiers and the values that should be assigned to them. + * + * @param int $timestamp The UNIX timestamp + * @return array + */ + protected function get_mapped_fields(int $timestamp): array { + return [ + 'enabled' => true, + 'day' => date('j', $timestamp), + 'month' => date('n', $timestamp), + 'year' => date('Y', $timestamp), + ]; + } + + /** + * Sets a value to a child element in the date form field. + * + * @param string $childname The name of the child field + * @param string|bool $childvalue The value + */ + private function set_child_field_value(string $childname, $childvalue) { + // Find the given child form element in the date selector field. + $childelement = $this->field->find('css', "*[name$='[{$childname}]']"); + if ($childelement) { + // Get the field instance for the given child form element. + $childinstance = $this->get_field_instance_for_element($childelement); + // Set the value to the child form element. + $childinstance->set_value($childvalue); + } + } +} diff --git a/lib/behat/form_field/behat_form_date_selector.php b/lib/behat/form_field/behat_form_date_selector.php deleted file mode 100644 index 71c477c959674..0000000000000 --- a/lib/behat/form_field/behat_form_date_selector.php +++ /dev/null @@ -1,42 +0,0 @@ -. - -/** - * Date form field class. - * - * @package core_form - * @category test - * @copyright 2013 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_group.php'); - -/** - * Date form field. - * - * This class will be refactored in case we are interested in - * creating more complex formats to fill date and date-time fields. - * - * @package core_form - * @category test - * @copyright 2013 David Monllaó - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -class behat_form_date_selector extends behat_form_group { -} diff --git a/lib/form/templates/element-date_selector.mustache b/lib/form/templates/element-date_selector.mustache index a7176b14d5569..c406d911920d3 100644 --- a/lib/form/templates/element-date_selector.mustache +++ b/lib/form/templates/element-date_selector.mustache @@ -1,6 +1,6 @@ {{< core_form/element-group }} {{$element}} -
+
{{label}} {{#element.elements}} diff --git a/lib/upgrade.txt b/lib/upgrade.txt index d5b605bcec32f..b8051b02ea529 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -4,6 +4,9 @@ information provided here is intended especially for developers. === 3.9.4 === * New optional parameter $extracontent for print_collapsible_region_start(). This allows developers to add interactive HTML elements (e.g. a help icon) after the collapsible region's toggle link. +* Behat now supports date selection from the date form element. Examples: + - I set the field "" to "##15 March 2021##" + - I set the field "" to "##first day of January last year##" === 3.9.3 === * New DML function $DB->delete_records_subquery() to delete records based on a subquery in a way