Commit 390b74e2 by Chris Committed by GitHub

Merge pull request #12925 from edx/clrux/ac-523

AC-523 fixes 'duplicate-id' ignores
parents ded0885c a4a7948b
...@@ -166,7 +166,7 @@ class DashboardPage(PageObject): ...@@ -166,7 +166,7 @@ class DashboardPage(PageObject):
""" """
Get course date of the first course from dashboard Get course date of the first course from dashboard
""" """
return self.q(css='ul.listing-courses .course-item .info-date-block').first.text[0] return self.q(css='ul.listing-courses .course-item:first-of-type .info-date-block').first.text[0]
def click_username_dropdown(self): def click_username_dropdown(self):
""" """
......
...@@ -748,8 +748,8 @@ class MembershipPageAutoEnrollSection(PageObject): ...@@ -748,8 +748,8 @@ class MembershipPageAutoEnrollSection(PageObject):
""" """
url = None url = None
auto_enroll_browse_button_selector = '.auto_enroll_csv .file-browse input.file_field#browseBtn' auto_enroll_browse_button_selector = '.auto_enroll_csv .file-browse input.file_field#browseBtn-auto_enroll_csv'
auto_enroll_upload_button_selector = '.auto_enroll_csv button[name="enrollment_signup_button"]' auto_enroll_upload_button_selector = '.auto_enroll_csv #submitBtn-auto_enroll_csv'
batch_enrollment_selector = '.batch-enrollment' batch_enrollment_selector = '.batch-enrollment'
NOTIFICATION_ERROR = 'error' NOTIFICATION_ERROR = 'error'
NOTIFICATION_WARNING = 'warning' NOTIFICATION_WARNING = 'warning'
......
...@@ -5,7 +5,7 @@ End-to-end tests for the main LMS Dashboard (aka, Student Dashboard). ...@@ -5,7 +5,7 @@ End-to-end tests for the main LMS Dashboard (aka, Student Dashboard).
import datetime import datetime
from nose.plugins.attrib import attr from nose.plugins.attrib import attr
from ..helpers import UniqueCourseTest from ..helpers import UniqueCourseTest, generate_course_key
from ...fixtures.course import CourseFixture from ...fixtures.course import CourseFixture
from ...pages.lms.auto_auth import AutoAuthPage from ...pages.lms.auto_auth import AutoAuthPage
from ...pages.lms.dashboard import DashboardPage from ...pages.lms.dashboard import DashboardPage
...@@ -40,9 +40,10 @@ class BaseLmsDashboardTest(UniqueCourseTest): ...@@ -40,9 +40,10 @@ class BaseLmsDashboardTest(UniqueCourseTest):
}) })
self.course_fixture.install() self.course_fixture.install()
# Create the test user, register them for the course, and authenticate
self.username = "test_{uuid}".format(uuid=self.unique_id[0:6]) self.username = "test_{uuid}".format(uuid=self.unique_id[0:6])
self.email = "{user}@example.com".format(user=self.username) self.email = "{user}@example.com".format(user=self.username)
# Create the test user, register them for the course, and authenticate
AutoAuthPage( AutoAuthPage(
self.browser, self.browser,
username=self.username, username=self.username,
...@@ -54,6 +55,83 @@ class BaseLmsDashboardTest(UniqueCourseTest): ...@@ -54,6 +55,83 @@ class BaseLmsDashboardTest(UniqueCourseTest):
self.dashboard_page.visit() self.dashboard_page.visit()
class BaseLmsDashboardTestMultiple(UniqueCourseTest):
""" Base test suite for the LMS Student Dashboard with Multiple Courses"""
def setUp(self):
"""
Initializes the components (page objects, courses, users) for this test suite
"""
# Some parameters are provided by the parent setUp() routine, such as the following:
# self.course_id, self.course_info, self.unique_id
super(BaseLmsDashboardTestMultiple, self).setUp()
# Load page objects for use by the tests
self.dashboard_page = DashboardPage(self.browser)
# Configure some aspects of the test course and install the settings into the course
self.courses = {
'A': {
'org': 'test_org',
'number': self.unique_id,
'run': 'test_run_A',
'display_name': 'Test Course A'
},
'B': {
'org': 'test_org',
'number': self.unique_id,
'run': 'test_run_B',
'display_name': 'Test Course B'
},
'C': {
'org': 'test_org',
'number': self.unique_id,
'run': 'test_run_C',
'display_name': 'Test Course C'
}
}
self.username = "test_{uuid}".format(uuid=self.unique_id[0:6])
self.email = "{user}@example.com".format(user=self.username)
self.course_keys = {}
self.course_fixtures = {}
for key, value in self.courses.iteritems():
course_key = generate_course_key(
value['org'],
value['number'],
value['run'],
)
course_fixture = CourseFixture(
value['org'],
value['number'],
value['run'],
value['display_name'],
)
course_fixture.add_advanced_settings({
u"social_sharing_url": {u"value": "http://custom/course/url"}
})
course_fixture.install()
self.course_keys[key] = course_key
self.course_fixtures[key] = course_fixture
# Create the test user, register them for the course, and authenticate
AutoAuthPage(
self.browser,
username=self.username,
email=self.email,
course_id=course_key
).visit()
# Navigate the authenticated, enrolled user to the dashboard page and get testing!
self.dashboard_page.visit()
class LmsDashboardPageTest(BaseLmsDashboardTest): class LmsDashboardPageTest(BaseLmsDashboardTest):
""" Test suite for the LMS Student Dashboard page """ """ Test suite for the LMS Student Dashboard page """
...@@ -109,8 +187,10 @@ class LmsDashboardPageTest(BaseLmsDashboardTest): ...@@ -109,8 +187,10 @@ class LmsDashboardPageTest(BaseLmsDashboardTest):
course_start_date = datetime.datetime(1970, 1, 1) course_start_date = datetime.datetime(1970, 1, 1)
course_end_date = self.now - datetime.timedelta(days=90) course_end_date = self.now - datetime.timedelta(days=90)
self.course_fixture.add_course_details({'start_date': course_start_date, self.course_fixture.add_course_details({
'end_date': course_end_date}) 'start_date': course_start_date,
'end_date': course_end_date
})
self.course_fixture.configure_course() self.course_fixture.configure_course()
end_date = course_end_date.strftime(DEFAULT_SHORT_DATE_FORMAT) end_date = course_end_date.strftime(DEFAULT_SHORT_DATE_FORMAT)
...@@ -140,8 +220,10 @@ class LmsDashboardPageTest(BaseLmsDashboardTest): ...@@ -140,8 +220,10 @@ class LmsDashboardPageTest(BaseLmsDashboardTest):
course_start_date = datetime.datetime(1970, 1, 1) course_start_date = datetime.datetime(1970, 1, 1)
course_end_date = self.now + datetime.timedelta(days=90) course_end_date = self.now + datetime.timedelta(days=90)
self.course_fixture.add_course_details({'start_date': course_start_date, self.course_fixture.add_course_details({
'end_date': course_end_date}) 'start_date': course_start_date,
'end_date': course_end_date
})
self.course_fixture.configure_course() self.course_fixture.configure_course()
start_date = course_start_date.strftime(DEFAULT_SHORT_DATE_FORMAT) start_date = course_start_date.strftime(DEFAULT_SHORT_DATE_FORMAT)
...@@ -171,8 +253,10 @@ class LmsDashboardPageTest(BaseLmsDashboardTest): ...@@ -171,8 +253,10 @@ class LmsDashboardPageTest(BaseLmsDashboardTest):
course_start_date = self.now + datetime.timedelta(days=30) course_start_date = self.now + datetime.timedelta(days=30)
course_end_date = self.now + datetime.timedelta(days=365) course_end_date = self.now + datetime.timedelta(days=365)
self.course_fixture.add_course_details({'start_date': course_start_date, self.course_fixture.add_course_details({
'end_date': course_end_date}) 'start_date': course_start_date,
'end_date': course_end_date
})
self.course_fixture.configure_course() self.course_fixture.configure_course()
start_date = course_start_date.strftime(DEFAULT_SHORT_DATE_FORMAT) start_date = course_start_date.strftime(DEFAULT_SHORT_DATE_FORMAT)
...@@ -203,8 +287,10 @@ class LmsDashboardPageTest(BaseLmsDashboardTest): ...@@ -203,8 +287,10 @@ class LmsDashboardPageTest(BaseLmsDashboardTest):
course_start_date = self.now + datetime.timedelta(days=2) course_start_date = self.now + datetime.timedelta(days=2)
course_end_date = self.now + datetime.timedelta(days=365) course_end_date = self.now + datetime.timedelta(days=365)
self.course_fixture.add_course_details({'start_date': course_start_date, self.course_fixture.add_course_details({
'end_date': course_end_date}) 'start_date': course_start_date,
'end_date': course_end_date
})
self.course_fixture.configure_course() self.course_fixture.configure_course()
start_date = course_start_date.strftime(DEFAULT_DAY_AND_TIME_FORMAT) start_date = course_start_date.strftime(DEFAULT_DAY_AND_TIME_FORMAT)
...@@ -221,7 +307,7 @@ class LmsDashboardPageTest(BaseLmsDashboardTest): ...@@ -221,7 +307,7 @@ class LmsDashboardPageTest(BaseLmsDashboardTest):
@attr('a11y') @attr('a11y')
class LmsDashboardA11yTest(BaseLmsDashboardTest): class LmsDashboardA11yTest(BaseLmsDashboardTestMultiple):
""" """
Class to test lms student dashboard accessibility. Class to test lms student dashboard accessibility.
""" """
...@@ -230,6 +316,12 @@ class LmsDashboardA11yTest(BaseLmsDashboardTest): ...@@ -230,6 +316,12 @@ class LmsDashboardA11yTest(BaseLmsDashboardTest):
""" """
Test the accessibility of the course listings Test the accessibility of the course listings
""" """
course_listings = self.dashboard_page.get_course_listings() course_listings = self.dashboard_page.get_courses()
self.assertEqual(len(course_listings), 1) self.assertEqual(len(course_listings), 3)
self.dashboard_page.a11y_audit.config.set_rules({
'ignore': [
'link-href', # AC-530
'aria-required-children', # AC-534
]
})
self.dashboard_page.a11y_audit.check_for_accessibility_errors() self.dashboard_page.a11y_audit.check_for_accessibility_errors()
...@@ -10,11 +10,11 @@ ...@@ -10,11 +10,11 @@
<input disabled="disabled" id="browseFile" placeholder="choose file"/> <input disabled="disabled" id="browseFile" placeholder="choose file"/>
<div class="file-browse btn btn-primary"> <div class="file-browse btn btn-primary">
<span class="browse"> Browse </span> <label for="browseBtn-auto_enroll_csv" class="browse">Browse</label>
<input class="file_field" id="browseBtn" name="students_list" type="file" accept=".csv"/> <input class="file_field" id="browseBtn-auto_enroll_csv" name="students_list" type="file" accept=".csv"/>
</div> </div>
</div> </div>
<button type="submit" name="enrollment_signup_button">${_("Upload CSV")}</button> <button type="submit" id="submitBtn-auto_enroll_csv" name="enrollment_signup_button">Upload CSV</button>
</form> </form>
<div class="results"></div> <div class="results"></div>
</div> </div>
...@@ -117,7 +117,7 @@ class AuthListWidget extends MemberListWidget ...@@ -117,7 +117,7 @@ class AuthListWidget extends MemberListWidget
# create revoke button and insert it into the row # create revoke button and insert it into the row
label_trans = gettext("Revoke access") label_trans = gettext("Revoke access")
$revoke_btn = $ _.template('<div class="revoke"><span class="icon fa fa-times-circle" aria-hidden="true"></span> <%= label %></div>')({label: label_trans}), $revoke_btn = $ _.template('<div class="revoke"><span class="icon fa fa-times-circle" aria-hidden="true"></span> <%- label %></div>')({label: label_trans}),
class: 'revoke' class: 'revoke'
$revoke_btn.click => $revoke_btn.click =>
@modify_member_access member.email, 'revoke', (error) => @modify_member_access member.email, 'revoke', (error) =>
...@@ -166,10 +166,10 @@ class AuthListWidget extends MemberListWidget ...@@ -166,10 +166,10 @@ class AuthListWidget extends MemberListWidget
@clear_errors() @clear_errors()
@clear_input() @clear_input()
if data.userDoesNotExist if data.userDoesNotExist
msg = gettext("Could not find a user with username or email address '<%= identifier %>'.") msg = gettext("Could not find a user with username or email address '<%- identifier %>'.")
@show_errors _.template(msg, {identifier: data.unique_student_identifier}) @show_errors _.template(msg, {identifier: data.unique_student_identifier})
else if data.inactiveUser else if data.inactiveUser
msg = gettext("Error: User '<%= username %>' has not yet activated their account. Users must create and activate their accounts before they can be assigned a role.") msg = gettext("Error: User '<%- username %>' has not yet activated their account. Users must create and activate their accounts before they can be assigned a role.")
@show_errors _.template(msg, {username: data.unique_student_identifier}) @show_errors _.template(msg, {username: data.unique_student_identifier})
else if data.removingSelfAsInstructor else if data.removingSelfAsInstructor
@show_errors gettext "Error: You cannot remove yourself from the Instructor group!" @show_errors gettext "Error: You cannot remove yourself from the Instructor group!"
...@@ -181,12 +181,12 @@ class @AutoEnrollmentViaCsv ...@@ -181,12 +181,12 @@ class @AutoEnrollmentViaCsv
# Wrapper for the AutoEnrollmentViaCsv subsection. # Wrapper for the AutoEnrollmentViaCsv subsection.
# This object handles buttons, success and failure reporting, # This object handles buttons, success and failure reporting,
# and server communication. # and server communication.
@$student_enrollment_form = @$container.find("form#student-auto-enroll-form") @$student_enrollment_form = @$container.find("#student-auto-enroll-form")
@$enrollment_signup_button = @$container.find("[name='enrollment_signup_button']") @$enrollment_signup_button = @$container.find("#submitBtn-auto_enroll_csv")
@$students_list_file = @$container.find("input[name='students_list']") @$students_list_file = @$container.find("input[name='students_list']")
@$csrf_token = @$container.find("input[name='csrfmiddlewaretoken']") @$csrf_token = @$container.find("input[name='csrfmiddlewaretoken']")
@$results = @$container.find("div.results") @$results = @$container.find("div.results")
@$browse_button = @$container.find("#browseBtn") @$browse_button = @$container.find("#browseBtn-auto_enroll_csv")
@$browse_file = @$container.find("#browseFile") @$browse_file = @$container.find("#browseFile")
@processing = false @processing = false
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
<div class="customBrowseBtn"> <div class="customBrowseBtn">
<input disabled="disabled" class="browse-file" placeholder="<%- gettext("Choose File") %>" /> <input disabled="disabled" class="browse-file" placeholder="<%- gettext("Choose File") %>" />
<div class="file-browse btn btn-primary"> <div class="file-browse btn btn-primary">
<span class="browse"> <%- gettext("Browse") %> </span> <label for="browseBtn-bulk-exc-students" class="browse"><%- gettext("Browse") %></label>
<input class="file_field" id="browseBtn" name="students_list" type="file" accept=".csv"/> <input class="file_field" id="browseBtn-bulk-exc-students" name="students_list" type="file" accept=".csv"/>
</div> </div>
</div> </div>
<div><button class="btn-blue upload-csv-button" type="submit"><%- gettext('Add to Exception List') %></button></div> <div><button class="btn-blue upload-csv-button" type="submit"><%- gettext('Add to Exception List') %></button></div>
......
...@@ -96,11 +96,11 @@ from openedx.core.djangoapps.course_groups.partition_scheme import get_cohorted_ ...@@ -96,11 +96,11 @@ from openedx.core.djangoapps.course_groups.partition_scheme import get_cohorted_
<input disabled="disabled" id="browseFile" placeholder="choose file" /> <input disabled="disabled" id="browseFile" placeholder="choose file" />
<div class="file-browse btn btn-primary"> <div class="file-browse btn btn-primary">
<span class="browse"> Browse </span> <span class="browse"> Browse </span>
<label for="browseBtn" class="sr">${_("Upload a CSV for bulk enrollment")}</label> <label for="browseBtn-auto_enroll_csv" class="sr">${_("Upload a CSV for bulk enrollment")}</label>
<input class="file_field" id="browseBtn" name="students_list" type="file" accept=".csv"/> <input class="file_field" id="browseBtn-auto_enroll_csv" name="students_list" type="file" accept=".csv"/>
</div> </div>
</div> </div>
<button type="submit" name="enrollment_signup_button">${_("Upload CSV")}</button> <button type="submit" id="submitBtn-auto_enroll_csv" name="enrollment_signup_button">${_("Upload CSV")}</button>
<input type="hidden" name="csrfmiddlewaretoken" value="${ csrf_token }"> <input type="hidden" name="csrfmiddlewaretoken" value="${ csrf_token }">
</form> </form>
<div class="results"></div> <div class="results"></div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment