Skip to content

Commit

Permalink
MDL-72446 behat: Ensure that the day reset happens on enabled element
Browse files Browse the repository at this point in the history
Before this change we were setting the month day to 1 unconditionally
and that was working ok for enabled by default elements.

But in a number or cases we were doing that against disabled elements
so the day reset was not happening. Now we wait for the element to
be enabled and only then proceed with the day reset.

Backed with tests using disabled form elements, so we have now
both enabled and disabled fields covered.
  • Loading branch information
stronk7 committed Mar 31, 2022
1 parent 3ab09c7 commit 7806534
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 9 deletions.
18 changes: 10 additions & 8 deletions lib/behat/form_field/behat_form_date.php
Expand Up @@ -56,17 +56,19 @@ public function set_value($value) {
// Disable the given date selector field.
$this->set_child_field_value('enabled', false);
} else if (is_numeric($value)) { // The value is numeric (unix timestamp).
// First, reset the day always to an existing one (1st). Without that
// undesired modifications (JS) happens when changing of month and day if
// the interim combination doesn't exists (for example, 31 March => 01 April).
// Note that instead of always setting the day to 1, this could be a little more
// clever, for example only changing when the day > 28, or only when the
// months (current or changed) have less days that the other. But that would
// require more complex calculations than the simpler line below.
$this->set_child_field_value('day', 1);
// 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);
if ($childname === 'enabled') {
// As soon as the form is enabled, reset the day to an existing one (1st). Without that
// undesired modifications (JS) happens when changing of month and day if
// the interim combination doesn't exists (for example, 31 March => 01 April).
// Note that instead of always setting the day to 1, this could be a little more
// clever, for example only changing when the day > 28, or only when the
// months (current or changed) have less days that the other. But that would
// require more complex calculations than the simpler line below.
$this->set_child_field_value('day', 1);
}
}
} else { // Invalid value.
// Get the name of the field.
Expand Down
30 changes: 29 additions & 1 deletion lib/tests/behat/datetime_any.feature
Expand Up @@ -5,7 +5,7 @@ Feature: Any day / month / year combination in date form elements works ok.
Any day / month / year combination must work ok

@javascript
Scenario Outline: Verify that setting any date / datetime is possible
Scenario Outline: Verify that setting any date / datetime is possible with enabled fields
Given the following "courses" exist:
| fullname | shortname | format |
| Course 1 | C1 | topics |
Expand All @@ -30,3 +30,31 @@ Feature: Any day / month / year combination in date form elements works ok.
| 1709186400 | 1740808800 | Saturday, 1 March 2025, 2:00 | |
| 1577858400 | 1577772000 | Tuesday, 31 December 2019, 2:00 | change of year, back and forth |
| 1577772000 | 1577858400 | Wednesday, 1 January 2020, 2:00 | |

@javascript
Scenario Outline: Verify that setting any date / datetime is possible with disabled fields
Given the following "courses" exist:
| fullname | shortname | format |
| Course 1 | C1 | topics |
And the following "activity" exist:
| activity | name | intro | course | idnumber |
| assign | Assignment 01 | Assign activity to test some dates | C1 | assign01 |
And I am on the "Assignment 01" "assign activity editing" page logged in as admin
And I expand all fieldsets
And I set the field "Due date" to "<initial_date>"
And I set the field "Due date" to "disabled"
And I set the field "Due date" to "<final_date>"
When I press "Save and display"
Then the activity date in "Assignment 01" should contain "Due:"
And the activity date in "Assignment 01" should contain "<date_result>"

Examples:
| initial_date | final_date | date_result | case_explanation (times Australia/Perth) |
| ##today## | ##tomorrow noon## | ##tomorrow noon##%A, %d %B %Y, %I:%M## | change of day, any day, back and forth |
| ##tomorrow## | ##today noon## | ##today noon##%A, %d %B %Y, %I:%M## | |
| 1617256800 | 1617170400 | Wednesday, 31 March 2021, 2:00 | change of month, back and forth |
| 1617170400 | 1617256800 | Thursday, 1 April 2021, 2:00 | |
| 1740808800 | 1709186400 | Thursday, 29 February 2024, 2:00 | change of month, leap year, back and forth |
| 1709186400 | 1740808800 | Saturday, 1 March 2025, 2:00 | |
| 1577858400 | 1577772000 | Tuesday, 31 December 2019, 2:00 | change of year, back and forth |
| 1577772000 | 1577858400 | Wednesday, 1 January 2020, 2:00 | |

0 comments on commit 7806534

Please sign in to comment.