From f44ffb724a056c014f450e42da3e7237b288eaa5 Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Fri, 19 Jun 2015 16:38:57 +0800 Subject: [PATCH] MDL-48239 gradebook: Behat tests for calculated grade items. --- grade/tests/behat/behat_grade.php | 58 ++++++ .../grade_calculated_grade_items.feature | 164 +++++++++++++++++ ...de_calculated_grade_items_20150627.feature | 165 ++++++++++++++++++ 3 files changed, 387 insertions(+) create mode 100644 grade/tests/behat/grade_calculated_grade_items.feature create mode 100644 grade/tests/behat/grade_calculated_grade_items_20150627.feature diff --git a/grade/tests/behat/behat_grade.php b/grade/tests/behat/behat_grade.php index f7ff737e3c3..f2afc26233f 100644 --- a/grade/tests/behat/behat_grade.php +++ b/grade/tests/behat/behat_grade.php @@ -133,6 +133,64 @@ class behat_grade extends behat_base { return $steps; } + /** + * Sets a calculated manual grade category total. Needs a table with item name - idnumber relation. + * The step requires you to be in categories and items page. + * + * @Given /^I set "(?P(?:[^"]|\\")*)" calculation for grade category "(?P(?:[^"]|\\")*)" with idnumbers:$/ + * @param string $calculation The calculation. + * @param string $gradeitem The grade item name. + * @param TableNode $data The grade item name - idnumbers relation. + * @return Given[] + */ + public function i_set_calculation_for_grade_category_with_idnumbers($calculation, $gradeitem, TableNode $data) { + + $steps = array(); + $gradecategorytotal = $this->getSession()->getSelectorsHandler()->xpathLiteral($gradeitem . ' total'); + $gradeitem = $this->getSession()->getSelectorsHandler()->xpathLiteral($gradeitem); + + if ($this->running_javascript()) { + $xpath = "//tr[contains(.,$gradecategorytotal)]//*[contains(@class,'moodle-actionmenu')]" . + "//a[contains(@class,'toggle-display')]"; + if ($this->getSession()->getPage()->findAll('xpath', $xpath)) { + $steps[] = new Given('I click on "' . $this->escape($xpath) . '" "xpath_element"'); + } + } + + // Going to edit calculation. + $savechanges = get_string('savechanges', 'grades'); + $edit = $this->getSession()->getSelectorsHandler()->xpathLiteral(get_string('editcalculation', 'grades')); + $linkxpath = "//a[./img[starts-with(@title,$edit) and contains(@title,$gradeitem)]]"; + $steps[] = new Given('I click on "' . $this->escape($linkxpath) . '" "xpath_element"'); + + // After adding id numbers we should wait until the page is reloaded. + $steps[] = new Given('I wait until the page is ready'); + + // Mapping names to idnumbers. + $datahash = $data->getRowsHash(); + foreach ($datahash as $gradeitem => $idnumber) { + // This xpath looks for course, categories and items with the provided name. + // Grrr, we can't equal in categoryitem and courseitem because there is a line jump... + $inputxpath = "//input[@class='idnumber'][" . + "parent::li[@class='item'][text()='" . $gradeitem . "']" . + " | " . + "parent::li[@class='categoryitem' | @class='courseitem']" . + "/parent::ul/parent::li[starts-with(text(),'" . $gradeitem . "')]" . + "]"; + $steps[] = new Given('I set the field with xpath "' . $inputxpath . '" to "' . $idnumber . '"'); + } + + $steps[] = new Given('I press "' . get_string('addidnumbers', 'grades') . '"'); + + // After adding id numbers we should wait until the page is reloaded. + $steps[] = new Given('I wait until the page is ready'); + + $steps[] = new Given('I set the field "' . get_string('calculation', 'grades') . '" to "' . $calculation . '"'); + $steps[] = new Given('I press "' . $savechanges . '"'); + + return $steps; + } + /** * Resets the weights for the grade category * diff --git a/grade/tests/behat/grade_calculated_grade_items.feature b/grade/tests/behat/grade_calculated_grade_items.feature new file mode 100644 index 00000000000..1ba9d87cbfc --- /dev/null +++ b/grade/tests/behat/grade_calculated_grade_items.feature @@ -0,0 +1,164 @@ +@core @core_grades +Feature: Calculated grade items can be used in the gradebook + In order to use calculated grade items in the gradebook + As a teacher + I need setup calculated grade items in the categories and items page. + + Background: + Given the following "courses" exist: + | fullname | shortname | category | groupmode | + | Course 1 | C1 | 0 | 1 | + And the following "users" exist: + | username | firstname | lastname | email | idnumber | + | teacher1 | Teacher | 1 | teacher1@example.com | t1 | + | student1 | Student | 1 | student1@example.com | s1 | + | student2 | Student | 2 | student2@example.com | s2 | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + | student2 | C1 | student | + And I log in as "admin" + And I am on site homepage + And I follow "Course 1" + And I navigate to "Grades" node in "Course administration" + And I navigate to "Categories and items" node in "Grade administration > Setup" + + @javascript + Scenario: The max grade for a category item, with a calculation using Natural aggregation, can be changed + Given I press "Add category" + And I set the following fields to these values: + | Category name | Calc cat | + And I press "Save changes" + And I press "Add grade item" + And I set the following fields to these values: + | Item name | grade item 1 | + | Grade category | Calc cat | + And I press "Save changes" + And I set "=[[gi1]]/2" calculation for grade category "Calc cat" with idnumbers: + | grade item 1 | gi1 | + And I set the following settings for grade item "Calc cat": + | Maximum grade | 50 | + And I follow "Grader report" + And I turn editing mode on + And I give the grade "75.00" to the user "Student 1" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + And I select "Student 1" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 75.00 | 0–100 | 75.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 37.50 | 0–50 | 75.00 % | - | + | Course total | - | 37.50 | 0–50 | 75.00 % | - | + + @javascript + Scenario: Changing max grade for a category item with a calculation that has existing grades will display the same points with the new max grade values immediately. + Given I press "Add category" + And I set the following fields to these values: + | Category name | Calc cat | + And I press "Save changes" + And I press "Add grade item" + And I set the following fields to these values: + | Item name | grade item 1 | + | Grade category | Calc cat | + And I press "Save changes" + And I set "=[[gi1]]/2" calculation for grade category "Calc cat" with idnumbers: + | grade item 1 | gi1 | + And I set the following settings for grade item "Calc cat": + | Maximum grade | 50 | + And I follow "Grader report" + And I turn editing mode on + And I give the grade "75.00" to the user "Student 1" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + And I select "Student 1" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 75.00 | 0–100 | 75.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 37.50 | 0–50 | 75.00 % | - | + | Course total | - | 37.50 | 0–50 | 75.00 % | - | + And I navigate to "Categories and items" node in "Grade administration > Setup" + And I set the following settings for grade item "Calc cat": + | Maximum grade | 40 | + And I follow "Grader report" + And I give the grade "65.00" to the user "Student 2" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + When I select "Student 1" from the "Select all or one user" singleselect + Then the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 75.00 | 0–100 | 75.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 37.50 | 0–40 | 93.75 % | - | + | Course total | - | 37.50 | 0–40 | 93.75 % | - | + And I select "Student 2" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 65.00 | 0–100 | 65.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 32.50 | 0–40 | 81.25 % | - | + | Course total | - | 32.50 | 0–40 | 81.25 % | - | + And I navigate to "Course grade settings" node in "Grade administration > Setup" + And I set the following fields to these values: + | Min and max grades used in calculation | Initial min and max grades | + And I press "Save changes" + And I follow "User report" + And I select "Student 1" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 75.00 | 0–100 | 75.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 37.50 | 0–50 | 75.00 % | - | + | Course total | - | 37.50 | 0–50 | 75.00 % | - | + And I select "Student 2" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 65.00 | 0–100 | 65.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 32.50 | 0–40 | 81.25 % | - | + | Course total | - | 32.50 | 0–40 | 81.25 % | - | + + @javascript + Scenario: Values in calculated grade items are not always out of one hundred + Given I press "Add grade item" + And I set the following fields to these values: + | Item name | grade item 1 | + And I press "Save changes" + And I press "Add grade item" + And I set the following fields to these values: + | Item name | calc item | + And I press "Save changes" + And I set "=[[gi1]]/2" calculation for grade item "calc item" with idnumbers: + | grade item 1 | gi1 | + And I set the following settings for grade item "calc item": + | Maximum grade | 50 | + And I navigate to "Course grade settings" node in "Grade administration > Setup" + And I set the following fields to these values: + | Min and max grades used in calculation | Initial min and max grades | + And I press "Save changes" + And I follow "Grader report" + And I turn editing mode on + And I give the grade "75.00" to the user "Student 1" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + When I select "Student 1" from the "Select all or one user" singleselect + Then the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | 66.67 % | 75.00 | 0–100 | 75.00 % | 50.00 % | + | calc item | 33.33 % | 37.50 | 0–50 | 75.00 % | 25.00 % | + | Course total | - | 112.50 | 0–150 | 75.00 % | - | + And I navigate to "Categories and items" node in "Grade administration > Setup" + And I set the following settings for grade item "calc item": + | Maximum grade | 40 | + And I follow "Grader report" + And I give the grade "65.00" to the user "Student 2" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + And I select "Student 1" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | 66.67 % | 75.00 | 0–100 | 75.00 % | 50.00 % | + | calc item | 33.33 % | 37.50 | 0–50 | 75.00 % | 25.00 % | + | Course total | - | 112.50 | 0–150 | 75.00 % | - | + And I select "Student 2" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | 71.43 % | 65.00 | 0–100 | 65.00 % | 46.43 % | + | calc item | 28.57 % | 32.50 | 0–40 | 81.25 % | 23.21 % | + | Course total | - | 97.50 | 0–140 | 69.64 % | - | \ No newline at end of file diff --git a/grade/tests/behat/grade_calculated_grade_items_20150627.feature b/grade/tests/behat/grade_calculated_grade_items_20150627.feature new file mode 100644 index 00000000000..62d5e3e60af --- /dev/null +++ b/grade/tests/behat/grade_calculated_grade_items_20150627.feature @@ -0,0 +1,165 @@ +@core @core_grades +Feature: Gradebook calculations for calculated grade items before the fix 20150627 + In order to make sure the grades are not changed after upgrade + As a teacher + I need to be able to freeze gradebook calculations + + Background: + Given the following "courses" exist: + | fullname | shortname | category | groupmode | + | Course 1 | C1 | 0 | 1 | + And gradebook calculations for the course "C1" are frozen at version "20150627" + And the following "users" exist: + | username | firstname | lastname | email | idnumber | + | teacher1 | Teacher | 1 | teacher1@example.com | t1 | + | student1 | Student | 1 | student1@example.com | s1 | + | student2 | Student | 2 | student2@example.com | s2 | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + | student2 | C1 | student | + And I log in as "admin" + And I am on site homepage + And I follow "Course 1" + And I navigate to "Grades" node in "Course administration" + And I navigate to "Categories and items" node in "Grade administration > Setup" + + @javascript + Scenario: The max grade for a category item, with a calculation using Natural aggregation, can be changed + Given I press "Add category" + And I set the following fields to these values: + | Category name | Calc cat | + And I press "Save changes" + And I press "Add grade item" + And I set the following fields to these values: + | Item name | grade item 1 | + | Grade category | Calc cat | + And I press "Save changes" + And I set "=[[gi1]]/2" calculation for grade category "Calc cat" with idnumbers: + | grade item 1 | gi1 | + And I set the following settings for grade item "Calc cat": + | Maximum grade | 50 | + And I follow "Grader report" + And I turn editing mode on + And I give the grade "75.00" to the user "Student 1" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + And I select "Student 1" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 75.00 | 0–100 | 75.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 37.50 | 0–100 | 37.50 % | - | + | Course total | - | 37.50 | 0–100 | 37.50 % | - | + + @javascript + Scenario: Changing max grade for a category item with a calculation that has existing grades will display the same points with the new max grade values immediately. + Given I press "Add category" + And I set the following fields to these values: + | Category name | Calc cat | + And I press "Save changes" + And I press "Add grade item" + And I set the following fields to these values: + | Item name | grade item 1 | + | Grade category | Calc cat | + And I press "Save changes" + And I set "=[[gi1]]/2" calculation for grade category "Calc cat" with idnumbers: + | grade item 1 | gi1 | + And I set the following settings for grade item "Calc cat": + | Maximum grade | 50 | + And I follow "Grader report" + And I turn editing mode on + And I give the grade "75.00" to the user "Student 1" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + And I select "Student 1" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 75.00 | 0–100 | 75.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 37.50 | 0–100 | 37.50 % | - | + | Course total | - | 37.50 | 0–100 | 37.50 % | - | + And I navigate to "Categories and items" node in "Grade administration > Setup" + And I set the following settings for grade item "Calc cat": + | Maximum grade | 40 | + And I follow "Grader report" + And I give the grade "65.00" to the user "Student 2" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + When I select "Student 1" from the "Select all or one user" singleselect + Then the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 75.00 | 0–100 | 75.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 37.50 | 0–100 | 37.50 % | - | + | Course total | - | 37.50 | 0–100 | 37.50 % | - | + And I select "Student 2" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 65.00 | 0–100 | 65.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 32.50 | 0–100 | 32.50 % | - | + | Course total | - | 32.50 | 0–100 | 32.50 % | - | + And I navigate to "Course grade settings" node in "Grade administration > Setup" + And I set the following fields to these values: + | Min and max grades used in calculation | Initial min and max grades | + And I press "Save changes" + And I follow "User report" + And I select "Student 1" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 75.00 | 0–100 | 75.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 37.50 | 0–100 | 37.50 % | - | + | Course total | - | 37.50 | 0–100 | 37.50 % | - | + And I select "Student 2" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | - | 65.00 | 0–100 | 65.00 % | - | + | Calc cat totalInclude empty grades. | 100.00 % | 32.50 | 0–100 | 32.50 % | - | + | Course total | - | 32.50 | 0–100 | 32.50 % | - | + + @javascript + Scenario: Values in calculated grade items are not always out of one hundred + Given I press "Add grade item" + And I set the following fields to these values: + | Item name | grade item 1 | + And I press "Save changes" + And I press "Add grade item" + And I set the following fields to these values: + | Item name | calc item | + And I press "Save changes" + And I set "=[[gi1]]/2" calculation for grade item "calc item" with idnumbers: + | grade item 1 | gi1 | + And I set the following settings for grade item "calc item": + | Maximum grade | 50 | + And I navigate to "Course grade settings" node in "Grade administration > Setup" + And I set the following fields to these values: + | Min and max grades used in calculation | Initial min and max grades | + And I press "Save changes" + And I follow "Grader report" + And I turn editing mode on + And I give the grade "75.00" to the user "Student 1" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + When I select "Student 1" from the "Select all or one user" singleselect + Then the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | 50.00 % | 75.00 | 0–100 | 75.00 % | 37.50 % | + | calc item | 50.00 % | 37.50 | 0–100 | 37.50 % | 18.75 % | + | Course total | - | 112.50 | 0–200 | 56.25 % | - | + And I navigate to "Categories and items" node in "Grade administration > Setup" + And I set the following settings for grade item "calc item": + | Maximum grade | 40 | + And I follow "Grader report" + And I give the grade "65.00" to the user "Student 2" for the grade item "grade item 1" + And I press "Save changes" + And I follow "User report" + And I select "Student 1" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | 50.00 % | 75.00 | 0–100 | 75.00 % | 37.50 % | + | calc item | 50.00 % | 37.50 | 0–100 | 37.50 % | 18.75 % | + | Course total | - | 112.50 | 0–200 | 56.25 % | - | + And I select "Student 2" from the "Select all or one user" singleselect + And the following should exist in the "user-grade" table: + | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total | + | grade item 1 | 50.00 % | 65.00 | 0–100 | 65.00 % | 32.50 % | + | calc item | 50.00 % | 32.50 | 0–100 | 32.50 % | 16.25 % | + | Course total | - | 97.50 | 0–200 | 48.75 % | - | \ No newline at end of file