Skip to content
Snippets Groups Projects
Unverified Commit 8b9048bf authored by Agha Awais's avatar Agha Awais Committed by GitHub
Browse files

Merge pull request #18498 from edx/awais/lett_2_bc_grading

TE-2624: Grading bokchoy tests
parents 442a0f51 c7c38863
No related merge requests found
......@@ -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
......
......@@ -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'
......
......@@ -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()
"""
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'])
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment