From e43a539e100b36d670d392b6a30c3eb0f294db34 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Sun, 26 Apr 2020 14:20:30 +0100 Subject: [PATCH] MDL-57680 form autocomplete: extend Behat tests --- lib/form/tests/behat/autocomplete.feature | 42 +++++++++- lib/form/tests/behat/behat_core_form.php | 82 +++++++++++++++++++ .../fixtures/autocomplete-disabledif.php | 66 +++++++++++++++ 3 files changed, 187 insertions(+), 3 deletions(-) create mode 100644 lib/form/tests/behat/behat_core_form.php create mode 100644 lib/form/tests/fixtures/autocomplete-disabledif.php diff --git a/lib/form/tests/behat/autocomplete.feature b/lib/form/tests/behat/autocomplete.feature index b6882dfaa65..b4c805ea85d 100644 --- a/lib/form/tests/behat/autocomplete.feature +++ b/lib/form/tests/behat/autocomplete.feature @@ -4,18 +4,18 @@ Feature: Autocomplete functionality in forms As a user I need to use the autocomplete form element - Background: + Scenario: Use autocomplete element which accepts a single value Given the following "users" exist: | username | firstname | lastname | | user1 | Jane | Jones | | user2 | Sam | Smith | And I log in as "admin" - Scenario: Use autocomplete element which accepts a single value When I navigate to "Users > Privacy and policies > Data requests" in site administration And I follow "New request" And I open the autocomplete suggestions list And I click on "Jane Jones" item in the autocomplete list + Then "Jane Jones" "autocomplete_selection" should exist # Change selection And I open the autocomplete suggestions list @@ -25,4 +25,40 @@ Feature: Autocomplete functionality in forms # Remove selection And I click on "Sam Smith" "autocomplete_selection" And "Sam Smith" "autocomplete_selection" should not exist - And I should see "No selection" in the ".form-autocomplete-selection" "css_element" \ No newline at end of file + And I should see "No selection" in the ".form-autocomplete-selection" "css_element" + + @javascript + Scenario: Single-select autocomplete can be cleared after being set + Given the following "courses" exist: + | fullname | shortname | + | Course 1 | C1 | + And I am on the "autocomplete-disabledif" "core_form > Fixture" page logged in as "admin" + When I set the field "Controls the rest" to "Course 1" + And "Course 1" "autocomplete_selection" should be visible + And I click on "Course 1" "autocomplete_selection" + Then "frog" "autocomplete_selection" should not exist + + @javascript + Scenario: Single-select autocomplete can be cleared immediately after page load + Given the following "courses" exist: + | fullname | shortname | + | Course 1 | C1 | + And I am on the "autocomplete-disabledif" "core_form > Fixture" page logged in as "admin" + When I set the field "Controls the rest" to "Course 1" + And I press "Save changes" + And "Course 1" "autocomplete_selection" should be visible + And I click on "Course 1" "autocomplete_selection" + Then "frog" "autocomplete_selection" should not exist + + @javascript + Scenario: Autocomplete can control other form fields via disabledIf + Given the following "courses" exist: + | fullname | shortname | + | Course 1 | C1 | + And I am on the "autocomplete-disabledif" "core_form > Fixture" page logged in as "admin" + When I set the field "Controls the rest" to "Course 1" + Then the "Single select will be enabled if the control is blank" "field" should be disabled + And the "Single select will be disabled if the control is blank" "field" should be enabled + And I click on "Course 1" "autocomplete_selection" + And the "Single select will be enabled if the control is blank" "field" should be enabled + And the "Single select will be disabled if the control is blank" "field" should be disabled diff --git a/lib/form/tests/behat/behat_core_form.php b/lib/form/tests/behat/behat_core_form.php new file mode 100644 index 00000000000..eb88d7b350f --- /dev/null +++ b/lib/form/tests/behat/behat_core_form.php @@ -0,0 +1,82 @@ +. + +/** + * Steps definitions related to mod_quiz. + * + * @package core_form + * @category test + * @copyright 2020 The Open University + * @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__ . '/../../../../lib/behat/behat_base.php'); +require_once(__DIR__ . '/../../../../question/tests/behat/behat_question_base.php'); + +use Behat\Gherkin\Node\TableNode as TableNode; + +use Behat\Mink\Exception\ExpectationException as ExpectationException; + +/** + * Steps definitions related to core_form. + */ +class behat_core_form extends behat_question_base { + + /** + * Convert page names to URLs for steps like 'When I am on the "core_form > [page name]" page'. + * + * Recognised page names are: + * | None so far! | | + * + * @param string $page name of the page, with the component name removed e.g. 'Admin notification'. + * @return moodle_url the corresponding URL. + * @throws Exception with a meaningful error message if the specified page cannot be found. + */ + protected function resolve_page_url(string $page): moodle_url { + switch ($page) { + default: + throw new Exception('Unrecognised core_form page type "' . $page . '."'); + } + } + + /** + * Convert page names to URLs for steps like 'When I am on the "[identifier]" "core_form > [page type]" page'. + * + * Recognised page names are: + * | pagetype | name meaning | description | + * | Fixture | script-name | Fixture file name without extension | + * + * The fixture name should be the filename without path or extension. E.g. + * autocomplete-disabledif for lib/form/tests/fixtures/autocomplete-disabledif.php. + * + * @param string $type identifies which type of page this is, e.g. 'Fixture'. + * @param string $identifier identifies the particular page, e.g. 'autocomplete-disabledif'. + * @return moodle_url the corresponding URL. + * @throws Exception with a meaningful error message if the specified page cannot be found. + */ + protected function resolve_page_instance_url(string $type, string $identifier): moodle_url { + switch ($type) { + case 'Fixture': + return new moodle_url('/lib/form/tests/fixtures/' . + clean_param($identifier, PARAM_ALPHAEXT) . '.php'); + + default: + throw new Exception('Unrecognised core_form page type "' . $type . '."'); + } + } +} diff --git a/lib/form/tests/fixtures/autocomplete-disabledif.php b/lib/form/tests/fixtures/autocomplete-disabledif.php new file mode 100644 index 00000000000..6c4a61179e2 --- /dev/null +++ b/lib/form/tests/fixtures/autocomplete-disabledif.php @@ -0,0 +1,66 @@ +. + +/** + * Test form for testing autocomplete behaviour. + * + * @copyright 2020 The Open University + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once(__DIR__ . '/../../../../config.php'); +require_once($CFG->libdir . '/formslib.php'); + +if (!defined('BEHAT_SITE_RUNNING')) { + throw new coding_exception('This fixture can only be used in Behat tests.'); +} +require_login(); +require_capability('moodle/site:config', context_system::instance()); + + +/** + * The form class for our test. + */ +class test_form extends moodleform { + + protected function definition() { + $mform = $this->_form; + + $mform->addElement('course', 'x', 'Controls the rest'); + + $mform->addElement('text', 'enabledifblank', 'Single select will be enabled if the control is blank'); + $mform->disabledIf('enabledifblank', 'x', 'neq', ''); + $mform->setType('enabledifblank', PARAM_RAW); + + $mform->addElement('text', 'disabledifblank', 'Single select will be disabled if the control is blank'); + $mform->disabledIf('disabledifblank', 'x', 'eq', ''); + $mform->setType('disabledifblank', PARAM_RAW); + + $this->add_action_buttons(); + } +} + +$PAGE->set_context(context_system::instance()); +$PAGE->set_url('/lib/form/tests/fixtures/autocomplete-disabledif.php'); +echo $OUTPUT->header(); + +$form = new test_form(); +if ($data = $form->get_data()) { + echo $OUTPUT->notification("Data was submitted (but still re-showing form).", 'success'); +} + +$form->display(); +echo $OUTPUT->footer();