Skip to content

Commit

Permalink
MDL-42276 core_group: added behat tests to automate group actions
Browse files Browse the repository at this point in the history
1. Added new step definitions to check if an element exists or does not exist in another.
2. Added new step definitions to check if an element is readonly or is not readonly.
3. Automated testing for MDLQA-1812 and MDLQA-1813.

Added behat test for deleting groups/groupings with and without the
'moodle/course:changeidnumber' capability.

4. Automated MDLQA-2105.

Added behat test for creating groups/groupings without the
'moodle/course:changeidnumber' capability.

5. Automated MDLQA-2238 and MDLQA-2335.

Added behat test for updating groups/groupings with and without the
'moodle/course:changeidnumber' capability.
  • Loading branch information
mdjnelson committed Nov 12, 2013
1 parent 89e6c5c commit 49875e3
Show file tree
Hide file tree
Showing 4 changed files with 298 additions and 0 deletions.
33 changes: 33 additions & 0 deletions group/tests/behat/create_groups.feature
Expand Up @@ -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!"
81 changes: 81 additions & 0 deletions 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)"
102 changes: 102 additions & 0 deletions 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

82 changes: 82 additions & 0 deletions lib/tests/behat/behat_general.php
Expand Up @@ -489,6 +489,40 @@ public function the_element_should_be_enabled($element, $selectortype) {
}
}

/**
* Checks the provided element and selector type are readonly on the current page.
*
* @Then /^the "(?P<element_string>(?:[^"]|\\")*)" "(?P<selector_string>[^"]*)" 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<element_string>(?:[^"]|\\")*)" "(?P<selector_string>[^"]*)" 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.
*
Expand Down Expand Up @@ -538,4 +572,52 @@ public function i_trigger_cron() {
$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<element_string>(?:[^"]|\\")*)" "(?P<selector_string>[^"]*)" should exist in the "(?P<element2_string>(?:[^"]|\\")*)" "(?P<selector2_string>[^"]*)"$/
* @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<element_string>(?:[^"]|\\")*)" "(?P<selector_string>[^"]*)" should not exist in the "(?P<element2_string>(?:[^"]|\\")*)" "(?P<selector2_string>[^"]*)"$/
* @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;
}
}
}

0 comments on commit 49875e3

Please sign in to comment.