From 432916881005a0738949b56d26e9da8bc6a3786a Mon Sep 17 00:00:00 2001
From: DawoudSheraz
Date: Mon, 13 May 2019 13:46:56 +0500
Subject: [PATCH] add visual check for due dates in self-paced courses
---
.../test/acceptance/pages/lms/course_home.py | 7 ++
.../tests/lms/test_lms_course_home.py | 75 ++++++++++++++++++-
lms/templates/courseware/progress.html | 2 +-
.../course-outline-fragment.html | 9 ++-
.../course_experience/views/course_outline.py | 4 +
5 files changed, 92 insertions(+), 5 deletions(-)
diff --git a/common/test/acceptance/pages/lms/course_home.py b/common/test/acceptance/pages/lms/course_home.py
index bdf62c2deb..40b83da0fc 100644
--- a/common/test/acceptance/pages/lms/course_home.py
+++ b/common/test/acceptance/pages/lms/course_home.py
@@ -303,6 +303,13 @@ class CourseOutlinePage(PageObject):
self._expand_all_outline_folds()
return self.q(css=self._subsection_selector).results
+ def get_subsection_due_date(self, index=0):
+ """
+ Get the due date for the given index sub-section on the LMS outline.
+ """
+ results = self.q(css='div.details > span.subtitle > span.subtitle-name').results
+ return results[index].text if results else None
+
def _expand_all_outline_folds(self):
'''
Expands all parts of the collapsible outline.
diff --git a/common/test/acceptance/tests/lms/test_lms_course_home.py b/common/test/acceptance/tests/lms/test_lms_course_home.py
index 715bd7c916..ef315714dc 100644
--- a/common/test/acceptance/tests/lms/test_lms_course_home.py
+++ b/common/test/acceptance/tests/lms/test_lms_course_home.py
@@ -4,10 +4,13 @@ End-to-end tests for the LMS that utilize the course home page and course outlin
"""
from __future__ import absolute_import
+
+from datetime import datetime, timedelta
+
import six
+
from common.test.acceptance.pages.lms.create_mode import ModeCreationPage
from openedx.core.lib.tests import attr
-
from ...fixtures.course import CourseFixture, XBlockFixtureDesc
from ...pages.lms.bookmarks import BookmarksPage
from ...pages.lms.course_home import CourseHomePage
@@ -164,3 +167,73 @@ class CourseHomeA11yTest(CourseHomeBaseTest):
]
})
course_search_results_page.a11y_audit.check_for_accessibility_errors()
+
+
+class CourseOutlineTest(UniqueCourseTest):
+ """
+ Test Suite to verify the course outline page on the LMS.
+ """
+ USERNAME = "STUDENT_TESTER"
+ EMAIL = "student101@example.com"
+
+ def setUp(self):
+ """
+ Initialize pages and install a course fixture.
+ """
+ super(CourseOutlineTest, self).setUp()
+
+ self.course_home_page = CourseHomePage(self.browser, self.course_id)
+ # Install a course with sections and problems
+ self.course_fix = CourseFixture(
+ self.course_info['org'],
+ self.course_info['number'],
+ self.course_info['run'],
+ self.course_info['display_name'],
+ start_date=datetime.now() + timedelta(days=-10),
+ end_date=datetime.now() + timedelta(days=10)
+ )
+
+ self.course_fix.add_children(
+ XBlockFixtureDesc('chapter', 'Test Section').add_children(
+ XBlockFixtureDesc('sequential', 'Test Subsection', metadata={
+ 'due': (datetime.now() + timedelta(days=-20)).isoformat(),
+ 'format': 'Homework'
+ }).add_children(
+ XBlockFixtureDesc('problem', 'Test Problem', data=load_data_str('multiple_choice.xml')),
+ )
+ ),
+ ).install()
+ # Auto-auth register for the course.
+ auto_auth(self.browser, self.USERNAME, self.EMAIL, False, self.course_id)
+
+ def change_course_pacing_to_self_paced(self):
+ """
+ Change the course pacing from Instructor Paced to Self-paced course
+ for a live course.
+ """
+ self.course_fix.add_course_details({'start_date': (datetime.now() + timedelta(days=5))})
+ self.course_fix.configure_course()
+ self.course_fix.add_course_details({'self_paced': True})
+ self.course_fix.configure_course()
+ self.course_fix.add_course_details({'start_date': (datetime.now() + timedelta(days=-10))})
+ self.course_fix.configure_course()
+
+ def test_outline_when_pacing_changed_to_self_paced(self):
+ """
+ Scenario: Ensure that due dates are not displayed on the course outline page
+ when switched to self-paced mode from instructor-paced.
+
+ Given an instructor paced course with a due graded content
+ Visit the course outline page
+ Verify the due date visibility
+ Change the course pacing to self-paced
+ Visit the course outline page again
+ Verify that due date is not visible
+ """
+ self.course_home_page.visit()
+ due_date = self.course_home_page.outline.get_subsection_due_date()
+ self.assertIn(str(datetime.now().year), due_date)
+ self.change_course_pacing_to_self_paced()
+ self.course_home_page.visit()
+ due_date = self.course_home_page.outline.get_subsection_due_date()
+ self.assertNotIn(str(datetime.now().year), due_date)
diff --git a/lms/templates/courseware/progress.html b/lms/templates/courseware/progress.html
index e3754d576b..7ece338bd1 100644
--- a/lms/templates/courseware/progress.html
+++ b/lms/templates/courseware/progress.html
@@ -191,7 +191,7 @@ username = get_enterprise_learner_generic_name(request) or student.username
%if section.format is not None:
${section.format}
%endif
- %if section.due is not None:
+ %if section.due is not None and pacing_type != 'self_paced':
%endif
diff --git a/openedx/features/course_experience/templates/course_experience/course-outline-fragment.html b/openedx/features/course_experience/templates/course_experience/course-outline-fragment.html
index 7c830ae397..ea394d7ec4 100644
--- a/openedx/features/course_experience/templates/course_experience/course-outline-fragment.html
+++ b/openedx/features/course_experience/templates/course_experience/course-outline-fragment.html
@@ -14,6 +14,7 @@ from openedx.core.djangolib.markup import HTML, Text
<%
course_sections = blocks.get('children')
+self_paced = context.get('self_paced', False)
%>
% if course_sections is not None:
@@ -91,14 +92,16 @@ course_sections = blocks.get('children')
##
## Exam subsections expose exam status message field as well as a status icon
<%
- if subsection.get('due') is None:
+ if subsection.get('due') is None or self_paced:
# examples: Homework, Lab, etc.
data_string = subsection.get('format')
+ data_datetime = ""
else:
if 'special_exam_info' in subsection:
data_string = _('due {date}')
else:
data_string = _("{subsection_format} due {{date}}").format(subsection_format=subsection.get('format'))
+ data_datetime = subsection.get('due')
%>
% if subsection.get('format') or 'special_exam_info' in subsection:
@@ -117,7 +120,7 @@ course_sections = blocks.get('children')
% if not subsection['special_exam_info'].get('in_completed_state', False):