From c7c38863dc7687368b3825da0b504527e4f62e4e Mon Sep 17 00:00:00 2001 From: maiazadhun1 Date: Mon, 2 Jul 2018 11:11:31 +0000 Subject: [PATCH] Grading bokchoy tests --- .../contentstore/features/grading.feature | 20 ---- .../contentstore/features/grading.py | 8 -- .../pages/studio/settings_graders.py | 63 ++++++++++++ .../tests/studio/test_studio_grading.py | 95 +++++++++++++++++++ 4 files changed, 158 insertions(+), 28 deletions(-) create mode 100644 common/test/acceptance/tests/studio/test_studio_grading.py diff --git a/cms/djangoapps/contentstore/features/grading.feature b/cms/djangoapps/contentstore/features/grading.feature index a969948b6a..caafca9b6e 100644 --- a/cms/djangoapps/contentstore/features/grading.feature +++ b/cms/djangoapps/contentstore/features/grading.feature @@ -2,26 +2,6 @@ Feature: CMS.Course Grading As a course author, I want to be able to configure how my course is graded - Scenario: Users can add grading ranges - Given I have opened a new course in Studio - And I am viewing the grading settings - When I add "1" new grade - Then I see I now have "3" grades - - Scenario: Users can only have up to 5 grading ranges - Given I have opened a new course in Studio - And I am viewing the grading settings - When I add "6" new grades - Then I see I now have "5" grades - - Scenario: When user removes a grade the remaining grades should be consistent - Given I have opened a new course in Studio - And I am viewing the grading settings - When I add "2" new grade - Then Grade list has "ABCF" grades - And I delete a grade - Then Grade list has "ABF" grades - # Cannot reliably make the delete button appear so using javascript instead Scenario: Users can delete grading ranges Given I have opened a new course in Studio diff --git a/cms/djangoapps/contentstore/features/grading.py b/cms/djangoapps/contentstore/features/grading.py index c86a9a1cd9..0fd0c03fc6 100644 --- a/cms/djangoapps/contentstore/features/grading.py +++ b/cms/djangoapps/contentstore/features/grading.py @@ -33,14 +33,6 @@ def delete_grade(step): world.browser.execute_script('document.getElementsByClassName("remove-button")[0].click()') -@step(u'Grade list has "([^"]*)" grades$') -def check_grade_values(step, grade_list): # pylint: disable=unused-argument - visible_list = ''.join( - [grade.text for grade in world.css_find('.letter-grade')] - ) - assert_equal(visible_list, grade_list, 'Grade lists should be equal') - - @step(u'I see I now have "([^"]*)" grades$') def view_grade_slider(step, how_many): grade_slider_css = '.grade-specific-bar' diff --git a/common/test/acceptance/pages/studio/settings_graders.py b/common/test/acceptance/pages/studio/settings_graders.py index df92e7c78f..a6d8bd363b 100644 --- a/common/test/acceptance/pages/studio/settings_graders.py +++ b/common/test/acceptance/pages/studio/settings_graders.py @@ -3,6 +3,9 @@ Course Grading Settings page. """ from common.test.acceptance.pages.studio.settings import SettingsPage +from common.test.acceptance.pages.studio.utils import press_the_notification_button +from common.test.acceptance.pages.common.utils import click_css +from bok_choy.promise import BrokenPromise class GradingPage(SettingsPage): @@ -11,6 +14,7 @@ class GradingPage(SettingsPage): """ url_path = "settings/grading" + grade_ranges = '.grades .grade-specific-bar' def is_browser_on_page(self): return self.q(css='body.grading').present @@ -23,6 +27,15 @@ class GradingPage(SettingsPage): """ return self.q(css=selector)[0].text + @property + def total_number_of_grades(self): + """ + Gets total number of grades present in the grades bar + returns: Single number length of grades + """ + self.wait_for_element_visibility(self.grade_ranges, 'Grades are visible') + return len(self.q(css=self.grade_ranges)) + def add_new_grade(self): """ Add new grade @@ -40,6 +53,13 @@ class GradingPage(SettingsPage): self.wait_for_ajax() self.save_changes() + def remove_grades(self, number_of_grades): + """ + Remove grade ranges from grades bar. + """ + for _ in range(number_of_grades): + self.browser.execute_script('document.getElementsByClassName("remove-button")[0].click()') + def remove_all_grades(self): """ Removes all grades @@ -47,6 +67,36 @@ class GradingPage(SettingsPage): while len(self.q(css='.remove-button')) > 0: self.remove_grade() + @property + def grade_letters(self): + """ + Get names of grade ranges. + Returns: A list containing names of the grade ranges. + """ + return self.q(css='.letter-grade').text + + def click_add_grade(self): + """ + Clicks to add a grade + """ + click_css(self, '.new-grade-button', require_notification=False) + + def is_grade_added(self, length): + """ + Checks to see if grade is added by comparing number of grades after the addition + Returns: True if grade is added + Returns: False if grade is not added + """ + try: + self.wait_for( + lambda: len(self.q(css=self.grade_ranges)) == length + 1, + description="Grades are added", + timeout=3 + ) + return True + except BrokenPromise: + return False + def add_new_assignment_type(self): """ Add New Assignment type @@ -102,3 +152,16 @@ class GradingPage(SettingsPage): """ while len(self.q(css='.remove-grading-data')) > 0: self.delete_assignment_type() + + def save(self): + """ + Click on save settings button. + """ + press_the_notification_button(self, "Save") + + def refresh_and_wait_for_load(self): + """ + Refresh the page and wait for all resources to load. + """ + self.browser.refresh() + self.wait_for_page() diff --git a/common/test/acceptance/tests/studio/test_studio_grading.py b/common/test/acceptance/tests/studio/test_studio_grading.py new file mode 100644 index 0000000000..b3ac487259 --- /dev/null +++ b/common/test/acceptance/tests/studio/test_studio_grading.py @@ -0,0 +1,95 @@ +""" +Acceptance tests for grade settings in Studio. +""" +from common.test.acceptance.pages.studio.settings_graders import GradingPage +from common.test.acceptance.tests.studio.base_studio_test import StudioCourseTest +from common.test.acceptance.fixtures.course import XBlockFixtureDesc + + +class GradingPageTest(StudioCourseTest): + """ + Bockchoy tests to add/edit grade settings in studio. + """ + + url = None + + def setUp(self): # pylint: disable=arguments-differ + super(GradingPageTest, self).setUp() + self.grading_page = GradingPage( + self.browser, + self.course_info['org'], + self.course_info['number'], + self.course_info['run'] + ) + + self.grading_page.visit() + + def populate_course_fixture(self, course_fixture): + """ + Return a test course fixture. + """ + course_fixture.add_children( + XBlockFixtureDesc("chapter", "Test Section").add_children( + XBlockFixtureDesc("sequential", "Test Subsection").add_children( + ) + ) + ) + + def test_add_grade_range(self): + """ + Scenario: Users can add grading ranges + Given I have opened a new course in Studio + And I am viewing the grading settings + When I add "1" new grade + Then I see I now have "3" + """ + length = self.grading_page.total_number_of_grades + self.grading_page.click_add_grade() + self.assertTrue(self.grading_page.is_grade_added(length)) + self.grading_page.save() + self.grading_page.refresh_and_wait_for_load() + total_number_of_grades = self.grading_page.total_number_of_grades + self.assertEqual(total_number_of_grades, 3) + + def test_staff_can_add_up_to_five_grades_only(self): + """ + Scenario: Users can only have up to 5 grading ranges + Given I have opened a new course in Studio + And I am viewing the grading settings + When I try to add more than 5 grades + Then I see I have only "5" grades + """ + for grade_ordinal in range(1, 5): + length = self.grading_page.total_number_of_grades + self.grading_page.click_add_grade() + # By default page has 2 grades, so greater than 3 means, attempt is made to add 6th grade + if grade_ordinal > 3: + self.assertFalse(self.grading_page.is_grade_added(length)) + else: + self.assertTrue(self.grading_page.is_grade_added(length)) + self.grading_page.save() + self.grading_page.refresh_and_wait_for_load() + total_number_of_grades = self.grading_page.total_number_of_grades + self.assertEqual(total_number_of_grades, 5) + + def test_grades_remain_consistent(self): + """ + Scenario: When user removes a grade the remaining grades should be consistent + Given I have opened a new course in Studio + And I am viewing the grading settings + When I add "2" new grade + Then Grade list has "A,B,C,F" grades + And I delete a grade + Then Grade list has "A,B,F" grades + """ + for _ in range(2): + length = self.grading_page.total_number_of_grades + self.grading_page.click_add_grade() + self.assertTrue(self.grading_page.is_grade_added(length)) + self.grading_page.save() + grades_alphabets = self.grading_page.grade_letters + self.assertEqual(grades_alphabets, ['A', 'B', 'C', 'F']) + self.grading_page.remove_grades(1) + self.grading_page.save() + grades_alphabets = self.grading_page.grade_letters + self.assertEqual(grades_alphabets, ['A', 'B', 'F'])