diff --git a/group/tests/behat/create_groups.feature b/group/tests/behat/create_groups.feature index 160d71208e6..c6e3f84e3e3 100644 --- a/group/tests/behat/create_groups.feature +++ b/group/tests/behat/create_groups.feature @@ -58,3 +58,36 @@ Feature: Organize students into groups And I should see "Student 2" And I should see "Student 3" And I should not see "Student 0" + + @javascript + Scenario: Create groups and groupings without the 'moodle/course:changeidnumber' capability + Given the following "courses" exists: + | fullname | shortname | category | groupmode | + | Course 1 | C1 | 0 | 1 | + And the following "users" exists: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@asd.com | + And the following "course enrolments" exists: + | user | course | role | + | teacher1 | C1 | editingteacher | + And I log in as "admin" + And I set the following system permissions of "Teacher" role: + | moodle/course:changeidnumber | Prevent | + And I log out + And I log in as "teacher1" + And I follow "Course 1" + And I expand "Users" node + And I follow "Groups" + When I press "Create group" + Then the "idnumber" "field" should be readonly + And I fill the moodle form with: + | Group name | The greatest group that never existed | + And I press "Save changes" + And I should see "The greatest group that never existed" + And I follow "Groupings" + And I press "Create grouping" + And the "idnumber" "field" should be readonly + And I fill the moodle form with: + | Grouping name | Not the greatest grouping, but it's ok! | + And I press "Save changes" + And I should see "Not the greatest grouping, but it's ok!" diff --git a/group/tests/behat/delete_groups.feature b/group/tests/behat/delete_groups.feature new file mode 100644 index 00000000000..239e5774025 --- /dev/null +++ b/group/tests/behat/delete_groups.feature @@ -0,0 +1,81 @@ +@core @core_group +Feature: Automatic deletion of groups and groupings + In order to check the expected results occur when deleting groups and groupings in different scenarios + As a teacher + I need to create groups and groupings under different scenarios and check that the expected result occurs when attempting to delete them. + + Background: + Given the following "courses" exists: + | fullname | shortname | format | + | Course 1 | C1 | topics | + And the following "users" exists: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@asd.com | + And the following "course enrolments" exists: + | user | course | role | + | teacher1 | C1 | editingteacher | + And I log in as "teacher1" + And I follow "Course 1" + And I expand "Users" node + And I follow "Groups" + And I press "Create group" + And I fill the moodle form with: + | Group name | Group (without ID) | + And I press "Save changes" + And I press "Create group" + And I fill the moodle form with: + | Group name | Group (with ID) | + | Group ID number | An ID | + And I press "Save changes" + And I follow "Groupings" + And I press "Create grouping" + And I fill the moodle form with: + | Grouping name | Grouping (without ID) | + And I press "Save changes" + And I press "Create grouping" + And I fill the moodle form with: + | Grouping name | Grouping (with ID) | + | Grouping ID number | An ID | + And I press "Save changes" + And I follow "Groups" + + @javascript + Scenario: Delete groups and groupings with and without ID numbers + Given I select "Group (without ID) (0)" from "groups" + And I press "Delete selected group" + And I press "Yes" + Then the "groups" select box should not contain "Group (without ID) (0)" + And I select "Group (with ID) (0)" from "groups" + And I press "Delete selected group" + And I press "Yes" + And the "groups" select box should not contain "Group (with ID) (0)" + And I follow "Groupings" + And I click on "Delete" "link" in the "Grouping (without ID)" "table_row" + And I press "Yes" + And I should not see "Grouping (without ID)" + And I click on "Delete" "link" in the "Grouping (with ID)" "table_row" + And I press "Yes" + And I should not see "Grouping (with ID)" + + @javascript + Scenario: Delete groups and groupings with and without ID numbers without the 'moodle/course:changeidnumber' capability + Given I log out + And I log in as "admin" + And I set the following system permissions of "Teacher" role: + | moodle/course:changeidnumber | Prevent | + And I log out + And I log in as "teacher1" + And I follow "Course 1" + And I expand "Users" node + And I follow "Groups" + When I select "Group (with ID) (0)" from "groups" + Then the "Delete selected group" "button" should be disabled + And I select "Group (without ID) (0)" from "groups" + And I press "Delete selected group" + And I press "Yes" + And I should not see "Group (without ID)" + And I follow "Groupings" + And "Delete" "link" should not exist in the "Grouping (with ID)" "table_row" + And I click on "Delete" "link" in the "Grouping (without ID)" "table_row" + And I press "Yes" + And I should not see "Grouping (without ID)" diff --git a/group/tests/behat/update_groups.feature b/group/tests/behat/update_groups.feature new file mode 100644 index 00000000000..eb927439cd9 --- /dev/null +++ b/group/tests/behat/update_groups.feature @@ -0,0 +1,102 @@ +@core @core_group +Feature: Automatic updating of groups and groupings + In order to check the expected results occur when updating groups and groupings in different scenarios + As a teacher + I need to create groups and groupings under different scenarios and check that the expected result occurs when attempting to update them. + + Background: + Given the following "courses" exists: + | fullname | shortname | format | + | Course 1 | C1 | topics | + And the following "users" exists: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@asd.com | + And the following "course enrolments" exists: + | user | course | role | + | teacher1 | C1 | editingteacher | + And I log in as "teacher1" + And I follow "Course 1" + And I expand "Users" node + And I follow "Groups" + And I press "Create group" + And I fill the moodle form with: + | Group name | Group (without ID) | + And I press "Save changes" + And I press "Create group" + And I fill the moodle form with: + | Group name | Group (with ID) | + | Group ID number | An ID | + And I press "Save changes" + And I follow "Groupings" + And I press "Create grouping" + And I fill the moodle form with: + | Grouping name | Grouping (without ID) | + And I press "Save changes" + And I press "Create grouping" + And I fill the moodle form with: + | Grouping name | Grouping (with ID) | + | Grouping ID number | An ID | + And I press "Save changes" + And I follow "Groups" + + @javascript + Scenario: Update groups and groupings with ID numbers + Given I select "Group (with ID)" from "groups" + And I press "Edit group settings" + And the "idnumber" field should match "An ID" value + And I fill the moodle form with: + | Group name | Group (with ID) (updated) | + | Group ID number | An ID (updated) | + When I press "Save changes" + Then I should see "Group (with ID) (updated)" + And I select "Group (with ID) (updated)" from "groups" + And I press "Edit group settings" + And the "idnumber" field should match "An ID (updated)" value + And I press "Save changes" + And I follow "Groupings" + And I click on "Edit" "link" in the "Grouping (with ID)" "table_row" + And the "idnumber" field should match "An ID" value + And I fill the moodle form with: + | Grouping name | Grouping (with ID) (updated) | + | Grouping ID number | An ID (updated) | + And I press "Save changes" + And I should see "Grouping (with ID) (updated)" + And I click on "Edit" "link" in the "Grouping (with ID) (updated)" "table_row" + And the "idnumber" field should match "An ID (updated)" value + + @javascript + Scenario: Update groups and groupings with ID numbers without the 'moodle/course:changeidnumber' capability + Given I log out + And I log in as "admin" + And I set the following system permissions of "Teacher" role: + | moodle/course:changeidnumber | Prevent | + And I log out + And I log in as "teacher1" + And I follow "Course 1" + And I expand "Users" node + And I follow "Groups" + And I select "Group (with ID)" from "groups" + When I press "Edit group settings" + Then the "idnumber" "field" should be readonly + And the "idnumber" field should match "An ID" value + And I fill the moodle form with: + | Group name | Group (with ID) (updated) | + And I press "Save changes" + And I should see "Group (with ID) (updated)" + And I select "Group (with ID) (updated)" from "groups" + And I press "Edit group settings" + And the "idnumber" "field" should be readonly + And the "idnumber" field should match "An ID" value + And I press "Save changes" + And I follow "Groupings" + And I click on "Edit" "link" in the "Grouping (with ID)" "table_row" + And the "idnumber" "field" should be readonly + And the "idnumber" field should match "An ID" value + And I fill the moodle form with: + | Grouping name | Grouping (with ID) (updated) | + And I press "Save changes" + And I should see "Grouping (with ID) (updated)" + And I click on "Edit" "link" in the "Grouping (with ID) (updated)" "table_row" + And the "idnumber" "field" should be readonly + And the "idnumber" field should match "An ID" value + diff --git a/lib/tests/behat/behat_general.php b/lib/tests/behat/behat_general.php index 50c9dce92cb..654e49342bd 100644 --- a/lib/tests/behat/behat_general.php +++ b/lib/tests/behat/behat_general.php @@ -602,6 +602,40 @@ class behat_general extends behat_base { } } + /** + * Checks the provided element and selector type are readonly on the current page. + * + * @Then /^the "(?P(?:[^"]|\\")*)" "(?P[^"]*)" should be readonly$/ + * @throws ExpectationException Thrown by behat_base::find + * @param string $element Element we look in + * @param string $selectortype The type of element where we are looking in. + */ + public function the_element_should_be_readonly($element, $selectortype) { + // Transforming from steps definitions selector/locator format to Mink format and getting the NodeElement. + $node = $this->get_selected_node($selectortype, $element); + + if (!$node->hasAttribute('readonly')) { + throw new ExpectationException('The element "' . $element . '" is not readonly', $this->getSession()); + } + } + + /** + * Checks the provided element and selector type are not readonly on the current page. + * + * @Then /^the "(?P(?:[^"]|\\")*)" "(?P[^"]*)" should not be readonly$/ + * @throws ExpectationException Thrown by behat_base::find + * @param string $element Element we look in + * @param string $selectortype The type of element where we are looking in. + */ + public function the_element_should_not_be_readonly($element, $selectortype) { + // Transforming from steps definitions selector/locator format to Mink format and getting the NodeElement. + $node = $this->get_selected_node($selectortype, $element); + + if ($node->hasAttribute('readonly')) { + throw new ExpectationException('The element "' . $element . '" is readonly', $this->getSession()); + } + } + /** * Checks the provided element and selector type exists in the current page. * @@ -651,4 +685,52 @@ class behat_general extends behat_base { $this->getSession()->visit($this->locate_path('/admin/cron.php')); } + /** + * Checks that an element and selector type exists in another element and selector type on the current page. + * + * This step is for advanced users, use it if you don't find anything else suitable for what you need. + * + * @Then /^"(?P(?:[^"]|\\")*)" "(?P[^"]*)" should exist in the "(?P(?:[^"]|\\")*)" "(?P[^"]*)"$/ + * @throws ElementNotFoundException Thrown by behat_base::find + * @param string $element The locator of the specified selector + * @param string $selectortype The selector type + * @param string $containerelement The container selector type + * @param string $containerselectortype The container locator + */ + public function should_exist_in_the($element, $selectortype, $containerelement, $containerselectortype) { + // Get the container node. + $containernode = $this->get_selected_node($containerselectortype, $containerelement); + + list($selector, $locator) = $this->transform_selector($selectortype, $element); + + // Specific exception giving info about where can't we find the element. + $locatorexceptionmsg = $element . '" in the "' . $containerelement. '" "' . $containerselectortype. '"'; + $exception = new ElementNotFoundException($this->getSession(), $selectortype, null, $locatorexceptionmsg); + + // Looks for the requested node inside the container node. + $this->find($selector, $locator, $exception, $containernode); + } + + /** + * Checks that an element and selector type does not exist in another element and selector type on the current page. + * + * This step is for advanced users, use it if you don't find anything else suitable for what you need. + * + * @Then /^"(?P(?:[^"]|\\")*)" "(?P[^"]*)" should not exist in the "(?P(?:[^"]|\\")*)" "(?P[^"]*)"$/ + * @throws ExpectationException + * @param string $element The locator of the specified selector + * @param string $selectortype The selector type + * @param string $containerelement The container selector type + * @param string $containerselectortype The container locator + */ + public function should_not_exist_in_the($element, $selectortype, $containerelement, $containerselectortype) { + try { + $this->should_exist_in_the($element, $selectortype, $containerelement, $containerselectortype); + throw new ExpectationException('The "' . $element . '" "' . $selectortype . '" exists in the "' . + $containerelement . '" "' . $containerselectortype . '"', $this->getSession()); + } catch (ElementNotFoundException $e) { + // It passes. + return; + } + } }