replaced unittest assertions pytest assertions (#26543)
This commit is contained in:
@@ -90,7 +90,7 @@ class CommandsTestBase(SharedModuleStoreTestCase):
|
||||
dumped_courses = output.strip().split('\n')
|
||||
course_ids = {text_type(course_id) for course_id in self.loaded_courses}
|
||||
dumped_ids = set(dumped_courses)
|
||||
self.assertEqual(course_ids, dumped_ids)
|
||||
assert course_ids == dumped_ids
|
||||
|
||||
def test_correct_course_structure_metadata(self):
|
||||
course_id = text_type(self.test_course_key)
|
||||
@@ -103,7 +103,7 @@ class CommandsTestBase(SharedModuleStoreTestCase):
|
||||
self.fail(exception)
|
||||
|
||||
dump = json.loads(output)
|
||||
self.assertGreater(len(list(dump.values())), 0)
|
||||
assert len(list(dump.values())) > 0
|
||||
|
||||
def test_dump_course_structure(self):
|
||||
args = [text_type(self.test_course_key)]
|
||||
@@ -115,23 +115,23 @@ class CommandsTestBase(SharedModuleStoreTestCase):
|
||||
# check that all elements in the course structure have metadata,
|
||||
# but not inherited metadata:
|
||||
for element in six.itervalues(dump):
|
||||
self.assertIn('metadata', element)
|
||||
self.assertIn('children', element)
|
||||
self.assertIn('category', element)
|
||||
self.assertNotIn('inherited_metadata', element)
|
||||
assert 'metadata' in element
|
||||
assert 'children' in element
|
||||
assert 'category' in element
|
||||
assert 'inherited_metadata' not in element
|
||||
|
||||
# Check a few elements in the course dump
|
||||
test_course_key = self.test_course_key
|
||||
parent_id = text_type(test_course_key.make_usage_key('chapter', 'Overview'))
|
||||
self.assertEqual(dump[parent_id]['category'], 'chapter')
|
||||
self.assertEqual(len(dump[parent_id]['children']), 3)
|
||||
assert dump[parent_id]['category'] == 'chapter'
|
||||
assert len(dump[parent_id]['children']) == 3
|
||||
|
||||
child_id = dump[parent_id]['children'][1]
|
||||
self.assertEqual(dump[child_id]['category'], 'videosequence')
|
||||
self.assertEqual(len(dump[child_id]['children']), 2)
|
||||
assert dump[child_id]['category'] == 'videosequence'
|
||||
assert len(dump[child_id]['children']) == 2
|
||||
|
||||
video_id = text_type(test_course_key.make_usage_key('video', 'Welcome'))
|
||||
self.assertEqual(dump[video_id]['category'], 'video')
|
||||
assert dump[video_id]['category'] == 'video'
|
||||
video_metadata = dump[video_id]['metadata']
|
||||
video_metadata.pop('edx_video_id', None)
|
||||
six.assertCountEqual(
|
||||
@@ -139,11 +139,11 @@ class CommandsTestBase(SharedModuleStoreTestCase):
|
||||
list(video_metadata.keys()),
|
||||
['youtube_id_0_75', 'youtube_id_1_0', 'youtube_id_1_25', 'youtube_id_1_5']
|
||||
)
|
||||
self.assertIn('youtube_id_1_0', dump[video_id]['metadata'])
|
||||
assert 'youtube_id_1_0' in dump[video_id]['metadata']
|
||||
|
||||
# Check if there are the right number of elements
|
||||
|
||||
self.assertEqual(len(dump), 17)
|
||||
assert len(dump) == 17
|
||||
|
||||
def test_dump_inherited_course_structure(self):
|
||||
args = [text_type(self.test_course_key)]
|
||||
@@ -153,12 +153,12 @@ class CommandsTestBase(SharedModuleStoreTestCase):
|
||||
# check that all elements in the course structure have inherited metadata,
|
||||
# and that it contains a particular value as well:
|
||||
for element in six.itervalues(dump):
|
||||
self.assertIn('metadata', element)
|
||||
self.assertIn('children', element)
|
||||
self.assertIn('category', element)
|
||||
self.assertIn('inherited_metadata', element)
|
||||
assert 'metadata' in element
|
||||
assert 'children' in element
|
||||
assert 'category' in element
|
||||
assert 'inherited_metadata' in element
|
||||
# ... but does not contain inherited metadata containing a default value:
|
||||
self.assertNotIn('due', element['inherited_metadata'])
|
||||
assert 'due' not in element['inherited_metadata']
|
||||
|
||||
def test_dump_inherited_course_structure_with_defaults(self):
|
||||
args = [text_type(self.test_course_key)]
|
||||
@@ -168,25 +168,25 @@ class CommandsTestBase(SharedModuleStoreTestCase):
|
||||
# check that all elements in the course structure have inherited metadata,
|
||||
# and that it contains a particular value as well:
|
||||
for element in six.itervalues(dump):
|
||||
self.assertIn('metadata', element)
|
||||
self.assertIn('children', element)
|
||||
self.assertIn('category', element)
|
||||
self.assertIn('inherited_metadata', element)
|
||||
assert 'metadata' in element
|
||||
assert 'children' in element
|
||||
assert 'category' in element
|
||||
assert 'inherited_metadata' in element
|
||||
# ... and contains inherited metadata containing a default value:
|
||||
self.assertIsNone(element['inherited_metadata']['due'])
|
||||
assert element['inherited_metadata']['due'] is None
|
||||
|
||||
def test_export_discussion_ids(self):
|
||||
output = self.call_command('dump_course_structure', text_type(self.course.id))
|
||||
dump = json.loads(output)
|
||||
dumped_id = dump[text_type(self.discussion.location)]['metadata']['discussion_id']
|
||||
self.assertEqual(dumped_id, self.discussion.discussion_id)
|
||||
assert dumped_id == self.discussion.discussion_id
|
||||
|
||||
def test_export_discussion_id_custom_id(self):
|
||||
output = self.call_command('dump_course_structure', text_type(self.test_course_key))
|
||||
dump = json.loads(output)
|
||||
discussion_key = text_type(self.test_course_key.make_usage_key('discussion', 'custom_id'))
|
||||
dumped_id = dump[text_type(discussion_key)]['metadata']['discussion_id']
|
||||
self.assertEqual(dumped_id, "custom")
|
||||
assert dumped_id == 'custom'
|
||||
|
||||
def check_export_file(self, tar_file): # pylint: disable=missing-function-docstring
|
||||
names = tar_file.getnames()
|
||||
|
||||
@@ -129,7 +129,7 @@ class BaseTestXmodule(ModuleStoreTestCase):
|
||||
for user in self.users
|
||||
]
|
||||
|
||||
self.assertTrue(all(self.login_statuses))
|
||||
assert all(self.login_statuses)
|
||||
|
||||
def setUp(self):
|
||||
super(BaseTestXmodule, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
|
||||
@@ -185,23 +185,16 @@ class LoginEnrollmentTestCase(TestCase):
|
||||
"""
|
||||
make_request = getattr(self.client, method.lower())
|
||||
response = make_request(url, **kwargs)
|
||||
self.assertEqual(
|
||||
response.status_code, status_code,
|
||||
u"{method} request to {url} returned status code {actual}, "
|
||||
u"expected status code {expected}".format(
|
||||
method=method, url=url,
|
||||
actual=response.status_code, expected=status_code
|
||||
)
|
||||
)
|
||||
assert response.status_code == status_code, u'{method} request to {url} returned status code {actual}, expected status code {expected}'.format(method=method, url=url, actual=response.status_code, expected=status_code) # pylint: disable=line-too-long
|
||||
return response
|
||||
|
||||
def assert_account_activated(self, url, method="GET", **kwargs): # lint-amnesty, pylint: disable=missing-function-docstring
|
||||
make_request = getattr(self.client, method.lower())
|
||||
response = make_request(url, **kwargs)
|
||||
message_list = list(messages.get_messages(response.wsgi_request))
|
||||
self.assertEqual(len(message_list), 1)
|
||||
self.assertIn("success", message_list[0].tags)
|
||||
self.assertIn("You have activated your account.", message_list[0].message)
|
||||
assert len(message_list) == 1
|
||||
assert 'success' in message_list[0].tags
|
||||
assert 'You have activated your account.' in message_list[0].message
|
||||
|
||||
# ============ User creation and login ==============
|
||||
|
||||
@@ -211,7 +204,7 @@ class LoginEnrollmentTestCase(TestCase):
|
||||
"""
|
||||
resp = self.client.post(reverse('user_api_login_session'),
|
||||
{'email': email, 'password': password})
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
def logout(self):
|
||||
"""
|
||||
@@ -236,7 +229,7 @@ class LoginEnrollmentTestCase(TestCase):
|
||||
self.assert_request_status_code(200, url, method="POST", data=request_data)
|
||||
# Check both that the user is created, and inactive
|
||||
user = User.objects.get(email=email)
|
||||
self.assertFalse(user.is_active)
|
||||
assert not user.is_active
|
||||
return user
|
||||
|
||||
def activate_user(self, email):
|
||||
@@ -250,7 +243,7 @@ class LoginEnrollmentTestCase(TestCase):
|
||||
self.assert_account_activated(url)
|
||||
# Now make sure that the user is now actually activated
|
||||
user = User.objects.get(email=email)
|
||||
self.assertTrue(user.is_active)
|
||||
assert user.is_active
|
||||
# And return the user we fetched.
|
||||
return user
|
||||
|
||||
@@ -269,7 +262,7 @@ class LoginEnrollmentTestCase(TestCase):
|
||||
})
|
||||
result = resp.status_code == 200
|
||||
if verify:
|
||||
self.assertTrue(result)
|
||||
assert result
|
||||
return result
|
||||
|
||||
def unenroll(self, course):
|
||||
@@ -303,8 +296,8 @@ class CourseAccessTestMixin(TestCase):
|
||||
action (str): type of access to test.
|
||||
course (CourseDescriptor): a course.
|
||||
"""
|
||||
self.assertTrue(has_access(user, action, course))
|
||||
self.assertTrue(has_access(user, action, CourseOverview.get_from_id(course.id)))
|
||||
assert has_access(user, action, course)
|
||||
assert has_access(user, action, CourseOverview.get_from_id(course.id))
|
||||
|
||||
def assertCannotAccessCourse(self, user, action, course):
|
||||
"""
|
||||
@@ -324,8 +317,8 @@ class CourseAccessTestMixin(TestCase):
|
||||
them into one method with a boolean flag?), but it makes reading
|
||||
stack traces of failed tests easier to understand at a glance.
|
||||
"""
|
||||
self.assertFalse(has_access(user, action, course))
|
||||
self.assertFalse(has_access(user, action, CourseOverview.get_from_id(course.id)))
|
||||
assert not has_access(user, action, course)
|
||||
assert not has_access(user, action, CourseOverview.get_from_id(course.id))
|
||||
|
||||
|
||||
class MasqueradeMixin:
|
||||
@@ -369,8 +362,8 @@ class MasqueradeMixin:
|
||||
}),
|
||||
'application/json'
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertTrue(response.json()['success'], response.json().get('error'))
|
||||
assert response.status_code == 200
|
||||
assert response.json()['success'], response.json().get('error')
|
||||
return response
|
||||
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ class AboutTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase, EventTra
|
||||
|
||||
url = reverse('about_course', args=[text_type(self.course_without_about.id)])
|
||||
resp = self.client.get(url)
|
||||
self.assertEqual(resp.status_code, 404)
|
||||
assert resp.status_code == 404
|
||||
|
||||
@patch.dict(settings.FEATURES, {'ENABLE_MKTG_SITE': True})
|
||||
def test_logged_in_marketing(self):
|
||||
@@ -140,12 +140,12 @@ class AboutTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase, EventTra
|
||||
url = reverse('about_course', args=[text_type(self.course.id)])
|
||||
resp = self.client.get(url)
|
||||
# should be redirected
|
||||
self.assertEqual(resp.status_code, 302)
|
||||
assert resp.status_code == 302
|
||||
# follow this time, and check we're redirected to the course home page
|
||||
resp = self.client.get(url, follow=True)
|
||||
target_url = resp.redirect_chain[-1][0]
|
||||
course_home_url = reverse('openedx.course_experience.course_home', args=[text_type(self.course.id)])
|
||||
self.assertTrue(target_url.endswith(course_home_url))
|
||||
assert target_url.endswith(course_home_url)
|
||||
|
||||
@patch.dict(settings.FEATURES, {'ENABLE_COURSE_HOME_REDIRECT': False})
|
||||
@patch.dict(settings.FEATURES, {'ENABLE_MKTG_SITE': True})
|
||||
@@ -180,12 +180,10 @@ class AboutTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase, EventTra
|
||||
self.setup_user()
|
||||
url = reverse('about_course', args=[text_type(course.id)])
|
||||
resp = self.client.get(url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
pre_requisite_courses = get_prerequisite_courses_display(course)
|
||||
pre_requisite_course_about_url = reverse('about_course', args=[text_type(pre_requisite_courses[0]['key'])])
|
||||
self.assertIn(u"<span class=\"important-dates-item-text pre-requisite\"><a href=\"{}\">{}</a></span>"
|
||||
.format(pre_requisite_course_about_url, pre_requisite_courses[0]['display']),
|
||||
resp.content.decode(resp.charset).strip('\n'))
|
||||
assert u'<span class="important-dates-item-text pre-requisite"><a href="{}">{}</a></span>'.format(pre_requisite_course_about_url, pre_requisite_courses[0]['display']) in resp.content.decode(resp.charset).strip('\n') # pylint: disable=line-too-long
|
||||
|
||||
@patch.dict(settings.FEATURES, {'ENABLE_PREREQUISITE_COURSES': True})
|
||||
def test_about_page_unfulfilled_prereqs(self):
|
||||
@@ -216,16 +214,14 @@ class AboutTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase, EventTra
|
||||
|
||||
url = reverse('about_course', args=[text_type(course.id)])
|
||||
resp = self.client.get(url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
pre_requisite_courses = get_prerequisite_courses_display(course)
|
||||
pre_requisite_course_about_url = reverse('about_course', args=[text_type(pre_requisite_courses[0]['key'])])
|
||||
self.assertIn(u"<span class=\"important-dates-item-text pre-requisite\"><a href=\"{}\">{}</a></span>"
|
||||
.format(pre_requisite_course_about_url, pre_requisite_courses[0]['display']),
|
||||
resp.content.decode(resp.charset).strip('\n'))
|
||||
assert u'<span class="important-dates-item-text pre-requisite"><a href="{}">{}</a></span>'.format(pre_requisite_course_about_url, pre_requisite_courses[0]['display']) in resp.content.decode(resp.charset).strip('\n') # pylint: disable=line-too-long
|
||||
|
||||
url = reverse('about_course', args=[six.text_type(pre_requisite_course.id)])
|
||||
resp = self.client.get(url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
@ddt.data(
|
||||
[COURSE_VISIBILITY_PRIVATE],
|
||||
@@ -332,7 +328,7 @@ class AboutWithCappedEnrollmentsTestCase(LoginEnrollmentTestCase, SharedModuleSt
|
||||
|
||||
# Try to enroll as well
|
||||
result = self.enroll(self.course)
|
||||
self.assertFalse(result)
|
||||
assert not result
|
||||
|
||||
# Check that registration button is not present
|
||||
self.assertNotContains(resp, REG_STR)
|
||||
|
||||
@@ -7,6 +7,7 @@ Test the access control framework
|
||||
import datetime
|
||||
import itertools
|
||||
|
||||
import pytest
|
||||
import ddt
|
||||
import pytz
|
||||
import six
|
||||
@@ -116,11 +117,11 @@ class CoachAccessTestCaseCCX(SharedModuleStoreTestCase, LoginEnrollmentTestCase)
|
||||
ccx_locator = self.make_ccx()
|
||||
|
||||
# user have access as coach on ccx
|
||||
self.assertTrue(access.has_ccx_coach_role(self.coach, ccx_locator))
|
||||
assert access.has_ccx_coach_role(self.coach, ccx_locator)
|
||||
|
||||
# user dont have access as coach on ccx
|
||||
self.setup_user()
|
||||
self.assertFalse(access.has_ccx_coach_role(self.user, ccx_locator))
|
||||
assert not access.has_ccx_coach_role(self.user, ccx_locator)
|
||||
|
||||
def test_ccx_coach_has_staff_role(self):
|
||||
"""
|
||||
@@ -129,15 +130,15 @@ class CoachAccessTestCaseCCX(SharedModuleStoreTestCase, LoginEnrollmentTestCase)
|
||||
ccx_locator = self.make_ccx()
|
||||
|
||||
# coach user has access as staff on ccx
|
||||
self.assertTrue(access.has_access(self.coach, 'staff', ccx_locator))
|
||||
assert access.has_access(self.coach, 'staff', ccx_locator)
|
||||
|
||||
# basic user doesn't have staff access on ccx..
|
||||
self.setup_user()
|
||||
self.assertFalse(access.has_access(self.user, 'staff', ccx_locator))
|
||||
assert not access.has_access(self.user, 'staff', ccx_locator)
|
||||
|
||||
# until we give her a staff role.
|
||||
CourseStaffRole(ccx_locator).add_users(self.user)
|
||||
self.assertTrue(access.has_access(self.user, 'staff', ccx_locator))
|
||||
assert access.has_access(self.user, 'staff', ccx_locator)
|
||||
|
||||
def test_access_student_progress_ccx(self):
|
||||
"""
|
||||
@@ -151,12 +152,12 @@ class CoachAccessTestCaseCCX(SharedModuleStoreTestCase, LoginEnrollmentTestCase)
|
||||
|
||||
# Test for access of a coach
|
||||
resp = self.client.get(reverse('student_progress', args=[six.text_type(ccx_locator), student.id]))
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
# Assert access of a student
|
||||
self.client.login(username=student.username, password='test')
|
||||
resp = self.client.get(reverse('student_progress', args=[six.text_type(ccx_locator), self.coach.id]))
|
||||
self.assertEqual(resp.status_code, 404)
|
||||
assert resp.status_code == 404
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -187,15 +188,13 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
def verify_access(self, mock_unit, student_should_have_access, expected_error_type=None):
|
||||
""" Verify the expected result from _has_access_descriptor """
|
||||
response = access._has_access_descriptor(self.anonymous_user, 'load', mock_unit, course_key=self.course.id)
|
||||
self.assertEqual(student_should_have_access, bool(response))
|
||||
assert student_should_have_access == bool(response)
|
||||
|
||||
if expected_error_type is not None:
|
||||
self.assertIsInstance(response, expected_error_type)
|
||||
self.assertIsNotNone(response.to_json()['error_code'])
|
||||
assert isinstance(response, expected_error_type)
|
||||
assert response.to_json()['error_code'] is not None
|
||||
|
||||
self.assertTrue(
|
||||
access._has_access_descriptor(self.course_staff, 'load', mock_unit, course_key=self.course.id)
|
||||
)
|
||||
assert access._has_access_descriptor(self.course_staff, 'load', mock_unit, course_key=self.course.id)
|
||||
|
||||
def test_has_staff_access_to_preview_mode(self):
|
||||
"""
|
||||
@@ -205,9 +204,9 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
CourseEnrollmentFactory(user=self.student, course_id=self.course.id)
|
||||
|
||||
for user in [self.global_staff, self.course_staff, self.course_instructor]:
|
||||
self.assertTrue(access.has_staff_access_to_preview_mode(user, course_key))
|
||||
assert access.has_staff_access_to_preview_mode(user, course_key)
|
||||
|
||||
self.assertFalse(access.has_staff_access_to_preview_mode(self.student, course_key))
|
||||
assert not access.has_staff_access_to_preview_mode(self.student, course_key)
|
||||
|
||||
# we don't want to restrict a staff user, masquerading as student,
|
||||
# to access preview mode.
|
||||
@@ -218,7 +217,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
with patch('lms.djangoapps.courseware.access.is_masquerading_as_student') as mock_masquerade:
|
||||
mock_masquerade.return_value = True
|
||||
for user in [self.global_staff, self.course_staff, self.course_instructor, self.student]:
|
||||
self.assertTrue(access.has_staff_access_to_preview_mode(user, course_key))
|
||||
assert access.has_staff_access_to_preview_mode(user, course_key)
|
||||
|
||||
def test_administrative_accesses_to_course_for_user(self):
|
||||
"""
|
||||
@@ -231,9 +230,9 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
# Order matters here, for example `True` at first index in tuple essentially means
|
||||
# given user is a global staff.
|
||||
for count, user in enumerate([self.global_staff, self.course_staff, self.course_instructor]):
|
||||
self.assertTrue(access.administrative_accesses_to_course_for_user(user, course_key)[count])
|
||||
assert access.administrative_accesses_to_course_for_user(user, course_key)[count]
|
||||
|
||||
self.assertFalse(any(access.administrative_accesses_to_course_for_user(self.student, course_key)))
|
||||
assert not any(access.administrative_accesses_to_course_for_user(self.student, course_key))
|
||||
|
||||
def test_student_has_access(self):
|
||||
"""
|
||||
@@ -254,35 +253,29 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
with patch('lms.djangoapps.courseware.access.in_preview_mode') as mock_preview:
|
||||
mock_preview.return_value = False
|
||||
for obj in modules:
|
||||
self.assertTrue(bool(access.has_access(self.student, 'load', obj, course_key=self.course.id)))
|
||||
assert bool(access.has_access(self.student, 'load', obj, course_key=self.course.id))
|
||||
|
||||
with patch('lms.djangoapps.courseware.access.in_preview_mode') as mock_preview:
|
||||
mock_preview.return_value = True
|
||||
for obj in modules:
|
||||
self.assertFalse(bool(access.has_access(self.student, 'load', obj, course_key=self.course.id)))
|
||||
assert not bool(access.has_access(self.student, 'load', obj, course_key=self.course.id))
|
||||
|
||||
@patch('lms.djangoapps.courseware.access.in_preview_mode', Mock(return_value=True))
|
||||
def test_has_access_with_preview_mode(self):
|
||||
"""
|
||||
Tests particular user's can access content via has_access in preview mode.
|
||||
"""
|
||||
self.assertTrue(bool(access.has_access(self.global_staff, 'staff', self.course, course_key=self.course.id)))
|
||||
self.assertTrue(bool(access.has_access(self.course_staff, 'staff', self.course, course_key=self.course.id)))
|
||||
self.assertTrue(bool(access.has_access(
|
||||
self.course_instructor, 'staff', self.course, course_key=self.course.id
|
||||
)))
|
||||
self.assertFalse(bool(access.has_access(self.student, 'staff', self.course, course_key=self.course.id)))
|
||||
self.assertFalse(bool(access.has_access(self.student, 'load', self.course, course_key=self.course.id)))
|
||||
assert bool(access.has_access(self.global_staff, 'staff', self.course, course_key=self.course.id))
|
||||
assert bool(access.has_access(self.course_staff, 'staff', self.course, course_key=self.course.id))
|
||||
assert bool(access.has_access(self.course_instructor, 'staff', self.course, course_key=self.course.id))
|
||||
assert not bool(access.has_access(self.student, 'staff', self.course, course_key=self.course.id))
|
||||
assert not bool(access.has_access(self.student, 'load', self.course, course_key=self.course.id))
|
||||
|
||||
# When masquerading is true, user should not be able to access staff content
|
||||
with patch('lms.djangoapps.courseware.access.is_masquerading_as_student') as mock_masquerade:
|
||||
mock_masquerade.return_value = True
|
||||
self.assertFalse(
|
||||
bool(access.has_access(self.global_staff, 'staff', self.course, course_key=self.course.id))
|
||||
)
|
||||
self.assertFalse(
|
||||
bool(access.has_access(self.student, 'staff', self.course, course_key=self.course.id))
|
||||
)
|
||||
assert not bool(access.has_access(self.global_staff, 'staff', self.course, course_key=self.course.id))
|
||||
assert not bool(access.has_access(self.student, 'staff', self.course, course_key=self.course.id))
|
||||
|
||||
@patch('lms.djangoapps.courseware.access_utils.in_preview_mode', Mock(return_value=True))
|
||||
def test_has_access_in_preview_mode_with_group(self):
|
||||
@@ -310,86 +303,54 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
# User should not be able to preview when masquerading as student (and not in the group above).
|
||||
with patch('lms.djangoapps.courseware.access.get_user_role') as mock_user_role:
|
||||
mock_user_role.return_value = 'student'
|
||||
self.assertFalse(
|
||||
bool(access.has_access(self.global_staff, 'load', chapter, course_key=self.course.id))
|
||||
)
|
||||
assert not bool(access.has_access(self.global_staff, 'load', chapter, course_key=self.course.id))
|
||||
|
||||
# Should be able to preview when in staff or instructor role.
|
||||
for mocked_role in ['staff', 'instructor']:
|
||||
with patch('lms.djangoapps.courseware.access.get_user_role') as mock_user_role:
|
||||
mock_user_role.return_value = mocked_role
|
||||
self.assertTrue(
|
||||
bool(access.has_access(self.global_staff, 'load', chapter, course_key=self.course.id))
|
||||
)
|
||||
assert bool(access.has_access(self.global_staff, 'load', chapter, course_key=self.course.id))
|
||||
|
||||
# Now install masquerade group and set staff as a member of that.
|
||||
self.assertEqual(200, masquerade_as_group_member(self.global_staff, self.course, partition_id, group_0_id))
|
||||
assert 200 == masquerade_as_group_member(self.global_staff, self.course, partition_id, group_0_id)
|
||||
# Can load the chapter since user is in the group.
|
||||
self.assertTrue(
|
||||
bool(access.has_access(self.global_staff, 'load', chapter, course_key=self.course.id))
|
||||
)
|
||||
assert bool(access.has_access(self.global_staff, 'load', chapter, course_key=self.course.id))
|
||||
|
||||
# Move the user to be a part of the second group.
|
||||
self.assertEqual(200, masquerade_as_group_member(self.global_staff, self.course, partition_id, group_1_id))
|
||||
assert 200 == masquerade_as_group_member(self.global_staff, self.course, partition_id, group_1_id)
|
||||
# Cannot load the chapter since user is in a different group.
|
||||
self.assertFalse(
|
||||
bool(access.has_access(self.global_staff, 'load', chapter, course_key=self.course.id))
|
||||
)
|
||||
assert not bool(access.has_access(self.global_staff, 'load', chapter, course_key=self.course.id))
|
||||
|
||||
def test_has_access_to_course(self):
|
||||
self.assertFalse(access._has_access_to_course(
|
||||
None, 'staff', self.course.id
|
||||
))
|
||||
assert not access._has_access_to_course(None, 'staff', self.course.id)
|
||||
|
||||
self.assertFalse(access._has_access_to_course(
|
||||
self.anonymous_user, 'staff', self.course.id
|
||||
))
|
||||
self.assertFalse(access._has_access_to_course(
|
||||
self.anonymous_user, 'instructor', self.course.id
|
||||
))
|
||||
assert not access._has_access_to_course(self.anonymous_user, 'staff', self.course.id)
|
||||
assert not access._has_access_to_course(self.anonymous_user, 'instructor', self.course.id)
|
||||
|
||||
self.assertTrue(access._has_access_to_course(
|
||||
self.global_staff, 'staff', self.course.id
|
||||
))
|
||||
self.assertTrue(access._has_access_to_course(
|
||||
self.global_staff, 'instructor', self.course.id
|
||||
))
|
||||
assert access._has_access_to_course(self.global_staff, 'staff', self.course.id)
|
||||
assert access._has_access_to_course(self.global_staff, 'instructor', self.course.id)
|
||||
|
||||
# A user has staff access if they are in the staff group
|
||||
self.assertTrue(access._has_access_to_course(
|
||||
self.course_staff, 'staff', self.course.id
|
||||
))
|
||||
self.assertFalse(access._has_access_to_course(
|
||||
self.course_staff, 'instructor', self.course.id
|
||||
))
|
||||
assert access._has_access_to_course(self.course_staff, 'staff', self.course.id)
|
||||
assert not access._has_access_to_course(self.course_staff, 'instructor', self.course.id)
|
||||
|
||||
# A user has staff and instructor access if they are in the instructor group
|
||||
self.assertTrue(access._has_access_to_course(
|
||||
self.course_instructor, 'staff', self.course.id
|
||||
))
|
||||
self.assertTrue(access._has_access_to_course(
|
||||
self.course_instructor, 'instructor', self.course.id
|
||||
))
|
||||
assert access._has_access_to_course(self.course_instructor, 'staff', self.course.id)
|
||||
assert access._has_access_to_course(self.course_instructor, 'instructor', self.course.id)
|
||||
|
||||
# A user does not have staff or instructor access if they are
|
||||
# not in either the staff or the the instructor group
|
||||
self.assertFalse(access._has_access_to_course(
|
||||
self.student, 'staff', self.course.id
|
||||
))
|
||||
self.assertFalse(access._has_access_to_course(
|
||||
self.student, 'instructor', self.course.id
|
||||
))
|
||||
assert not access._has_access_to_course(self.student, 'staff', self.course.id)
|
||||
assert not access._has_access_to_course(self.student, 'instructor', self.course.id)
|
||||
|
||||
self.assertFalse(access._has_access_to_course(
|
||||
self.student, 'not_staff_or_instructor', self.course.id
|
||||
))
|
||||
assert not access._has_access_to_course(self.student, 'not_staff_or_instructor', self.course.id)
|
||||
|
||||
def test__has_access_string(self):
|
||||
user = Mock(is_staff=True)
|
||||
self.assertFalse(access._has_access_string(user, 'staff', 'not_global'))
|
||||
assert not access._has_access_string(user, 'staff', 'not_global')
|
||||
|
||||
user._has_global_staff_access.return_value = True
|
||||
self.assertTrue(access._has_access_string(user, 'staff', 'global'))
|
||||
assert access._has_access_string(user, 'staff', 'global')
|
||||
|
||||
self.assertRaises(ValueError, access._has_access_string, user, 'not_staff', 'global')
|
||||
|
||||
@@ -407,12 +368,9 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
(self.course_staff, expected_staff),
|
||||
(self.course_instructor, expected_instructor)
|
||||
):
|
||||
self.assertEqual(
|
||||
bool(access._has_access_error_desc(user, action, descriptor, self.course.id)),
|
||||
expected_response
|
||||
)
|
||||
assert bool(access._has_access_error_desc(user, action, descriptor, self.course.id)) == expected_response
|
||||
|
||||
with self.assertRaises(ValueError):
|
||||
with pytest.raises(ValueError):
|
||||
access._has_access_error_desc(self.course_instructor, 'not_load_or_staff', descriptor, self.course.id)
|
||||
|
||||
def test__has_access_descriptor(self):
|
||||
@@ -423,9 +381,9 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
descriptor.merged_group_access = {}
|
||||
|
||||
# Always returns true because DISABLE_START_DATES is set in test.py
|
||||
self.assertTrue(access._has_access_descriptor(user, 'load', descriptor))
|
||||
self.assertTrue(access._has_access_descriptor(user, 'instructor', descriptor))
|
||||
with self.assertRaises(ValueError):
|
||||
assert access._has_access_descriptor(user, 'load', descriptor)
|
||||
assert access._has_access_descriptor(user, 'instructor', descriptor)
|
||||
with pytest.raises(ValueError):
|
||||
access._has_access_descriptor(user, 'not_load_or_staff', descriptor)
|
||||
|
||||
@ddt.data(
|
||||
@@ -459,8 +417,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
mock_unit.visible_to_staff_only = False
|
||||
mock_unit.merged_group_access = {}
|
||||
|
||||
self.assertTrue(bool(access._has_access_descriptor(
|
||||
self.beta_user, 'load', mock_unit, course_key=self.course.id)))
|
||||
assert bool(access._has_access_descriptor(self.beta_user, 'load', mock_unit, course_key=self.course.id))
|
||||
|
||||
@ddt.data(None, YESTERDAY, TOMORROW)
|
||||
@patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False})
|
||||
@@ -513,11 +470,11 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
id=CourseLocator('edX', 'test', '2012_Fall'), enrollment_domain=''
|
||||
)
|
||||
CourseEnrollmentAllowedFactory(email=user.email, course_id=course.id)
|
||||
self.assertTrue(access._has_access_course(user, 'enroll', course))
|
||||
assert access._has_access_course(user, 'enroll', course)
|
||||
|
||||
# Staff can always enroll even outside the open enrollment period
|
||||
user = StaffFactory.create(course_key=course.id)
|
||||
self.assertTrue(access._has_access_course(user, 'enroll', course))
|
||||
assert access._has_access_course(user, 'enroll', course)
|
||||
|
||||
# Non-staff cannot enroll if it is between the start and end dates and invitation only
|
||||
# and not specifically allowed
|
||||
@@ -527,7 +484,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
invitation_only=True
|
||||
)
|
||||
user = UserFactory.create()
|
||||
self.assertFalse(access._has_access_course(user, 'enroll', course))
|
||||
assert not access._has_access_course(user, 'enroll', course)
|
||||
|
||||
# Non-staff can enroll if it is between the start and end dates and not invitation only
|
||||
course = Mock(
|
||||
@@ -535,7 +492,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
id=CourseLocator('edX', 'test', '2012_Fall'), enrollment_domain='',
|
||||
invitation_only=False
|
||||
)
|
||||
self.assertTrue(access._has_access_course(user, 'enroll', course))
|
||||
assert access._has_access_course(user, 'enroll', course)
|
||||
|
||||
# Non-staff cannot enroll outside the open enrollment period if not specifically allowed
|
||||
course = Mock(
|
||||
@@ -543,7 +500,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
id=CourseLocator('edX', 'test', '2012_Fall'), enrollment_domain='',
|
||||
invitation_only=False
|
||||
)
|
||||
self.assertFalse(access._has_access_course(user, 'enroll', course))
|
||||
assert not access._has_access_course(user, 'enroll', course)
|
||||
|
||||
def test__user_passed_as_none(self):
|
||||
"""Ensure has_access handles a user being passed as null"""
|
||||
@@ -561,30 +518,30 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
id=course_id,
|
||||
catalog_visibility=CATALOG_VISIBILITY_CATALOG_AND_ABOUT
|
||||
)
|
||||
self.assertTrue(access._has_access_course(user, 'see_in_catalog', course))
|
||||
self.assertTrue(access._has_access_course(user, 'see_about_page', course))
|
||||
self.assertTrue(access._has_access_course(staff, 'see_in_catalog', course))
|
||||
self.assertTrue(access._has_access_course(staff, 'see_about_page', course))
|
||||
assert access._has_access_course(user, 'see_in_catalog', course)
|
||||
assert access._has_access_course(user, 'see_about_page', course)
|
||||
assert access._has_access_course(staff, 'see_in_catalog', course)
|
||||
assert access._has_access_course(staff, 'see_about_page', course)
|
||||
|
||||
# Now set visibility to just about page
|
||||
course = Mock(
|
||||
id=CourseLocator('edX', 'test', '2012_Fall'),
|
||||
catalog_visibility=CATALOG_VISIBILITY_ABOUT
|
||||
)
|
||||
self.assertFalse(access._has_access_course(user, 'see_in_catalog', course))
|
||||
self.assertTrue(access._has_access_course(user, 'see_about_page', course))
|
||||
self.assertTrue(access._has_access_course(staff, 'see_in_catalog', course))
|
||||
self.assertTrue(access._has_access_course(staff, 'see_about_page', course))
|
||||
assert not access._has_access_course(user, 'see_in_catalog', course)
|
||||
assert access._has_access_course(user, 'see_about_page', course)
|
||||
assert access._has_access_course(staff, 'see_in_catalog', course)
|
||||
assert access._has_access_course(staff, 'see_about_page', course)
|
||||
|
||||
# Now set visibility to none, which means neither in catalog nor about pages
|
||||
course = Mock(
|
||||
id=CourseLocator('edX', 'test', '2012_Fall'),
|
||||
catalog_visibility=CATALOG_VISIBILITY_NONE
|
||||
)
|
||||
self.assertFalse(access._has_access_course(user, 'see_in_catalog', course))
|
||||
self.assertFalse(access._has_access_course(user, 'see_about_page', course))
|
||||
self.assertTrue(access._has_access_course(staff, 'see_in_catalog', course))
|
||||
self.assertTrue(access._has_access_course(staff, 'see_about_page', course))
|
||||
assert not access._has_access_course(user, 'see_in_catalog', course)
|
||||
assert not access._has_access_course(user, 'see_about_page', course)
|
||||
assert access._has_access_course(staff, 'see_in_catalog', course)
|
||||
assert access._has_access_course(staff, 'see_about_page', course)
|
||||
|
||||
@patch.dict("django.conf.settings.FEATURES", {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True})
|
||||
def test_access_on_course_with_pre_requisites(self):
|
||||
@@ -606,15 +563,15 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
# user should not be able to load course even if enrolled
|
||||
CourseEnrollmentFactory(user=user, course_id=course.id)
|
||||
response = access._has_access_course(user, 'load', course)
|
||||
self.assertFalse(response)
|
||||
self.assertIsInstance(response, access_response.MilestoneAccessError)
|
||||
assert not response
|
||||
assert isinstance(response, access_response.MilestoneAccessError)
|
||||
# Staff can always access course
|
||||
staff = StaffFactory.create(course_key=course.id)
|
||||
self.assertTrue(access._has_access_course(staff, 'load', course))
|
||||
assert access._has_access_course(staff, 'load', course)
|
||||
|
||||
# User should be able access after completing required course
|
||||
fulfill_course_milestone(pre_requisite_course.id, user)
|
||||
self.assertTrue(access._has_access_course(user, 'load', course))
|
||||
assert access._has_access_course(user, 'load', course)
|
||||
|
||||
@ddt.data(
|
||||
(True, True, True),
|
||||
@@ -629,11 +586,8 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
descriptor.visible_to_staff_only = False
|
||||
descriptor.mobile_available = mobile_available
|
||||
|
||||
self.assertEqual(
|
||||
bool(access._has_access_course(self.student, 'load_mobile', descriptor)),
|
||||
student_expected
|
||||
)
|
||||
self.assertEqual(bool(access._has_access_course(self.staff, 'load_mobile', descriptor)), staff_expected)
|
||||
assert bool(access._has_access_course(self.student, 'load_mobile', descriptor)) == student_expected
|
||||
assert bool(access._has_access_course(self.staff, 'load_mobile', descriptor)) == staff_expected
|
||||
|
||||
@patch.dict("django.conf.settings.FEATURES", {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True})
|
||||
def test_courseware_page_unfulfilled_prereqs(self):
|
||||
@@ -670,11 +624,11 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes
|
||||
'dashboard'
|
||||
)
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
assert response.status_code == 302
|
||||
|
||||
fulfill_course_milestone(pre_requisite_course.id, user)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
class UserRoleTestCase(TestCase):
|
||||
@@ -701,36 +655,21 @@ class UserRoleTestCase(TestCase):
|
||||
|
||||
def test_user_role_staff(self):
|
||||
"""Ensure that user role is student for staff masqueraded as student."""
|
||||
self.assertEqual(
|
||||
'staff',
|
||||
access.get_user_role(self.course_staff, self.course_key)
|
||||
)
|
||||
assert 'staff' == access.get_user_role(self.course_staff, self.course_key)
|
||||
# Masquerade staff
|
||||
self._install_masquerade(self.course_staff)
|
||||
self.assertEqual(
|
||||
'student',
|
||||
access.get_user_role(self.course_staff, self.course_key)
|
||||
)
|
||||
assert 'student' == access.get_user_role(self.course_staff, self.course_key)
|
||||
|
||||
def test_user_role_instructor(self):
|
||||
"""Ensure that user role is student for instructor masqueraded as student."""
|
||||
self.assertEqual(
|
||||
'instructor',
|
||||
access.get_user_role(self.course_instructor, self.course_key)
|
||||
)
|
||||
assert 'instructor' == access.get_user_role(self.course_instructor, self.course_key)
|
||||
# Masquerade instructor
|
||||
self._install_masquerade(self.course_instructor)
|
||||
self.assertEqual(
|
||||
'student',
|
||||
access.get_user_role(self.course_instructor, self.course_key)
|
||||
)
|
||||
assert 'student' == access.get_user_role(self.course_instructor, self.course_key)
|
||||
|
||||
def test_user_role_anonymous(self):
|
||||
"""Ensure that user role is student for anonymous user."""
|
||||
self.assertEqual(
|
||||
'student',
|
||||
access.get_user_role(self.anonymous_user, self.course_key)
|
||||
)
|
||||
assert 'student' == access.get_user_role(self.anonymous_user, self.course_key)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -806,10 +745,8 @@ class CourseOverviewAccessTestCase(ModuleStoreTestCase):
|
||||
course = getattr(self, course_attr_name)
|
||||
|
||||
course_overview = CourseOverview.get_from_id(course.id)
|
||||
self.assertEqual(
|
||||
bool(access.has_access(user, action, course, course_key=course.id)),
|
||||
bool(access.has_access(user, action, course_overview, course_key=course.id))
|
||||
)
|
||||
assert bool(access.has_access(user, action, course, course_key=course.id)) ==\
|
||||
bool(access.has_access(user, action, course_overview, course_key=course.id))
|
||||
|
||||
def test_course_overview_unsupported_action(self):
|
||||
"""
|
||||
@@ -817,7 +754,7 @@ class CourseOverviewAccessTestCase(ModuleStoreTestCase):
|
||||
ValueError.
|
||||
"""
|
||||
overview = CourseOverview.get_from_id(self.course_default.id)
|
||||
with self.assertRaises(ValueError):
|
||||
with pytest.raises(ValueError):
|
||||
access.has_access(self.user, '_non_existent_action', overview)
|
||||
|
||||
@ddt.data(
|
||||
|
||||
@@ -28,7 +28,7 @@ class TestComprehensiveTheming(TestCase):
|
||||
asserts presence of the content from header.html and footer.html
|
||||
"""
|
||||
resp = self.client.get('/')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
# This string comes from footer.html
|
||||
self.assertContains(resp, "super-ugly")
|
||||
|
||||
@@ -54,7 +54,7 @@ class TestComprehensiveTheming(TestCase):
|
||||
def do_the_test(self):
|
||||
"""A function to do the work so we can use the decorator."""
|
||||
resp = self.client.get('/')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
self.assertContains(resp, "TEMPORARY THEME")
|
||||
|
||||
do_the_test(self)
|
||||
@@ -63,19 +63,19 @@ class TestComprehensiveTheming(TestCase):
|
||||
|
||||
def test_default_logo_image(self):
|
||||
result = staticfiles.finders.find('images/logo.png')
|
||||
self.assertEqual(result, settings.REPO_ROOT / 'lms/static/images/logo.png')
|
||||
assert result == (settings.REPO_ROOT / 'lms/static/images/logo.png')
|
||||
|
||||
@with_comprehensive_theme('red-theme')
|
||||
def test_overridden_logo_image(self):
|
||||
result = staticfiles.finders.find('red-theme/images/logo.png')
|
||||
self.assertEqual(result, settings.REPO_ROOT / 'themes/red-theme/lms/static/images/logo.png')
|
||||
assert result == (settings.REPO_ROOT / 'themes/red-theme/lms/static/images/logo.png')
|
||||
|
||||
def test_default_favicon(self):
|
||||
"""
|
||||
Test default favicon is served if no theme is applied
|
||||
"""
|
||||
result = staticfiles.finders.find('images/favicon.ico')
|
||||
self.assertEqual(result, settings.REPO_ROOT / 'lms/static/images/favicon.ico')
|
||||
assert result == (settings.REPO_ROOT / 'lms/static/images/favicon.ico')
|
||||
|
||||
@with_comprehensive_theme('red-theme')
|
||||
def test_overridden_favicon(self):
|
||||
@@ -83,4 +83,4 @@ class TestComprehensiveTheming(TestCase):
|
||||
Test comprehensive theme override on favicon image.
|
||||
"""
|
||||
result = staticfiles.finders.find('red-theme/images/favicon.ico')
|
||||
self.assertEqual(result, settings.REPO_ROOT / 'themes/red-theme/lms/static/images/favicon.ico')
|
||||
assert result == (settings.REPO_ROOT / 'themes/red-theme/lms/static/images/favicon.ico')
|
||||
|
||||
@@ -27,19 +27,19 @@ class UserPrefContextProcessorUnitTest(ModuleStoreTestCase):
|
||||
def test_anonymous_user(self):
|
||||
self.request.user = AnonymousUser()
|
||||
context = user_timezone_locale_prefs(self.request)
|
||||
self.assertIsNone(context['user_timezone'])
|
||||
self.assertIsNone(context['user_language'])
|
||||
assert context['user_timezone'] is None
|
||||
assert context['user_language'] is None
|
||||
|
||||
def test_no_timezone_preference(self):
|
||||
set_user_preference(self.user, 'pref-lang', 'en')
|
||||
context = user_timezone_locale_prefs(self.request)
|
||||
self.assertIsNone(context['user_timezone'])
|
||||
self.assertIsNotNone(context['user_language'])
|
||||
self.assertEqual(context['user_language'], 'en')
|
||||
assert context['user_timezone'] is None
|
||||
assert context['user_language'] is not None
|
||||
assert context['user_language'] == 'en'
|
||||
|
||||
def test_no_language_preference(self):
|
||||
set_user_preference(self.user, 'time_zone', 'Asia/Tokyo')
|
||||
context = user_timezone_locale_prefs(self.request)
|
||||
self.assertIsNone(context['user_language'])
|
||||
self.assertIsNotNone(context['user_timezone'])
|
||||
self.assertEqual(context['user_timezone'], 'Asia/Tokyo')
|
||||
assert context['user_language'] is None
|
||||
assert context['user_timezone'] is not None
|
||||
assert context['user_timezone'] == 'Asia/Tokyo'
|
||||
|
||||
@@ -69,7 +69,7 @@ class CourseInfoTestCase(EnterpriseTestConsentRequired, LoginEnrollmentTestCase,
|
||||
self.enroll(self.course)
|
||||
url = reverse('info', args=[text_type(self.course.id)])
|
||||
resp = self.client.get(url)
|
||||
self.assertNotIn(b"You are not currently enrolled in this course", resp.content)
|
||||
assert b'You are not currently enrolled in this course' not in resp.content
|
||||
|
||||
# TODO: LEARNER-611: If this is only tested under Course Info, does this need to move?
|
||||
@mock.patch('openedx.features.enterprise_support.api.enterprise_customer_for_request')
|
||||
@@ -92,8 +92,8 @@ class CourseInfoTestCase(EnterpriseTestConsentRequired, LoginEnrollmentTestCase,
|
||||
def test_anonymous_user(self):
|
||||
url = reverse('info', args=[text_type(self.course.id)])
|
||||
resp = self.client.get(url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertNotIn(b"OOGIE BLOOGIE", resp.content)
|
||||
assert resp.status_code == 200
|
||||
assert b'OOGIE BLOOGIE' not in resp.content
|
||||
|
||||
def test_logged_in_not_enrolled(self):
|
||||
self.setup_user()
|
||||
@@ -107,7 +107,7 @@ class CourseInfoTestCase(EnterpriseTestConsentRequired, LoginEnrollmentTestCase,
|
||||
enrollment_exists = CourseEnrollment.objects.filter(
|
||||
user=self.user, course_id=self.course.id
|
||||
).exists()
|
||||
self.assertFalse(enrollment_exists)
|
||||
assert not enrollment_exists
|
||||
|
||||
@mock.patch.dict(settings.FEATURES, {'DISABLE_START_DATES': False})
|
||||
def test_non_live_course(self):
|
||||
@@ -152,7 +152,7 @@ class CourseInfoTestCase(EnterpriseTestConsentRequired, LoginEnrollmentTestCase,
|
||||
self.setup_user()
|
||||
url = reverse('info', args=['not/a/course'])
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@@ -178,7 +178,7 @@ class CourseInfoLastAccessedTestCase(LoginEnrollmentTestCase, ModuleStoreTestCas
|
||||
url = reverse('info', args=(six.text_type(self.course.id),))
|
||||
response = self.client.get(url)
|
||||
content = pq(response.content)
|
||||
self.assertEqual(content('.page-header-secondary a').length, 0)
|
||||
assert content('.page-header-secondary a').length == 0
|
||||
|
||||
def get_resume_course_url(self, course_info_url):
|
||||
"""
|
||||
@@ -210,17 +210,17 @@ class CourseInfoLastAccessedTestCase(LoginEnrollmentTestCase, ModuleStoreTestCas
|
||||
|
||||
# Assuring a non-authenticated user cannot see the resume course button.
|
||||
resume_course_url = self.get_resume_course_url(info_url)
|
||||
self.assertEqual(resume_course_url, None)
|
||||
assert resume_course_url is None
|
||||
|
||||
# Assuring an unenrolled user cannot see the resume course button.
|
||||
self.setup_user()
|
||||
resume_course_url = self.get_resume_course_url(info_url)
|
||||
self.assertEqual(resume_course_url, None)
|
||||
assert resume_course_url is None
|
||||
|
||||
# Assuring an enrolled user can see the resume course button.
|
||||
self.enroll(self.course)
|
||||
resume_course_url = self.get_resume_course_url(info_url)
|
||||
self.assertEqual(resume_course_url, section_url)
|
||||
assert resume_course_url == section_url
|
||||
|
||||
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@@ -298,21 +298,12 @@ class CourseInfoTitleTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase):
|
||||
|
||||
content = pq(response.content)
|
||||
|
||||
self.assertEqual(
|
||||
expected_title,
|
||||
content('.page-title').contents()[0].strip(),
|
||||
)
|
||||
assert expected_title == content('.page-title').contents()[0].strip()
|
||||
|
||||
if expected_subtitle is None:
|
||||
self.assertEqual(
|
||||
[],
|
||||
content('.page-subtitle'),
|
||||
)
|
||||
assert [] == content('.page-subtitle')
|
||||
else:
|
||||
self.assertEqual(
|
||||
expected_subtitle,
|
||||
content('.page-subtitle').contents()[0].strip(),
|
||||
)
|
||||
assert expected_subtitle == content('.page-subtitle').contents()[0].strip()
|
||||
|
||||
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@@ -428,7 +419,7 @@ class SelfPacedCourseInfoTestCase(LoginEnrollmentTestCase, SharedModuleStoreTest
|
||||
with check_mongo_calls(mongo_queries):
|
||||
with mock.patch("openedx.core.djangoapps.theming.helpers.get_current_site", return_value=None):
|
||||
resp = self.client.get(url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
def test_num_queries_instructor_paced(self):
|
||||
# TODO: decrease query count as part of REVO-28
|
||||
|
||||
@@ -101,7 +101,7 @@ class SurveyViewsTests(LoginEnrollmentTestCase, SharedModuleStoreTestCase, XssTe
|
||||
kwargs={'course_id': six.text_type(course.id)}
|
||||
)
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
def test_visiting_course_without_survey(self):
|
||||
"""
|
||||
@@ -128,7 +128,7 @@ class SurveyViewsTests(LoginEnrollmentTestCase, SharedModuleStoreTestCase, XssTe
|
||||
kwargs={'course_id': six.text_type(self.course.id)}
|
||||
)
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
def test_visiting_course_with_existing_answers(self):
|
||||
"""
|
||||
@@ -138,7 +138,7 @@ class SurveyViewsTests(LoginEnrollmentTestCase, SharedModuleStoreTestCase, XssTe
|
||||
self.postback_url,
|
||||
self.student_answers
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
self._assert_no_redirect(self.course)
|
||||
|
||||
@@ -154,7 +154,7 @@ class SurveyViewsTests(LoginEnrollmentTestCase, SharedModuleStoreTestCase, XssTe
|
||||
)
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
expected = u'<input type="hidden" name="course_id" value="{course_id}" />'.format(
|
||||
course_id=six.text_type(self.course.id)
|
||||
)
|
||||
@@ -175,7 +175,7 @@ class SurveyViewsTests(LoginEnrollmentTestCase, SharedModuleStoreTestCase, XssTe
|
||||
self.postback_url,
|
||||
answers
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
self._assert_no_redirect(self.course)
|
||||
|
||||
@@ -186,7 +186,7 @@ class SurveyViewsTests(LoginEnrollmentTestCase, SharedModuleStoreTestCase, XssTe
|
||||
)
|
||||
|
||||
for answer_obj in answer_objs:
|
||||
self.assertEqual(answer_obj.course_key, self.course.id)
|
||||
assert answer_obj.course_key == self.course.id
|
||||
|
||||
def test_visiting_course_with_bogus_survey(self):
|
||||
"""
|
||||
|
||||
@@ -67,42 +67,42 @@ class VerifiedUpgradeToolTest(SharedModuleStoreTestCase): # lint-amnesty, pylin
|
||||
self.request.user = self.enrollment.user
|
||||
|
||||
def test_tool_visible(self):
|
||||
self.assertTrue(VerifiedUpgradeTool().is_enabled(self.request, self.course.id))
|
||||
assert VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
def test_not_visible_when_no_enrollment_exists(self):
|
||||
self.enrollment.delete()
|
||||
|
||||
request = RequestFactory().request()
|
||||
request.user = UserFactory()
|
||||
self.assertFalse(VerifiedUpgradeTool().is_enabled(self.request, self.course.id))
|
||||
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
def test_not_visible_when_using_deadline_from_course_mode(self):
|
||||
DynamicUpgradeDeadlineConfiguration.objects.create(enabled=False)
|
||||
self.assertFalse(VerifiedUpgradeTool().is_enabled(self.request, self.course.id))
|
||||
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
def test_not_visible_when_enrollment_is_inactive(self):
|
||||
self.enrollment.is_active = False
|
||||
self.enrollment.save()
|
||||
self.assertFalse(VerifiedUpgradeTool().is_enabled(self.request, self.course.id))
|
||||
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
def test_not_visible_when_already_verified(self):
|
||||
self.enrollment.mode = CourseMode.VERIFIED
|
||||
self.enrollment.save()
|
||||
self.assertFalse(VerifiedUpgradeTool().is_enabled(self.request, self.course.id))
|
||||
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
def test_not_visible_when_no_verified_track(self):
|
||||
self.course_verified_mode.delete()
|
||||
self.assertFalse(VerifiedUpgradeTool().is_enabled(self.request, self.course.id))
|
||||
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
def test_not_visible_when_course_deadline_has_passed(self):
|
||||
self.course_verified_mode.expiration_datetime = self.now - datetime.timedelta(days=1)
|
||||
self.course_verified_mode.save()
|
||||
self.assertFalse(VerifiedUpgradeTool().is_enabled(self.request, self.course.id))
|
||||
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
def test_not_visible_when_course_mode_has_no_deadline(self):
|
||||
self.course_verified_mode.expiration_datetime = None
|
||||
self.course_verified_mode.save()
|
||||
self.assertFalse(VerifiedUpgradeTool().is_enabled(self.request, self.course.id))
|
||||
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
|
||||
class FinancialAssistanceToolTest(SharedModuleStoreTestCase):
|
||||
@@ -164,38 +164,38 @@ class FinancialAssistanceToolTest(SharedModuleStoreTestCase):
|
||||
|
||||
def test_tool_visible_logged_in(self):
|
||||
self.course_financial_mode.save()
|
||||
self.assertTrue(FinancialAssistanceTool().is_enabled(self.request, self.course.id))
|
||||
assert FinancialAssistanceTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
def test_tool_not_visible_when_not_eligible(self):
|
||||
self.course_overview.eligible_for_financial_aid = False
|
||||
self.course_overview.save()
|
||||
self.assertFalse(FinancialAssistanceTool().is_enabled(self.request, self.course_overview.id))
|
||||
assert not FinancialAssistanceTool().is_enabled(self.request, self.course_overview.id)
|
||||
|
||||
def test_tool_not_visible_when_user_not_enrolled(self):
|
||||
self.course_financial_mode.save()
|
||||
self.request.user = None
|
||||
self.assertFalse(FinancialAssistanceTool().is_enabled(self.request, self.course.id))
|
||||
assert not FinancialAssistanceTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
# mock the response from get_enrollment to use enrollment with course_upgrade_deadline in the past
|
||||
@patch('lms.djangoapps.courseware.course_tools.CourseEnrollment.get_enrollment')
|
||||
def test_not_visible_when_upgrade_deadline_has_passed(self, get_enrollment_mock):
|
||||
get_enrollment_mock.return_value = self.enrollment_deadline_past
|
||||
self.assertFalse(FinancialAssistanceTool().is_enabled(self.request, self.course.id))
|
||||
assert not FinancialAssistanceTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
# mock the response from get_enrollment to use enrollment with no course_upgrade_deadline
|
||||
@patch('lms.djangoapps.courseware.course_tools.CourseEnrollment.get_enrollment')
|
||||
def test_not_visible_when_no_upgrade_deadline(self, get_enrollment_mock):
|
||||
get_enrollment_mock.return_value = self.enrollment_deadline_missing
|
||||
self.assertFalse(FinancialAssistanceTool().is_enabled(self.request, self.course.id))
|
||||
assert not FinancialAssistanceTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
def test_tool_not_visible_when_end_date_passed(self):
|
||||
self.course_overview.end_date = self.now - datetime.timedelta(days=30)
|
||||
self.course_overview.save()
|
||||
self.assertFalse(FinancialAssistanceTool().is_enabled(self.request, self.course_overview.id))
|
||||
assert not FinancialAssistanceTool().is_enabled(self.request, self.course_overview.id)
|
||||
|
||||
# mock the response from get_enrollment to use enrollment where learner upgraded
|
||||
@patch('lms.djangoapps.courseware.course_tools.CourseEnrollment.get_enrollment')
|
||||
def test_tool_not_visible_when_already_upgraded(self, get_enrollment_mock):
|
||||
self.course_financial_mode.save()
|
||||
get_enrollment_mock.return_value = self.enrollment_upgraded
|
||||
self.assertFalse(FinancialAssistanceTool().is_enabled(self.request, self.course.id))
|
||||
assert not FinancialAssistanceTool().is_enabled(self.request, self.course.id)
|
||||
|
||||
@@ -7,6 +7,7 @@ Tests for course access
|
||||
import datetime
|
||||
import itertools
|
||||
|
||||
import pytest
|
||||
import ddt
|
||||
import mock
|
||||
import pytz
|
||||
@@ -75,9 +76,9 @@ class CoursesTest(ModuleStoreTestCase):
|
||||
)
|
||||
|
||||
cms_url = u"//{}/course/{}".format(CMS_BASE_TEST, six.text_type(self.course.id))
|
||||
self.assertEqual(cms_url, get_cms_course_link(self.course))
|
||||
assert cms_url == get_cms_course_link(self.course)
|
||||
cms_url = u"//{}/course/{}".format(CMS_BASE_TEST, six.text_type(self.course.location))
|
||||
self.assertEqual(cms_url, get_cms_block_link(self.course, 'course'))
|
||||
assert cms_url == get_cms_block_link(self.course, 'course')
|
||||
|
||||
@ddt.data(GET_COURSE_WITH_ACCESS, GET_COURSE_OVERVIEW_WITH_ACCESS)
|
||||
def test_get_course_func_with_access_error(self, course_access_func_name):
|
||||
@@ -85,11 +86,11 @@ class CoursesTest(ModuleStoreTestCase):
|
||||
user = UserFactory.create()
|
||||
course = CourseFactory.create(visible_to_staff_only=True)
|
||||
|
||||
with self.assertRaises(CoursewareAccessException) as error:
|
||||
with pytest.raises(CoursewareAccessException) as error:
|
||||
course_access_func(user, 'load', course.id)
|
||||
self.assertEqual(text_type(error.exception), "Course not found.")
|
||||
self.assertEqual(error.exception.access_response.error_code, "not_visible_to_user")
|
||||
self.assertFalse(error.exception.access_response.has_access)
|
||||
assert text_type(error.value) == 'Course not found.'
|
||||
assert error.value.access_response.error_code == 'not_visible_to_user'
|
||||
assert not error.value.access_response.has_access
|
||||
|
||||
@ddt.data(
|
||||
(GET_COURSE_WITH_ACCESS, 1),
|
||||
@@ -125,18 +126,14 @@ class CoursesTest(ModuleStoreTestCase):
|
||||
primary_course = CourseFactory.create(org=primary, emit_signals=True)
|
||||
alternate_course = CourseFactory.create(org=alternate, emit_signals=True)
|
||||
|
||||
self.assertNotEqual(primary_course.org, alternate_course.org)
|
||||
assert primary_course.org != alternate_course.org
|
||||
|
||||
unfiltered_courses = get_courses(user)
|
||||
for org in [primary_course.org, alternate_course.org]:
|
||||
self.assertTrue(
|
||||
any(course.org == org for course in unfiltered_courses)
|
||||
)
|
||||
assert any(((course.org == org) for course in unfiltered_courses))
|
||||
|
||||
filtered_courses = get_courses(user, org=primary)
|
||||
self.assertTrue(
|
||||
all(course.org == primary_course.org for course in filtered_courses)
|
||||
)
|
||||
assert all(((course.org == primary_course.org) for course in filtered_courses))
|
||||
|
||||
with mock.patch(
|
||||
'openedx.core.djangoapps.site_configuration.helpers.get_value',
|
||||
@@ -146,13 +143,11 @@ class CoursesTest(ModuleStoreTestCase):
|
||||
|
||||
# Request filtering for an org distinct from the designated org.
|
||||
no_courses = get_courses(user, org=primary)
|
||||
self.assertEqual(list(no_courses), [])
|
||||
assert list(no_courses) == []
|
||||
|
||||
# Request filtering for an org matching the designated org.
|
||||
site_courses = get_courses(user, org=alternate)
|
||||
self.assertTrue(
|
||||
all(course.org == alternate_course.org for course in site_courses)
|
||||
)
|
||||
assert all(((course.org == alternate_course.org) for course in site_courses))
|
||||
|
||||
def test_get_courses_with_filter(self):
|
||||
"""
|
||||
@@ -169,32 +164,25 @@ class CoursesTest(ModuleStoreTestCase):
|
||||
(dict(mobile_available=False), {non_mobile_course.id}),
|
||||
)
|
||||
for filter_, expected_courses in test_cases:
|
||||
self.assertEqual(
|
||||
{
|
||||
course.id
|
||||
for course in
|
||||
get_courses(user, filter_=filter_)
|
||||
},
|
||||
expected_courses,
|
||||
u"testing get_courses with filter_={}".format(filter_),
|
||||
)
|
||||
assert {course.id for course in get_courses(user, filter_=filter_)} ==\
|
||||
expected_courses, u'testing get_courses with filter_={}'.format(filter_)
|
||||
|
||||
def test_get_current_child(self):
|
||||
mock_xmodule = mock.MagicMock()
|
||||
self.assertIsNone(get_current_child(mock_xmodule))
|
||||
assert get_current_child(mock_xmodule) is None
|
||||
|
||||
mock_xmodule.position = -1
|
||||
mock_xmodule.get_display_items.return_value = ['one', 'two', 'three']
|
||||
self.assertEqual(get_current_child(mock_xmodule), 'one')
|
||||
assert get_current_child(mock_xmodule) == 'one'
|
||||
|
||||
mock_xmodule.position = 2
|
||||
self.assertEqual(get_current_child(mock_xmodule), 'two')
|
||||
self.assertEqual(get_current_child(mock_xmodule, requested_child='first'), 'one')
|
||||
self.assertEqual(get_current_child(mock_xmodule, requested_child='last'), 'three')
|
||||
assert get_current_child(mock_xmodule) == 'two'
|
||||
assert get_current_child(mock_xmodule, requested_child='first') == 'one'
|
||||
assert get_current_child(mock_xmodule, requested_child='last') == 'three'
|
||||
|
||||
mock_xmodule.position = 3
|
||||
mock_xmodule.get_display_items.return_value = []
|
||||
self.assertIsNone(get_current_child(mock_xmodule))
|
||||
assert get_current_child(mock_xmodule) is None
|
||||
|
||||
|
||||
class ModuleStoreBranchSettingTest(ModuleStoreTestCase):
|
||||
@@ -208,7 +196,7 @@ class ModuleStoreBranchSettingTest(ModuleStoreTestCase):
|
||||
MODULESTORE_BRANCH='fake_default_branch',
|
||||
)
|
||||
def test_default_modulestore_preview_mapping(self):
|
||||
self.assertEqual(_get_modulestore_branch_setting(), ModuleStoreEnum.Branch.draft_preferred)
|
||||
assert _get_modulestore_branch_setting() == ModuleStoreEnum.Branch.draft_preferred
|
||||
|
||||
@mock.patch(
|
||||
'xmodule.modulestore.django.get_current_request_hostname',
|
||||
@@ -219,7 +207,7 @@ class ModuleStoreBranchSettingTest(ModuleStoreTestCase):
|
||||
MODULESTORE_BRANCH='fake_default_branch',
|
||||
)
|
||||
def test_default_modulestore_branch_mapping(self):
|
||||
self.assertEqual(_get_modulestore_branch_setting(), 'fake_default_branch')
|
||||
assert _get_modulestore_branch_setting() == 'fake_default_branch'
|
||||
|
||||
|
||||
@override_settings(CMS_BASE=CMS_BASE_TEST)
|
||||
@@ -229,29 +217,17 @@ class MongoCourseImageTestCase(ModuleStoreTestCase):
|
||||
def test_get_image_url(self):
|
||||
"""Test image URL formatting."""
|
||||
course = CourseFactory.create(org='edX', course='999')
|
||||
self.assertEqual(course_image_url(course), '/c4x/edX/999/asset/{0}'.format(course.course_image))
|
||||
assert course_image_url(course) == '/c4x/edX/999/asset/{0}'.format(course.course_image)
|
||||
|
||||
def test_non_ascii_image_name(self):
|
||||
# Verify that non-ascii image names are cleaned
|
||||
course = CourseFactory.create(course_image=u'before_\N{SNOWMAN}_after.jpg')
|
||||
self.assertEqual(
|
||||
course_image_url(course),
|
||||
'/c4x/{org}/{course}/asset/before___after.jpg'.format(
|
||||
org=course.location.org,
|
||||
course=course.location.course
|
||||
)
|
||||
)
|
||||
assert course_image_url(course) == '/c4x/{org}/{course}/asset/before___after.jpg'.format(org=course.location.org, course=course.location.course) # pylint: disable=line-too-long
|
||||
|
||||
def test_spaces_in_image_name(self):
|
||||
# Verify that image names with spaces in them are cleaned
|
||||
course = CourseFactory.create(course_image=u'before after.jpg')
|
||||
self.assertEqual(
|
||||
course_image_url(course),
|
||||
'/c4x/{org}/{course}/asset/before_after.jpg'.format(
|
||||
org=course.location.org,
|
||||
course=course.location.course
|
||||
)
|
||||
)
|
||||
assert course_image_url(course) == '/c4x/{org}/{course}/asset/before_after.jpg'.format(org=course.location.org, course=course.location.course) # pylint: disable=line-too-long
|
||||
|
||||
def test_static_asset_path_course_image_default(self):
|
||||
"""
|
||||
@@ -259,10 +235,7 @@ class MongoCourseImageTestCase(ModuleStoreTestCase):
|
||||
being set that we get the right course_image url.
|
||||
"""
|
||||
course = CourseFactory.create(static_asset_path="foo")
|
||||
self.assertEqual(
|
||||
course_image_url(course),
|
||||
'/static/foo/images/course_image.jpg'
|
||||
)
|
||||
assert course_image_url(course) == '/static/foo/images/course_image.jpg'
|
||||
|
||||
def test_static_asset_path_course_image_set(self):
|
||||
"""
|
||||
@@ -271,10 +244,7 @@ class MongoCourseImageTestCase(ModuleStoreTestCase):
|
||||
"""
|
||||
course = CourseFactory.create(course_image=u'things_stuff.jpg',
|
||||
static_asset_path="foo")
|
||||
self.assertEqual(
|
||||
course_image_url(course),
|
||||
'/static/foo/things_stuff.jpg'
|
||||
)
|
||||
assert course_image_url(course) == '/static/foo/things_stuff.jpg'
|
||||
|
||||
|
||||
class XmlCourseImageTestCase(XModuleXmlImportTest):
|
||||
@@ -283,15 +253,15 @@ class XmlCourseImageTestCase(XModuleXmlImportTest):
|
||||
def test_get_image_url(self):
|
||||
"""Test image URL formatting."""
|
||||
course = self.process_xml(xml.CourseFactory.build())
|
||||
self.assertEqual(course_image_url(course), '/static/xml_test_course/images/course_image.jpg')
|
||||
assert course_image_url(course) == '/static/xml_test_course/images/course_image.jpg'
|
||||
|
||||
def test_non_ascii_image_name(self):
|
||||
course = self.process_xml(xml.CourseFactory.build(course_image=u'before_\N{SNOWMAN}_after.jpg'))
|
||||
self.assertEqual(course_image_url(course), u'/static/xml_test_course/before_\N{SNOWMAN}_after.jpg')
|
||||
assert course_image_url(course) == u'/static/xml_test_course/before_☃_after.jpg'
|
||||
|
||||
def test_spaces_in_image_name(self):
|
||||
course = self.process_xml(xml.CourseFactory.build(course_image=u'before after.jpg'))
|
||||
self.assertEqual(course_image_url(course), u'/static/xml_test_course/before after.jpg')
|
||||
assert course_image_url(course) == u'/static/xml_test_course/before after.jpg'
|
||||
|
||||
|
||||
class CoursesRenderTest(ModuleStoreTestCase):
|
||||
@@ -315,7 +285,7 @@ class CoursesRenderTest(ModuleStoreTestCase):
|
||||
def test_get_course_info_section_render(self):
|
||||
# Test render works okay
|
||||
course_info = get_course_info_section(self.request, self.request.user, self.course, 'handouts')
|
||||
self.assertEqual(course_info, u"<a href='/c4x/edX/toy/asset/handouts_sample_handout.txt'>Sample</a>")
|
||||
assert course_info == u"<a href='/c4x/edX/toy/asset/handouts_sample_handout.txt'>Sample</a>"
|
||||
|
||||
# Test when render raises an exception
|
||||
with mock.patch('lms.djangoapps.courseware.courses.get_module') as mock_module_render:
|
||||
@@ -323,13 +293,13 @@ class CoursesRenderTest(ModuleStoreTestCase):
|
||||
render=mock.Mock(side_effect=Exception('Render failed!'))
|
||||
)
|
||||
course_info = get_course_info_section(self.request, self.request.user, self.course, 'handouts')
|
||||
self.assertIn("this module is temporarily unavailable", course_info)
|
||||
assert 'this module is temporarily unavailable' in course_info
|
||||
|
||||
def test_get_course_about_section_render(self):
|
||||
|
||||
# Test render works okay
|
||||
course_about = get_course_about_section(self.request, self.course, 'short_description')
|
||||
self.assertEqual(course_about, "A course about toys.")
|
||||
assert course_about == 'A course about toys.'
|
||||
|
||||
# Test when render raises an exception
|
||||
with mock.patch('lms.djangoapps.courseware.courses.get_module') as mock_module_render:
|
||||
@@ -337,7 +307,7 @@ class CoursesRenderTest(ModuleStoreTestCase):
|
||||
render=mock.Mock(side_effect=Exception('Render failed!'))
|
||||
)
|
||||
course_about = get_course_about_section(self.request, self.course, 'short_description')
|
||||
self.assertIn("this module is temporarily unavailable", course_about)
|
||||
assert 'this module is temporarily unavailable' in course_about
|
||||
|
||||
|
||||
class CourseEnrollmentOpenTests(ModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
|
||||
@@ -349,41 +319,41 @@ class CourseEnrollmentOpenTests(ModuleStoreTestCase): # lint-amnesty, pylint: d
|
||||
start = self.now - datetime.timedelta(days=1)
|
||||
end = self.now + datetime.timedelta(days=1)
|
||||
course = CourseFactory(enrollment_start=start, enrollment_end=end)
|
||||
self.assertTrue(course_open_for_self_enrollment(course.id))
|
||||
assert course_open_for_self_enrollment(course.id)
|
||||
|
||||
def test_course_enrollment_closed_future(self):
|
||||
start = self.now + datetime.timedelta(days=1)
|
||||
end = self.now + datetime.timedelta(days=2)
|
||||
course = CourseFactory(enrollment_start=start, enrollment_end=end)
|
||||
self.assertFalse(course_open_for_self_enrollment(course.id))
|
||||
assert not course_open_for_self_enrollment(course.id)
|
||||
|
||||
def test_course_enrollment_closed_past(self):
|
||||
start = self.now - datetime.timedelta(days=2)
|
||||
end = self.now - datetime.timedelta(days=1)
|
||||
course = CourseFactory(enrollment_start=start, enrollment_end=end)
|
||||
self.assertFalse(course_open_for_self_enrollment(course.id))
|
||||
assert not course_open_for_self_enrollment(course.id)
|
||||
|
||||
def test_course_enrollment_dates_missing(self):
|
||||
course = CourseFactory()
|
||||
self.assertTrue(course_open_for_self_enrollment(course.id))
|
||||
assert course_open_for_self_enrollment(course.id)
|
||||
|
||||
def test_course_enrollment_dates_missing_start(self):
|
||||
end = self.now + datetime.timedelta(days=1)
|
||||
course = CourseFactory(enrollment_end=end)
|
||||
self.assertTrue(course_open_for_self_enrollment(course.id))
|
||||
assert course_open_for_self_enrollment(course.id)
|
||||
|
||||
end = self.now - datetime.timedelta(days=1)
|
||||
course = CourseFactory(enrollment_end=end)
|
||||
self.assertFalse(course_open_for_self_enrollment(course.id))
|
||||
assert not course_open_for_self_enrollment(course.id)
|
||||
|
||||
def test_course_enrollment_dates_missing_end(self):
|
||||
start = self.now - datetime.timedelta(days=1)
|
||||
course = CourseFactory(enrollment_start=start)
|
||||
self.assertTrue(course_open_for_self_enrollment(course.id))
|
||||
assert course_open_for_self_enrollment(course.id)
|
||||
|
||||
start = self.now + datetime.timedelta(days=1)
|
||||
course = CourseFactory(enrollment_start=start)
|
||||
self.assertFalse(course_open_for_self_enrollment(course.id))
|
||||
assert not course_open_for_self_enrollment(course.id)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -427,7 +397,7 @@ class CourseInstantiationTests(ModuleStoreTestCase):
|
||||
for chapter in course_module.get_children():
|
||||
for section in chapter.get_children():
|
||||
for item in section.get_children():
|
||||
self.assertTrue(item.graded)
|
||||
assert item.graded
|
||||
|
||||
|
||||
class TestGetCourseChapters(ModuleStoreTestCase):
|
||||
@@ -439,10 +409,10 @@ class TestGetCourseChapters(ModuleStoreTestCase):
|
||||
"""
|
||||
Test non-existant course returns empty list.
|
||||
"""
|
||||
self.assertEqual(get_course_chapter_ids(None), [])
|
||||
assert get_course_chapter_ids(None) == []
|
||||
# build a fake key
|
||||
fake_course_key = CourseKey.from_string('course-v1:FakeOrg+CN1+CR-FALLNEVER1')
|
||||
self.assertEqual(get_course_chapter_ids(fake_course_key), [])
|
||||
assert get_course_chapter_ids(fake_course_key) == []
|
||||
|
||||
def test_get_chapters(self):
|
||||
"""
|
||||
@@ -452,11 +422,8 @@ class TestGetCourseChapters(ModuleStoreTestCase):
|
||||
ItemFactory(parent=course, category='chapter')
|
||||
ItemFactory(parent=course, category='chapter')
|
||||
course_chapter_ids = get_course_chapter_ids(course.location.course_key)
|
||||
self.assertEqual(len(course_chapter_ids), 2)
|
||||
self.assertEqual(
|
||||
course_chapter_ids,
|
||||
[six.text_type(child) for child in course.children]
|
||||
)
|
||||
assert len(course_chapter_ids) == 2
|
||||
assert course_chapter_ids == [six.text_type(child) for child in course.children]
|
||||
|
||||
|
||||
class TestGetCourseAssignments(CompletionWaffleTestMixin, ModuleStoreTestCase):
|
||||
@@ -478,5 +445,5 @@ class TestGetCourseAssignments(CompletionWaffleTestMixin, ModuleStoreTestCase):
|
||||
BlockCompletion.objects.submit_completion(self.user, problem.location, 1)
|
||||
|
||||
assignments = get_course_assignments(course.location.context_key, self.user, None)
|
||||
self.assertEqual(len(assignments), 1)
|
||||
self.assertTrue(assignments[0].complete)
|
||||
assert len(assignments) == 1
|
||||
assert assignments[0].complete
|
||||
|
||||
@@ -69,7 +69,7 @@ class ProgressPageCreditRequirementsTest(SharedModuleStoreTestCase):
|
||||
self.user.profile.save()
|
||||
|
||||
result = self.client.login(username=self.USERNAME, password=self.PASSWORD)
|
||||
self.assertTrue(result, msg="Could not log in")
|
||||
assert result, 'Could not log in'
|
||||
|
||||
# Enroll the user in the course as "verified"
|
||||
self.enrollment = CourseEnrollmentFactory(
|
||||
|
||||
@@ -89,14 +89,14 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
course = create_course_run()
|
||||
url = reverse('openedx.course_experience.course_home', args=(course.id,))
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(200, response.status_code)
|
||||
assert 200 == response.status_code
|
||||
|
||||
# Tests for which blocks are enabled
|
||||
def assert_block_types(self, course, user, expected_blocks):
|
||||
"""Assert that the enabled block types for this course are as expected."""
|
||||
blocks = get_course_date_blocks(course, user)
|
||||
self.assertEqual(len(blocks), len(expected_blocks))
|
||||
self.assertEqual(set(type(b) for b in blocks), set(expected_blocks))
|
||||
assert len(blocks) == len(expected_blocks)
|
||||
assert set((type(b) for b in blocks)) == set(expected_blocks)
|
||||
|
||||
@ddt.data(
|
||||
# Verified enrollment with no photo-verification before course start
|
||||
@@ -241,22 +241,22 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
TodaysDate, CourseAssignmentDate, CourseAssignmentDate, CourseEndDate, VerificationDeadlineDate
|
||||
)
|
||||
blocks = get_course_date_blocks(course, user, request, num_assignments=2)
|
||||
self.assertEqual(len(blocks), len(expected_blocks))
|
||||
self.assertEqual(set(type(b) for b in blocks), set(expected_blocks))
|
||||
assert len(blocks) == len(expected_blocks)
|
||||
assert set((type(b) for b in blocks)) == set(expected_blocks)
|
||||
assignment_blocks = filter(lambda b: isinstance(b, CourseAssignmentDate), blocks)
|
||||
for assignment in assignment_blocks:
|
||||
assignment_title = str(assignment.title_html) or str(assignment.title)
|
||||
self.assertNotEqual(assignment_title, 'Third nearest assignment')
|
||||
self.assertNotEqual(assignment_title, 'Past due date')
|
||||
self.assertNotEqual(assignment_title, 'Not returned since we do not get non-graded subsections')
|
||||
assert assignment_title != 'Third nearest assignment'
|
||||
assert assignment_title != 'Past due date'
|
||||
assert assignment_title != 'Not returned since we do not get non-graded subsections'
|
||||
# checking if it is _in_ the title instead of being the title since released assignments
|
||||
# are actually links. Unreleased assignments are just the string of the title.
|
||||
if 'Released' in assignment_title:
|
||||
for html_tag in assignment_title_html:
|
||||
self.assertIn(html_tag, assignment_title)
|
||||
assert html_tag in assignment_title
|
||||
elif assignment_title == 'Not released':
|
||||
for html_tag in assignment_title_html:
|
||||
self.assertNotIn(html_tag, assignment_title)
|
||||
assert html_tag not in assignment_title
|
||||
|
||||
# No restrictions on number of assignments to return
|
||||
expected_blocks = (
|
||||
@@ -265,46 +265,46 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
VerificationDeadlineDate
|
||||
)
|
||||
blocks = get_course_date_blocks(course, user, request, include_past_dates=True)
|
||||
self.assertEqual(len(blocks), len(expected_blocks))
|
||||
self.assertEqual(set(type(b) for b in blocks), set(expected_blocks))
|
||||
assert len(blocks) == len(expected_blocks)
|
||||
assert set((type(b) for b in blocks)) == set(expected_blocks)
|
||||
assignment_blocks = filter(lambda b: isinstance(b, CourseAssignmentDate), blocks)
|
||||
for assignment in assignment_blocks:
|
||||
assignment_title = str(assignment.title_html) or str(assignment.title)
|
||||
self.assertNotEqual(assignment_title, 'Not returned since we do not get non-graded subsections')
|
||||
assert assignment_title != 'Not returned since we do not get non-graded subsections'
|
||||
|
||||
assignment_type = str(assignment.assignment_type)
|
||||
# checking if it is _in_ the title instead of being the title since released assignments
|
||||
# are actually links. Unreleased assignments are just the string of the title.
|
||||
# also checking that the assignment type is returned for graded subsections
|
||||
if 'Released' in assignment_title:
|
||||
self.assertEqual(assignment_type, 'Homework')
|
||||
assert assignment_type == 'Homework'
|
||||
for html_tag in assignment_title_html:
|
||||
self.assertIn(html_tag, assignment_title)
|
||||
assert html_tag in assignment_title
|
||||
elif assignment_title == 'Not released':
|
||||
self.assertEqual(assignment_type, 'Homework')
|
||||
assert assignment_type == 'Homework'
|
||||
for html_tag in assignment_title_html:
|
||||
self.assertNotIn(html_tag, assignment_title)
|
||||
assert html_tag not in assignment_title
|
||||
elif assignment_title == 'Third nearest assignment':
|
||||
self.assertEqual(assignment_type, 'Exam')
|
||||
assert assignment_type == 'Exam'
|
||||
# It's still not released
|
||||
for html_tag in assignment_title_html:
|
||||
self.assertNotIn(html_tag, assignment_title)
|
||||
assert html_tag not in assignment_title
|
||||
elif 'Past due date' in assignment_title:
|
||||
self.assertGreater(now, assignment.date)
|
||||
self.assertEqual(assignment_type, 'Exam')
|
||||
assert now > assignment.date
|
||||
assert assignment_type == 'Exam'
|
||||
for html_tag in assignment_title_html:
|
||||
self.assertIn(html_tag, assignment_title)
|
||||
assert html_tag in assignment_title
|
||||
elif 'No start date' == assignment_title:
|
||||
self.assertEqual(assignment_type, 'Speech')
|
||||
assert assignment_type == 'Speech'
|
||||
# Can't determine if it is released so it does not get a link
|
||||
for html_tag in assignment_title_html:
|
||||
self.assertNotIn(html_tag, assignment_title)
|
||||
assert html_tag not in assignment_title
|
||||
# This is the item with no display name where we set one ourselves.
|
||||
elif 'Assignment' in assignment_title:
|
||||
self.assertEqual(assignment_type, None)
|
||||
assert assignment_type is None
|
||||
# Can't determine if it is released so it does not get a link
|
||||
for html_tag in assignment_title_html:
|
||||
self.assertIn(html_tag, assignment_title)
|
||||
assert html_tag in assignment_title
|
||||
|
||||
@override_experiment_waffle_flag(RELATIVE_DATES_FLAG, active=True)
|
||||
@ddt.data(
|
||||
@@ -370,7 +370,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
submission_end=(now + timedelta(days=7)).isoformat(),
|
||||
)
|
||||
blocks = get_course_date_blocks(course, user, request, include_past_dates=True)
|
||||
self.assertEqual(len(blocks), date_block_count)
|
||||
assert len(blocks) == date_block_count
|
||||
|
||||
@override_experiment_waffle_flag(RELATIVE_DATES_FLAG, active=True)
|
||||
def test_enabled_block_types_with_expired_course(self):
|
||||
@@ -417,10 +417,10 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
course = create_course_run()
|
||||
user = create_user()
|
||||
block = TodaysDate(course, user)
|
||||
self.assertTrue(block.is_enabled)
|
||||
self.assertTrue(block.is_allowed)
|
||||
self.assertEqual(block.date, datetime.now(utc))
|
||||
self.assertEqual(block.title, 'current_datetime')
|
||||
assert block.is_enabled
|
||||
assert block.is_allowed
|
||||
assert block.date == datetime.now(utc)
|
||||
assert block.title == 'current_datetime'
|
||||
|
||||
@ddt.data(
|
||||
'info',
|
||||
@@ -472,7 +472,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
course = create_course_run()
|
||||
user = create_user()
|
||||
block = CourseStartDate(course, user)
|
||||
self.assertEqual(block.date, course.start)
|
||||
assert block.date == course.start
|
||||
|
||||
@ddt.data(
|
||||
'info',
|
||||
@@ -518,32 +518,24 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
user = create_user()
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.VERIFIED)
|
||||
block = CourseEndDate(course, user)
|
||||
self.assertEqual(
|
||||
block.description,
|
||||
'To earn a certificate, you must complete all requirements before this date.'
|
||||
)
|
||||
assert block.description == 'To earn a certificate, you must complete all requirements before this date.'
|
||||
|
||||
def test_course_end_date_for_non_certificate_eligible_mode(self):
|
||||
course = create_course_run(days_till_start=-1)
|
||||
user = create_user()
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.AUDIT)
|
||||
block = CourseEndDate(course, user)
|
||||
self.assertEqual(
|
||||
block.description,
|
||||
'After this date, course content will be archived.'
|
||||
)
|
||||
self.assertEqual(block.title, 'Course End')
|
||||
assert block.description == 'After this date, course content will be archived.'
|
||||
assert block.title == 'Course End'
|
||||
|
||||
def test_course_end_date_after_course(self):
|
||||
course = create_course_run(days_till_start=-2, days_till_end=-1)
|
||||
user = create_user()
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.VERIFIED)
|
||||
block = CourseEndDate(course, user)
|
||||
self.assertEqual(
|
||||
block.description,
|
||||
'This course is archived, which means you can review course content but it is no longer active.'
|
||||
)
|
||||
self.assertEqual(block.title, 'Course End')
|
||||
assert block.description ==\
|
||||
'This course is archived, which means you can review course content but it is no longer active.'
|
||||
assert block.title == 'Course End'
|
||||
|
||||
@ddt.data(
|
||||
{'weeks_to_complete': 7}, # Weeks to complete > time til end (end date shown)
|
||||
@@ -567,11 +559,11 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
with patch('lms.djangoapps.courseware.date_summary.get_course_run_details') as mock_get_cr_details:
|
||||
mock_get_cr_details.return_value = cr_details
|
||||
block = CourseEndDate(course, user)
|
||||
self.assertEqual(block.title, 'Course End')
|
||||
assert block.title == 'Course End'
|
||||
if cr_details['weeks_to_complete'] > end_timedelta_number:
|
||||
self.assertEqual(block.date, course.end)
|
||||
assert block.date == course.end
|
||||
else:
|
||||
self.assertIsNone(block.date)
|
||||
assert block.date is None
|
||||
|
||||
def test_ecommerce_checkout_redirect(self):
|
||||
"""Verify the block link redirects to ecommerce checkout if it's enabled."""
|
||||
@@ -585,7 +577,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.VERIFIED)
|
||||
|
||||
block = VerifiedUpgradeDeadlineDate(course, user)
|
||||
self.assertEqual(block.link, '{}?sku={}'.format(configuration.basket_checkout_page, sku))
|
||||
assert block.link == '{}?sku={}'.format(configuration.basket_checkout_page, sku)
|
||||
|
||||
## CertificateAvailableDate
|
||||
@waffle.testutils.override_switch('certificates.auto_certificate_generation', True)
|
||||
@@ -594,8 +586,8 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
user = create_user()
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.AUDIT)
|
||||
block = CertificateAvailableDate(course, user)
|
||||
self.assertEqual(block.date, None)
|
||||
self.assertFalse(block.is_allowed)
|
||||
assert block.date is None
|
||||
assert not block.is_allowed
|
||||
|
||||
## CertificateAvailableDate
|
||||
@waffle.testutils.override_switch('certificates.auto_certificate_generation', True)
|
||||
@@ -606,8 +598,8 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
course.certificate_available_date = datetime.now(utc) + timedelta(days=7)
|
||||
course.save()
|
||||
block = CertificateAvailableDate(course, verified_user)
|
||||
self.assertNotEqual(block.date, None)
|
||||
self.assertFalse(block.is_allowed)
|
||||
assert block.date is not None
|
||||
assert not block.is_allowed
|
||||
|
||||
def test_no_certificate_available_date_for_audit_course(self):
|
||||
"""
|
||||
@@ -621,16 +613,16 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
CourseEnrollmentFactory(course_id=course.id, user=audit_user, mode=CourseMode.AUDIT)
|
||||
CourseMode.objects.get(course_id=course.id, mode_slug=CourseMode.VERIFIED).delete()
|
||||
all_course_modes = CourseMode.modes_for_course(course.id)
|
||||
self.assertEqual(len(all_course_modes), 1)
|
||||
self.assertEqual(all_course_modes[0].slug, CourseMode.AUDIT)
|
||||
assert len(all_course_modes) == 1
|
||||
assert all_course_modes[0].slug == CourseMode.AUDIT
|
||||
|
||||
course.certificate_available_date = datetime.now(utc) + timedelta(days=7)
|
||||
course.save()
|
||||
|
||||
# Verify Certificate Available Date is not enabled for learner.
|
||||
block = CertificateAvailableDate(course, audit_user)
|
||||
self.assertFalse(block.is_allowed)
|
||||
self.assertNotEqual(block.date, None)
|
||||
assert not block.is_allowed
|
||||
assert block.date is not None
|
||||
|
||||
@waffle.testutils.override_switch('certificates.auto_certificate_generation', True)
|
||||
def test_certificate_available_date_defined(self):
|
||||
@@ -646,9 +638,9 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
]
|
||||
self.assert_block_types(course, verified_user, expected_blocks)
|
||||
for block in (CertificateAvailableDate(course, audit_user), CertificateAvailableDate(course, verified_user)):
|
||||
self.assertIsNotNone(course.certificate_available_date)
|
||||
self.assertEqual(block.date, course.certificate_available_date)
|
||||
self.assertTrue(block.is_allowed)
|
||||
assert course.certificate_available_date is not None
|
||||
assert block.date == course.certificate_available_date
|
||||
assert block.is_allowed
|
||||
|
||||
## VerificationDeadlineDate
|
||||
def test_no_verification_deadline(self):
|
||||
@@ -656,15 +648,15 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
user = create_user()
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.VERIFIED)
|
||||
block = VerificationDeadlineDate(course, user)
|
||||
self.assertIsNone(block.date)
|
||||
self.assertTrue(block.is_allowed)
|
||||
assert block.date is None
|
||||
assert block.is_allowed
|
||||
|
||||
def test_no_verified_enrollment(self):
|
||||
course = create_course_run(days_till_start=-1)
|
||||
user = create_user()
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.AUDIT)
|
||||
block = VerificationDeadlineDate(course, user)
|
||||
self.assertFalse(block.is_allowed)
|
||||
assert not block.is_allowed
|
||||
|
||||
def test_verification_deadline_date_upcoming(self):
|
||||
with freeze_time('2015-01-02'):
|
||||
@@ -673,15 +665,13 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.VERIFIED)
|
||||
|
||||
block = VerificationDeadlineDate(course, user)
|
||||
self.assertEqual(block.css_class, 'verification-deadline-upcoming')
|
||||
self.assertEqual(block.title, 'Verification Deadline')
|
||||
self.assertEqual(block.date, datetime.now(utc) + timedelta(days=14))
|
||||
self.assertEqual(
|
||||
block.description,
|
||||
'You must successfully complete verification before this date to qualify for a Verified Certificate.'
|
||||
)
|
||||
self.assertEqual(block.link_text, 'Verify My Identity')
|
||||
self.assertEqual(block.link, IDVerificationService.get_verify_location(course.id))
|
||||
assert block.css_class == 'verification-deadline-upcoming'
|
||||
assert block.title == 'Verification Deadline'
|
||||
assert block.date == (datetime.now(utc) + timedelta(days=14))
|
||||
assert block.description ==\
|
||||
'You must successfully complete verification before this date to qualify for a Verified Certificate.'
|
||||
assert block.link_text == 'Verify My Identity'
|
||||
assert block.link == IDVerificationService.get_verify_location(course.id)
|
||||
|
||||
def test_verification_deadline_date_retry(self):
|
||||
with freeze_time('2015-01-02'):
|
||||
@@ -690,15 +680,13 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.VERIFIED)
|
||||
|
||||
block = VerificationDeadlineDate(course, user)
|
||||
self.assertEqual(block.css_class, 'verification-deadline-retry')
|
||||
self.assertEqual(block.title, 'Verification Deadline')
|
||||
self.assertEqual(block.date, datetime.now(utc) + timedelta(days=14))
|
||||
self.assertEqual(
|
||||
block.description,
|
||||
'You must successfully complete verification before this date to qualify for a Verified Certificate.'
|
||||
)
|
||||
self.assertEqual(block.link_text, 'Retry Verification')
|
||||
self.assertEqual(block.link, IDVerificationService.get_verify_location())
|
||||
assert block.css_class == 'verification-deadline-retry'
|
||||
assert block.title == 'Verification Deadline'
|
||||
assert block.date == (datetime.now(utc) + timedelta(days=14))
|
||||
assert block.description ==\
|
||||
'You must successfully complete verification before this date to qualify for a Verified Certificate.'
|
||||
assert block.link_text == 'Retry Verification'
|
||||
assert block.link == IDVerificationService.get_verify_location()
|
||||
|
||||
def test_verification_deadline_date_denied(self):
|
||||
with freeze_time('2015-01-02'):
|
||||
@@ -707,15 +695,12 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.VERIFIED)
|
||||
|
||||
block = VerificationDeadlineDate(course, user)
|
||||
self.assertEqual(block.css_class, 'verification-deadline-passed')
|
||||
self.assertEqual(block.title, 'Missed Verification Deadline')
|
||||
self.assertEqual(block.date, datetime.now(utc) + timedelta(days=-1))
|
||||
self.assertEqual(
|
||||
block.description,
|
||||
"Unfortunately you missed this course's deadline for a successful verification."
|
||||
)
|
||||
self.assertEqual(block.link_text, 'Learn More')
|
||||
self.assertEqual(block.link, '')
|
||||
assert block.css_class == 'verification-deadline-passed'
|
||||
assert block.title == 'Missed Verification Deadline'
|
||||
assert block.date == (datetime.now(utc) + timedelta(days=(- 1)))
|
||||
assert block.description == "Unfortunately you missed this course's deadline for a successful verification."
|
||||
assert block.link_text == 'Learn More'
|
||||
assert block.link == ''
|
||||
|
||||
@ddt.data(
|
||||
(-1, u'1 day ago - {date}'),
|
||||
@@ -729,7 +714,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
CourseEnrollmentFactory(course_id=course.id, user=user, mode=CourseMode.VERIFIED)
|
||||
|
||||
block = VerificationDeadlineDate(course, user)
|
||||
self.assertEqual(block.relative_datestring, expected_date_string)
|
||||
assert block.relative_datestring == expected_date_string
|
||||
|
||||
@ddt.data(
|
||||
('info', True),
|
||||
@@ -816,10 +801,10 @@ class TestDateAlerts(SharedModuleStoreTestCase):
|
||||
block.register_alerts(self.request, self.course)
|
||||
messages = list(CourseHomeMessages.user_messages(self.request))
|
||||
if expected_message_html:
|
||||
self.assertEqual(len(messages), 1)
|
||||
self.assertIn(expected_message_html, messages[0].message_html)
|
||||
assert len(messages) == 1
|
||||
assert expected_message_html in messages[0].message_html
|
||||
else:
|
||||
self.assertEqual(len(messages), 0)
|
||||
assert len(messages) == 0
|
||||
|
||||
@ddt.data(
|
||||
['2017-06-30 09:00:00', None],
|
||||
@@ -840,10 +825,10 @@ class TestDateAlerts(SharedModuleStoreTestCase):
|
||||
block.register_alerts(self.request, self.course)
|
||||
messages = list(CourseHomeMessages.user_messages(self.request))
|
||||
if expected_message_html:
|
||||
self.assertEqual(len(messages), 1)
|
||||
self.assertIn(expected_message_html, messages[0].message_html)
|
||||
assert len(messages) == 1
|
||||
assert expected_message_html in messages[0].message_html
|
||||
else:
|
||||
self.assertEqual(len(messages), 0)
|
||||
assert len(messages) == 0
|
||||
|
||||
@ddt.data(
|
||||
['2017-06-20 09:00:00', None],
|
||||
@@ -865,10 +850,10 @@ class TestDateAlerts(SharedModuleStoreTestCase):
|
||||
block.register_alerts(self.request, self.course)
|
||||
messages = list(CourseHomeMessages.user_messages(self.request))
|
||||
if expected_message_html:
|
||||
self.assertEqual(len(messages), 1)
|
||||
self.assertIn(expected_message_html, messages[0].message_html)
|
||||
assert len(messages) == 1
|
||||
assert expected_message_html in messages[0].message_html
|
||||
else:
|
||||
self.assertEqual(len(messages), 0)
|
||||
assert len(messages) == 0
|
||||
|
||||
@ddt.data(
|
||||
['2017-07-15 08:00:00', None],
|
||||
@@ -889,10 +874,10 @@ class TestDateAlerts(SharedModuleStoreTestCase):
|
||||
block.register_alerts(self.request, self.course)
|
||||
messages = list(CourseHomeMessages.user_messages(self.request))
|
||||
if expected_message_html:
|
||||
self.assertEqual(len(messages), 1)
|
||||
self.assertIn(expected_message_html, messages[0].message_html)
|
||||
assert len(messages) == 1
|
||||
assert expected_message_html in messages[0].message_html
|
||||
else:
|
||||
self.assertEqual(len(messages), 0)
|
||||
assert len(messages) == 0
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -918,18 +903,16 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
|
||||
expected = overview.start + timedelta(days=global_config.deadline_days)
|
||||
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
|
||||
block = VerifiedUpgradeDeadlineDate(course, enrollment.user)
|
||||
self.assertEqual(block.date, expected)
|
||||
assert block.date == expected
|
||||
self._check_text(block)
|
||||
|
||||
def _check_text(self, upgrade_date_summary):
|
||||
""" Validates the text on an upgrade_date_summary """
|
||||
self.assertEqual(upgrade_date_summary.title, 'Upgrade to Verified Certificate')
|
||||
self.assertEqual(
|
||||
upgrade_date_summary.description,
|
||||
'Don\'t miss the opportunity to highlight your new knowledge and skills by earning a verified'
|
||||
' certificate.'
|
||||
)
|
||||
self.assertEqual(upgrade_date_summary.relative_datestring, u'by {date}')
|
||||
assert upgrade_date_summary.title == 'Upgrade to Verified Certificate'
|
||||
assert upgrade_date_summary.description ==\
|
||||
"Don't miss the opportunity to highlight your new knowledge and skills by earning a verified" \
|
||||
" certificate."
|
||||
assert upgrade_date_summary.relative_datestring == u'by {date}'
|
||||
|
||||
@override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
|
||||
def test_date_with_self_paced_with_enrollment_after_course_start(self):
|
||||
@@ -944,7 +927,7 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
|
||||
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
|
||||
block = VerifiedUpgradeDeadlineDate(course, enrollment.user)
|
||||
expected = enrollment.created + timedelta(days=global_config.deadline_days)
|
||||
self.assertEqual(block.date, expected)
|
||||
assert block.date == expected
|
||||
|
||||
# Orgs should be able to override the deadline
|
||||
org_config = OrgDynamicUpgradeDeadlineConfiguration.objects.create(
|
||||
@@ -953,7 +936,7 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
|
||||
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
|
||||
block = VerifiedUpgradeDeadlineDate(course, enrollment.user)
|
||||
expected = enrollment.created + timedelta(days=org_config.deadline_days)
|
||||
self.assertEqual(block.date, expected)
|
||||
assert block.date == expected
|
||||
|
||||
# Courses should be able to override the deadline (and the org-level override)
|
||||
course_config = CourseDynamicUpgradeDeadlineConfiguration.objects.create(
|
||||
@@ -962,7 +945,7 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
|
||||
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
|
||||
block = VerifiedUpgradeDeadlineDate(course, enrollment.user)
|
||||
expected = enrollment.created + timedelta(days=course_config.deadline_days)
|
||||
self.assertEqual(block.date, expected)
|
||||
assert block.date == expected
|
||||
|
||||
@override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
|
||||
def test_date_with_self_paced_without_dynamic_upgrade_deadline(self):
|
||||
@@ -973,7 +956,7 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
|
||||
expected = CourseMode.objects.get(course_id=course.id, mode_slug=CourseMode.VERIFIED).expiration_datetime
|
||||
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
|
||||
block = VerifiedUpgradeDeadlineDate(course, enrollment.user)
|
||||
self.assertEqual(block.date, expected)
|
||||
assert block.date == expected
|
||||
|
||||
@override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
|
||||
def test_date_with_existing_schedule(self):
|
||||
@@ -985,18 +968,18 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
|
||||
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
|
||||
|
||||
# The enrollment has a schedule, but the upgrade deadline should be None
|
||||
self.assertIsNone(enrollment.schedule.upgrade_deadline)
|
||||
assert enrollment.schedule.upgrade_deadline is None
|
||||
|
||||
block = VerifiedUpgradeDeadlineDate(course, enrollment.user)
|
||||
expected = CourseMode.objects.get(course_id=course.id, mode_slug=CourseMode.VERIFIED).expiration_datetime
|
||||
self.assertEqual(block.date, expected)
|
||||
assert block.date == expected
|
||||
|
||||
# Now if we turn on the feature for this course, this existing enrollment should be unaffected
|
||||
course_config.enabled = True
|
||||
course_config.save()
|
||||
|
||||
block = VerifiedUpgradeDeadlineDate(course, enrollment.user)
|
||||
self.assertEqual(block.date, expected)
|
||||
assert block.date == expected
|
||||
|
||||
@ddt.data(
|
||||
# (enroll before configs, org enabled, org opt-out, course enabled, course opt-out, expected dynamic deadline)
|
||||
@@ -1056,9 +1039,9 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
|
||||
|
||||
# The enrollment has a schedule, and the upgrade_deadline is set when expected_dynamic_deadline is True
|
||||
if not enroll_first:
|
||||
self.assertEqual(enrollment.schedule.upgrade_deadline is not None, expected_dynamic_deadline)
|
||||
assert (enrollment.schedule.upgrade_deadline is not None) == expected_dynamic_deadline
|
||||
# The CourseEnrollment.upgrade_deadline property method is checking the configs
|
||||
self.assertEqual(enrollment.dynamic_upgrade_deadline is not None, expected_dynamic_deadline)
|
||||
assert (enrollment.dynamic_upgrade_deadline is not None) == expected_dynamic_deadline
|
||||
|
||||
|
||||
def create_user(verification_status=None):
|
||||
|
||||
@@ -109,14 +109,14 @@ class TestGetDjangoUser(TestDiscussionXBlock):
|
||||
actual_user = self.block.django_user
|
||||
self.runtime.service.assert_called_once_with( # lint-amnesty, pylint: disable=no-member
|
||||
self.block, 'user')
|
||||
self.assertEqual(actual_user, self.django_user)
|
||||
assert actual_user == self.django_user
|
||||
|
||||
def test_django_user_handles_missing_service(self):
|
||||
"""
|
||||
Tests that get_django gracefully handles missing user service.
|
||||
"""
|
||||
self.runtime.service.return_value = None
|
||||
self.assertEqual(self.block.django_user, None)
|
||||
assert self.block.django_user is None
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -143,14 +143,14 @@ class TestViews(TestDiscussionXBlock):
|
||||
Returns context passed to rendering of the django template
|
||||
(rendered by runtime).
|
||||
"""
|
||||
self.assertEqual(self.render_template.call_count, 1)
|
||||
assert self.render_template.call_count == 1
|
||||
return self.render_template.call_args_list[0][0][1]
|
||||
|
||||
def get_rendered_template(self):
|
||||
"""
|
||||
Returns the name of the template rendered by runtime.
|
||||
"""
|
||||
self.assertEqual(self.render_template.call_count, 1)
|
||||
assert self.render_template.call_count == 1
|
||||
return self.render_template.call_args_list[0][0][0]
|
||||
|
||||
def test_studio_view(self):
|
||||
@@ -158,8 +158,8 @@ class TestViews(TestDiscussionXBlock):
|
||||
Test for the studio view.
|
||||
"""
|
||||
fragment = self.block.author_view()
|
||||
self.assertIsInstance(fragment, Fragment)
|
||||
self.assertEqual(fragment.content, self.template_canary)
|
||||
assert isinstance(fragment, Fragment)
|
||||
assert fragment.content == self.template_canary
|
||||
self.render_template.assert_called_once_with(
|
||||
'discussion/_discussion_inline_studio.html',
|
||||
{'discussion_id': self.discussion_id}
|
||||
@@ -194,7 +194,7 @@ class TestViews(TestDiscussionXBlock):
|
||||
context = self.get_template_context()
|
||||
|
||||
for permission_name, expected_value in expected_permissions.items():
|
||||
self.assertEqual(expected_value, context[permission_name])
|
||||
assert expected_value == context[permission_name]
|
||||
|
||||
def test_js_init(self):
|
||||
"""
|
||||
@@ -202,7 +202,7 @@ class TestViews(TestDiscussionXBlock):
|
||||
"""
|
||||
with mock.patch.object(loader, 'render_template', mock.Mock):
|
||||
fragment = self.block.student_view()
|
||||
self.assertEqual(fragment.js_init_fn, 'DiscussionInlineBlock')
|
||||
assert fragment.js_init_fn == 'DiscussionInlineBlock'
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -221,13 +221,13 @@ class TestTemplates(TestDiscussionXBlock):
|
||||
return_value=permission_canary,
|
||||
) as has_perm:
|
||||
actual_permission = self.block.has_permission("test_permission")
|
||||
self.assertEqual(actual_permission, permission_canary)
|
||||
assert actual_permission == permission_canary
|
||||
has_perm.assert_called_once_with(self.django_user_canary, 'test_permission', 'test_course')
|
||||
|
||||
def test_studio_view(self):
|
||||
"""Test for studio view."""
|
||||
fragment = self.block.author_view({})
|
||||
self.assertIn('data-discussion-id="{}"'.format(self.discussion_id), fragment.content)
|
||||
assert 'data-discussion-id="{}"'.format(self.discussion_id) in fragment.content
|
||||
|
||||
@ddt.data(
|
||||
(True, False, False),
|
||||
@@ -247,10 +247,10 @@ class TestTemplates(TestDiscussionXBlock):
|
||||
self.block.has_permission = lambda perm: permission_dict[perm]
|
||||
fragment = self.block.student_view()
|
||||
read_only = 'false' if permissions[0] else 'true'
|
||||
self.assertIn('data-discussion-id="{}"'.format(self.discussion_id), fragment.content)
|
||||
self.assertIn('data-user-create-comment="{}"'.format(json.dumps(permissions[1])), fragment.content)
|
||||
self.assertIn('data-user-create-subcomment="{}"'.format(json.dumps(permissions[2])), fragment.content)
|
||||
self.assertIn('data-read-only="{read_only}"'.format(read_only=read_only), fragment.content)
|
||||
assert 'data-discussion-id="{}"'.format(self.discussion_id) in fragment.content
|
||||
assert 'data-user-create-comment="{}"'.format(json.dumps(permissions[1])) in fragment.content
|
||||
assert 'data-user-create-subcomment="{}"'.format(json.dumps(permissions[2])) in fragment.content
|
||||
assert 'data-read-only="{read_only}"'.format(read_only=read_only) in fragment.content
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -303,8 +303,8 @@ class TestXBlockInCourse(SharedModuleStoreTestCase):
|
||||
|
||||
fragment = discussion_xblock.render('student_view')
|
||||
html = fragment.content
|
||||
self.assertIn('data-user-create-comment="false"', html)
|
||||
self.assertIn('data-user-create-subcomment="false"', html)
|
||||
assert 'data-user-create-comment="false"' in html
|
||||
assert 'data-user-create-subcomment="false"' in html
|
||||
|
||||
@ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
|
||||
def test_discussion_render_successfully_with_orphan_parent(self, default_store):
|
||||
@@ -333,8 +333,8 @@ class TestXBlockInCourse(SharedModuleStoreTestCase):
|
||||
|
||||
root = self.get_root(discussion)
|
||||
# Assert that orphan sequential is root of the discussion xblock.
|
||||
self.assertEqual(orphan_sequential.location.block_type, root.location.block_type)
|
||||
self.assertEqual(orphan_sequential.location.block_id, root.location.block_id)
|
||||
assert orphan_sequential.location.block_type == root.location.block_type
|
||||
assert orphan_sequential.location.block_id == root.location.block_id
|
||||
|
||||
# Get xblock bound to a user and a descriptor.
|
||||
discussion_xblock = get_module_for_descriptor_internal(
|
||||
@@ -350,9 +350,9 @@ class TestXBlockInCourse(SharedModuleStoreTestCase):
|
||||
fragment = discussion_xblock.render('student_view')
|
||||
html = fragment.content
|
||||
|
||||
self.assertIsInstance(discussion_xblock, DiscussionXBlock)
|
||||
self.assertIn('data-user-create-comment="false"', html)
|
||||
self.assertIn('data-user-create-subcomment="false"', html)
|
||||
assert isinstance(discussion_xblock, DiscussionXBlock)
|
||||
assert 'data-user-create-comment="false"' in html
|
||||
assert 'data-user-create-subcomment="false"' in html
|
||||
|
||||
def test_discussion_student_view_data(self):
|
||||
"""
|
||||
@@ -367,14 +367,14 @@ class TestXBlockInCourse(SharedModuleStoreTestCase):
|
||||
'student_view_data': 'discussion'
|
||||
}
|
||||
response = self.client.get(url, query_params)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.data['root'], six.text_type(self.course_usage_key))
|
||||
assert response.status_code == 200
|
||||
assert response.data['root'] == six.text_type(self.course_usage_key)
|
||||
for block_key_string, block_data in six.iteritems(response.data['blocks']):
|
||||
block_key = deserialize_usage_key(block_key_string, self.course_key)
|
||||
self.assertEqual(block_data['id'], block_key_string)
|
||||
self.assertEqual(block_data['type'], block_key.block_type)
|
||||
self.assertEqual(block_data['display_name'], self.store.get_item(block_key).display_name or '')
|
||||
self.assertEqual(block_data['student_view_data'], {"topic_id": self.discussion_id})
|
||||
assert block_data['id'] == block_key_string
|
||||
assert block_data['type'] == block_key.block_type
|
||||
assert block_data['display_name'] == (self.store.get_item(block_key).display_name or '')
|
||||
assert block_data['student_view_data'] == {'topic_id': self.discussion_id}
|
||||
|
||||
|
||||
class TestXBlockQueryLoad(SharedModuleStoreTestCase):
|
||||
@@ -424,5 +424,5 @@ class TestXBlockQueryLoad(SharedModuleStoreTestCase):
|
||||
num_queries = 0
|
||||
|
||||
html = fragment.content
|
||||
self.assertIn('data-user-create-comment="false"', html)
|
||||
self.assertIn('data-user-create-subcomment="false"', html)
|
||||
assert 'data-user-create-comment="false"' in html
|
||||
assert 'data-user-create-subcomment="false"' in html
|
||||
|
||||
@@ -281,15 +281,15 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
test get entrance exam content method
|
||||
"""
|
||||
exam_chapter = get_entrance_exam_content(self.request.user, self.course)
|
||||
self.assertEqual(exam_chapter.url_name, self.entrance_exam.url_name)
|
||||
self.assertFalse(user_has_passed_entrance_exam(self.request.user, self.course))
|
||||
assert exam_chapter.url_name == self.entrance_exam.url_name
|
||||
assert not user_has_passed_entrance_exam(self.request.user, self.course)
|
||||
|
||||
answer_entrance_exam_problem(self.course, self.request, self.problem_1)
|
||||
answer_entrance_exam_problem(self.course, self.request, self.problem_2)
|
||||
|
||||
exam_chapter = get_entrance_exam_content(self.request.user, self.course)
|
||||
self.assertEqual(exam_chapter, None)
|
||||
self.assertTrue(user_has_passed_entrance_exam(self.request.user, self.course))
|
||||
assert exam_chapter is None
|
||||
assert user_has_passed_entrance_exam(self.request.user, self.course)
|
||||
|
||||
def test_entrance_exam_requirement_message(self):
|
||||
"""
|
||||
@@ -331,7 +331,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
resp,
|
||||
u'To access course materials, you must score {}% or higher'.format(minimum_score_pct),
|
||||
)
|
||||
self.assertIn(u'Your current score is 20%.', resp.content.decode(resp.charset))
|
||||
assert u'Your current score is 20%.' in resp.content.decode(resp.charset)
|
||||
|
||||
def test_entrance_exam_requirement_message_hidden(self):
|
||||
"""
|
||||
@@ -352,7 +352,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
}
|
||||
)
|
||||
resp = self.client.get(url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
self.assertNotContains(resp, 'To access course materials, you must score')
|
||||
self.assertNotContains(resp, 'You have passed the entrance exam.')
|
||||
|
||||
@@ -388,7 +388,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
chaos_user = UserFactory()
|
||||
locked_toc = self._return_table_of_contents()
|
||||
for toc_section in self.expected_locked_toc:
|
||||
self.assertIn(toc_section, locked_toc)
|
||||
assert toc_section in locked_toc
|
||||
|
||||
# Set up the chaos user
|
||||
answer_entrance_exam_problem(self.course, self.request, self.problem_1, chaos_user)
|
||||
@@ -398,7 +398,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
unlocked_toc = self._return_table_of_contents()
|
||||
|
||||
for toc_section in self.expected_unlocked_toc:
|
||||
self.assertIn(toc_section, unlocked_toc)
|
||||
assert toc_section in unlocked_toc
|
||||
|
||||
def test_skip_entrance_exam_gating(self):
|
||||
"""
|
||||
@@ -407,7 +407,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
# make sure toc is locked before allowing user to skip entrance exam
|
||||
locked_toc = self._return_table_of_contents()
|
||||
for toc_section in self.expected_locked_toc:
|
||||
self.assertIn(toc_section, locked_toc)
|
||||
assert toc_section in locked_toc
|
||||
|
||||
# hit skip entrance exam api in instructor app
|
||||
instructor = InstructorFactory(course_key=self.course.id)
|
||||
@@ -416,11 +416,11 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
response = self.client.post(url, {
|
||||
'unique_student_identifier': self.request.user.email,
|
||||
})
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
unlocked_toc = self._return_table_of_contents()
|
||||
for toc_section in self.expected_unlocked_toc:
|
||||
self.assertIn(toc_section, unlocked_toc)
|
||||
assert toc_section in unlocked_toc
|
||||
|
||||
def test_entrance_exam_gating_for_staff(self):
|
||||
"""
|
||||
@@ -437,7 +437,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
self.request.user = staff_user
|
||||
unlocked_toc = self._return_table_of_contents()
|
||||
for toc_section in self.expected_unlocked_toc:
|
||||
self.assertIn(toc_section, unlocked_toc)
|
||||
assert toc_section in unlocked_toc
|
||||
|
||||
def test_courseware_page_access_without_passing_entrance_exam(self):
|
||||
"""
|
||||
@@ -508,14 +508,14 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
"""
|
||||
Test can_skip_entrance_exam method with anonymous user
|
||||
"""
|
||||
self.assertFalse(user_can_skip_entrance_exam(self.anonymous_user, self.course))
|
||||
assert not user_can_skip_entrance_exam(self.anonymous_user, self.course)
|
||||
|
||||
def test_has_passed_entrance_exam_with_anonymous_user(self):
|
||||
"""
|
||||
Test has_passed_entrance_exam method with anonymous user
|
||||
"""
|
||||
self.request.user = self.anonymous_user
|
||||
self.assertFalse(user_has_passed_entrance_exam(self.request.user, self.course))
|
||||
assert not user_has_passed_entrance_exam(self.request.user, self.course)
|
||||
|
||||
def test_course_has_entrance_exam_missing_exam_id(self):
|
||||
course = CourseFactory.create(
|
||||
@@ -523,12 +523,12 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
'entrance_exam_enabled': True,
|
||||
}
|
||||
)
|
||||
self.assertFalse(course_has_entrance_exam(course))
|
||||
assert not course_has_entrance_exam(course)
|
||||
|
||||
def test_user_has_passed_entrance_exam_short_circuit_missing_exam(self):
|
||||
course = CourseFactory.create(
|
||||
)
|
||||
self.assertTrue(user_has_passed_entrance_exam(self.request.user, course))
|
||||
assert user_has_passed_entrance_exam(self.request.user, course)
|
||||
|
||||
@patch.dict("django.conf.settings.FEATURES", {'ENABLE_MASQUERADE': False})
|
||||
def test_entrance_exam_xblock_response(self):
|
||||
@@ -549,7 +549,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
'xmodule_handler',
|
||||
'problem_check',
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
self.assertContains(response, 'entrance_exam_passed')
|
||||
|
||||
def _assert_chapter_loaded(self, course, chapter):
|
||||
@@ -561,7 +561,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
kwargs={'course_id': six.text_type(course.id), 'chapter': chapter.url_name}
|
||||
)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
def _return_table_of_contents(self):
|
||||
"""
|
||||
|
||||
@@ -16,7 +16,7 @@ class FaviconTestCase(UrlResetMixin, TestCase):
|
||||
|
||||
def test_favicon_redirect(self):
|
||||
resp = self.client.get("/favicon.ico")
|
||||
self.assertEqual(resp.status_code, 301)
|
||||
assert resp.status_code == 301
|
||||
self.assertRedirects(
|
||||
resp,
|
||||
"/static/images/favicon.ico",
|
||||
@@ -28,7 +28,7 @@ class FaviconTestCase(UrlResetMixin, TestCase):
|
||||
self.reset_urls()
|
||||
|
||||
resp = self.client.get("/favicon.ico")
|
||||
self.assertEqual(resp.status_code, 301)
|
||||
assert resp.status_code == 301
|
||||
self.assertRedirects(
|
||||
resp,
|
||||
"/static/images/foo.ico",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Tests for `field_overrides` module.
|
||||
"""
|
||||
import unittest
|
||||
|
||||
import pytest
|
||||
from django.test.utils import override_settings
|
||||
from xblock.field_data import DictFieldData
|
||||
|
||||
@@ -84,49 +84,49 @@ class OverrideFieldDataTests(OverrideFieldBase):
|
||||
|
||||
def test_get(self):
|
||||
data = self.make_one()
|
||||
self.assertEqual(data.get('block', 'foo'), 'fu')
|
||||
self.assertEqual(data.get('block', 'bees'), 'knees')
|
||||
assert data.get('block', 'foo') == 'fu'
|
||||
assert data.get('block', 'bees') == 'knees'
|
||||
with disable_overrides():
|
||||
self.assertEqual(data.get('block', 'foo'), 'bar')
|
||||
assert data.get('block', 'foo') == 'bar'
|
||||
|
||||
def test_set(self):
|
||||
data = self.make_one()
|
||||
data.set('block', 'foo', 'yowza')
|
||||
self.assertEqual(data.get('block', 'foo'), 'fu')
|
||||
assert data.get('block', 'foo') == 'fu'
|
||||
with disable_overrides():
|
||||
self.assertEqual(data.get('block', 'foo'), 'yowza')
|
||||
assert data.get('block', 'foo') == 'yowza'
|
||||
|
||||
def test_delete(self):
|
||||
data = self.make_one()
|
||||
data.delete('block', 'foo')
|
||||
self.assertEqual(data.get('block', 'foo'), 'fu')
|
||||
assert data.get('block', 'foo') == 'fu'
|
||||
with disable_overrides():
|
||||
# Since field_data is responsible for attribute access, you'd
|
||||
# expect it to raise AttributeError. In fact, it raises KeyError,
|
||||
# so we check for that.
|
||||
with self.assertRaises(KeyError):
|
||||
with pytest.raises(KeyError):
|
||||
data.get('block', 'foo')
|
||||
|
||||
def test_has(self):
|
||||
data = self.make_one()
|
||||
self.assertTrue(data.has('block', 'foo'))
|
||||
self.assertTrue(data.has('block', 'bees'))
|
||||
self.assertTrue(data.has('block', 'oh'))
|
||||
assert data.has('block', 'foo')
|
||||
assert data.has('block', 'bees')
|
||||
assert data.has('block', 'oh')
|
||||
with disable_overrides():
|
||||
self.assertFalse(data.has('block', 'oh'))
|
||||
assert not data.has('block', 'oh')
|
||||
|
||||
def test_many(self):
|
||||
data = self.make_one()
|
||||
data.set_many('block', {'foo': 'baz', 'ah': 'ic'})
|
||||
self.assertEqual(data.get('block', 'foo'), 'fu')
|
||||
self.assertEqual(data.get('block', 'ah'), 'ic')
|
||||
assert data.get('block', 'foo') == 'fu'
|
||||
assert data.get('block', 'ah') == 'ic'
|
||||
with disable_overrides():
|
||||
self.assertEqual(data.get('block', 'foo'), 'baz')
|
||||
assert data.get('block', 'foo') == 'baz'
|
||||
|
||||
@override_settings(FIELD_OVERRIDE_PROVIDERS=())
|
||||
def test_no_overrides_configured(self):
|
||||
data = self.make_one()
|
||||
self.assertIsInstance(data, DictFieldData)
|
||||
assert isinstance(data, DictFieldData)
|
||||
|
||||
|
||||
@override_settings(
|
||||
@@ -142,7 +142,7 @@ class OverrideModulestoreFieldDataTests(FieldOverrideTestMixin, OverrideFieldDat
|
||||
@override_settings(MODULESTORE_FIELD_OVERRIDE_PROVIDERS=[])
|
||||
def test_no_overrides_configured(self):
|
||||
data = self.make_one()
|
||||
self.assertIsInstance(data, DictFieldData)
|
||||
assert isinstance(data, DictFieldData)
|
||||
|
||||
|
||||
class ResolveDottedTests(unittest.TestCase):
|
||||
@@ -151,18 +151,15 @@ class ResolveDottedTests(unittest.TestCase):
|
||||
"""
|
||||
|
||||
def test_bad_sub_import(self):
|
||||
with self.assertRaises(ImportError):
|
||||
with pytest.raises(ImportError):
|
||||
resolve_dotted('lms.djangoapps.courseware.tests.test_foo')
|
||||
|
||||
def test_bad_import(self):
|
||||
with self.assertRaises(ImportError):
|
||||
with pytest.raises(ImportError):
|
||||
resolve_dotted('nosuchpackage')
|
||||
|
||||
def test_import_something_that_isnt_already_loaded(self):
|
||||
self.assertEqual(
|
||||
resolve_dotted('lms.djangoapps.courseware.tests.animport.SOMENAME'),
|
||||
'bar'
|
||||
)
|
||||
assert resolve_dotted('lms.djangoapps.courseware.tests.animport.SOMENAME') == 'bar'
|
||||
|
||||
|
||||
def inject_field_overrides(blocks, course, user):
|
||||
|
||||
@@ -48,7 +48,7 @@ class TestFooter(TestCase):
|
||||
Verify that the homepage, when accessed at edx.org, has the edX footer
|
||||
"""
|
||||
resp = self.client.get('/')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
self.assertContains(resp, 'footer-edx-v3')
|
||||
|
||||
def test_openedx_footer(self):
|
||||
@@ -57,7 +57,7 @@ class TestFooter(TestCase):
|
||||
edx.org, has the Open edX footer
|
||||
"""
|
||||
resp = self.client.get('/')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
self.assertContains(resp, 'footer-openedx')
|
||||
|
||||
@with_comprehensive_theme("edx.org")
|
||||
|
||||
@@ -182,17 +182,15 @@ class GroupAccessTestCase(ModuleStoreTestCase):
|
||||
"""
|
||||
DRY helper.
|
||||
"""
|
||||
self.assertIs(
|
||||
bool(access.has_access(user, 'load', modulestore().get_item(block_location), self.course.id)),
|
||||
is_accessible
|
||||
)
|
||||
assert bool(access.has_access(user, 'load', modulestore().get_item(block_location), self.course.id))\
|
||||
is is_accessible
|
||||
|
||||
def ensure_staff_access(self, block_location):
|
||||
"""
|
||||
Another DRY helper.
|
||||
"""
|
||||
block = modulestore().get_item(block_location)
|
||||
self.assertTrue(access.has_access(self.staff, 'load', block, self.course.id))
|
||||
assert access.has_access(self.staff, 'load', block, self.course.id)
|
||||
|
||||
# NOTE: in all the tests that follow, `block_specified` and
|
||||
# `block_accessed` designate the place where group_access rules are
|
||||
|
||||
@@ -39,9 +39,9 @@ class BaseI18nTestCase(CacheIsolationTestCase):
|
||||
regex_string = six.text_type(r"""<{tag} [^>]*\b{attname}=['"]([\w\d\- ]+)['"][^>]*>""") # noqa: W605,E501
|
||||
regex = regex_string.format(tag=tag, attname=attname)
|
||||
match = re.search(regex, content)
|
||||
self.assertTrue(match, u"Couldn't find desired tag '%s' with attr '%s' in %r" % (tag, attname, content))
|
||||
assert match, (u"Couldn't find desired tag '%s' with attr '%s' in %r" % (tag, attname, content))
|
||||
attvalues = match.group(1).split()
|
||||
self.assertIn(value, attvalues)
|
||||
assert value in attvalues
|
||||
|
||||
def release_languages(self, languages):
|
||||
"""
|
||||
@@ -80,27 +80,27 @@ class I18nTestCase(BaseI18nTestCase):
|
||||
self.release_languages('fr')
|
||||
response = self.client.get('/')
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "html", "lang", "en")
|
||||
self.assertEqual(response['Content-Language'], 'en')
|
||||
assert response['Content-Language'] == 'en'
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "body", "class", "lang_en")
|
||||
|
||||
def test_esperanto(self):
|
||||
self.release_languages('fr, eo')
|
||||
response = self.client.get('/', HTTP_ACCEPT_LANGUAGE='eo')
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "html", "lang", "eo")
|
||||
self.assertEqual(response['Content-Language'], 'eo')
|
||||
assert response['Content-Language'] == 'eo'
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "body", "class", "lang_eo")
|
||||
|
||||
def test_switching_languages_bidi(self):
|
||||
self.release_languages('ar, eo')
|
||||
response = self.client.get('/')
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "html", "lang", "en")
|
||||
self.assertEqual(response['Content-Language'], 'en')
|
||||
assert response['Content-Language'] == 'en'
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "body", "class", "lang_en")
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "body", "class", "ltr")
|
||||
|
||||
response = self.client.get('/', HTTP_ACCEPT_LANGUAGE='ar')
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "html", "lang", "ar")
|
||||
self.assertEqual(response['Content-Language'], 'ar')
|
||||
assert response['Content-Language'] == 'ar'
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "body", "class", "lang_ar")
|
||||
self.assert_tag_has_attr(response.content.decode('utf-8'), "body", "class", "rtl")
|
||||
|
||||
@@ -178,7 +178,7 @@ class I18nLangPrefTests(BaseI18nTestCase):
|
||||
json.dumps({LANGUAGE_KEY: language}),
|
||||
content_type="application/merge-patch+json"
|
||||
)
|
||||
self.assertEqual(response.status_code, 204)
|
||||
assert response.status_code == 204
|
||||
|
||||
def test_lang_preference(self):
|
||||
# Regression test; LOC-87
|
||||
|
||||
@@ -118,12 +118,12 @@ class TestLTI(BaseTestXmodule):
|
||||
def test_lti_constructor(self):
|
||||
generated_content = self.item_descriptor.render(STUDENT_VIEW).content
|
||||
expected_content = self.runtime.render_template('lti.html', self.expected_context)
|
||||
self.assertEqual(generated_content, expected_content)
|
||||
assert generated_content == expected_content
|
||||
|
||||
def test_lti_preview_handler(self):
|
||||
generated_content = self.item_descriptor.preview_handler(None, None).body
|
||||
expected_content = self.runtime.render_template('lti_form.html', self.expected_context)
|
||||
self.assertEqual(generated_content.decode('utf-8'), expected_content)
|
||||
assert generated_content.decode('utf-8') == expected_content
|
||||
|
||||
|
||||
class TestLTIBlockListing(SharedModuleStoreTestCase):
|
||||
@@ -187,7 +187,7 @@ class TestLTIBlockListing(SharedModuleStoreTestCase):
|
||||
for bad_course_id in bad_ids:
|
||||
lti_rest_endpoints_url = 'courses/{}/lti_rest_endpoints/'.format(bad_course_id)
|
||||
response = self.client.get(lti_rest_endpoints_url)
|
||||
self.assertEqual(404, response.status_code)
|
||||
assert 404 == response.status_code
|
||||
|
||||
def test_lti_rest_listing(self):
|
||||
"""tests that the draft lti module is part of the endpoint response"""
|
||||
@@ -195,8 +195,8 @@ class TestLTIBlockListing(SharedModuleStoreTestCase):
|
||||
request.method = 'GET'
|
||||
response = get_course_lti_endpoints(request, course_id=text_type(self.course.id))
|
||||
|
||||
self.assertEqual(200, response.status_code)
|
||||
self.assertEqual('application/json', response['Content-Type'])
|
||||
assert 200 == response.status_code
|
||||
assert 'application/json' == response['Content-Type']
|
||||
|
||||
expected = {
|
||||
"lti_1_1_result_service_xml_endpoint": self.expected_handler_url('grade_handler'),
|
||||
@@ -204,7 +204,7 @@ class TestLTIBlockListing(SharedModuleStoreTestCase):
|
||||
self.expected_handler_url('lti_2_0_result_rest_handler') + "/user/{anon_user_id}",
|
||||
"display_name": self.lti_published.display_name,
|
||||
}
|
||||
self.assertEqual([expected], json.loads(response.content.decode('utf-8')))
|
||||
assert [expected] == json.loads(response.content.decode('utf-8'))
|
||||
|
||||
def test_lti_rest_non_get(self):
|
||||
"""tests that the endpoint returns 404 when hit with NON-get"""
|
||||
@@ -213,4 +213,4 @@ class TestLTIBlockListing(SharedModuleStoreTestCase):
|
||||
request = mock.Mock()
|
||||
request.method = method
|
||||
response = get_course_lti_endpoints(request, text_type(self.course.id))
|
||||
self.assertEqual(405, response.status_code)
|
||||
assert 405 == response.status_code
|
||||
|
||||
@@ -7,7 +7,7 @@ Unit tests for masquerade.
|
||||
import json
|
||||
import pickle
|
||||
from datetime import datetime
|
||||
|
||||
import pytest
|
||||
import ddt
|
||||
import six
|
||||
from django.conf import settings
|
||||
@@ -132,8 +132,8 @@ class MasqueradeTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase, Mas
|
||||
Verifies that the staff debug control visibility is as expected (for staff only).
|
||||
"""
|
||||
content = self.get_courseware_page().content.decode('utf-8')
|
||||
self.assertIn(self.sequential_display_name, content, "Subsection should be visible")
|
||||
self.assertEqual(staff_debug_expected, 'Staff Debug Info' in content)
|
||||
assert self.sequential_display_name in content, 'Subsection should be visible'
|
||||
assert staff_debug_expected == ('Staff Debug Info' in content)
|
||||
|
||||
def get_problem(self):
|
||||
"""
|
||||
@@ -155,8 +155,8 @@ class MasqueradeTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase, Mas
|
||||
Verifies that "Show answer" is only present when expected (for staff only).
|
||||
"""
|
||||
problem_html = json.loads(self.get_problem().content.decode('utf-8'))['html']
|
||||
self.assertIn(self.problem_display_name, problem_html)
|
||||
self.assertEqual(show_answer_expected, "Show answer" in problem_html)
|
||||
assert self.problem_display_name in problem_html
|
||||
assert show_answer_expected == ('Show answer' in problem_html)
|
||||
|
||||
def ensure_masquerade_as_group_member(self, partition_id, group_id):
|
||||
"""
|
||||
@@ -169,7 +169,7 @@ class MasqueradeTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase, Mas
|
||||
configured in the course.
|
||||
group_id (int); the integer group id, within the specified partition.
|
||||
"""
|
||||
self.assertEqual(200, masquerade_as_group_member(self.test_user, self.course, partition_id, group_id))
|
||||
assert 200 == masquerade_as_group_member(self.test_user, self.course, partition_id, group_id)
|
||||
|
||||
|
||||
class NormalStudentVisibilityTest(MasqueradeTestCase):
|
||||
@@ -294,12 +294,8 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi
|
||||
user: User model instance
|
||||
expected_language_code: string indicating a language code
|
||||
"""
|
||||
self.assertEqual(
|
||||
get_user_preference(user, LANGUAGE_KEY), expected_language_code
|
||||
)
|
||||
self.assertEqual(
|
||||
self.client.cookies[settings.LANGUAGE_COOKIE].value, expected_language_code
|
||||
)
|
||||
assert get_user_preference(user, LANGUAGE_KEY) == expected_language_code
|
||||
assert self.client.cookies[settings.LANGUAGE_COOKIE].value == expected_language_code
|
||||
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False})
|
||||
@@ -340,32 +336,32 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi
|
||||
self.login(student.email, 'test')
|
||||
# Answer correctly as the student, and check progress.
|
||||
self.submit_answer('Correct', 'Correct')
|
||||
self.assertEqual(self.get_progress_detail(), u'2/2')
|
||||
assert self.get_progress_detail() == u'2/2'
|
||||
|
||||
# Log in as staff, and check the problem is unanswered.
|
||||
self.login_staff()
|
||||
self.assertEqual(self.get_progress_detail(), u'0/2')
|
||||
assert self.get_progress_detail() == u'0/2'
|
||||
|
||||
# Masquerade as the student, and check we can see the student state.
|
||||
self.update_masquerade(role='student', username=student.username)
|
||||
self.assertEqual(self.get_progress_detail(), u'2/2')
|
||||
assert self.get_progress_detail() == u'2/2'
|
||||
|
||||
# Temporarily override the student state.
|
||||
self.submit_answer('Correct', 'Incorrect')
|
||||
self.assertEqual(self.get_progress_detail(), u'1/2')
|
||||
assert self.get_progress_detail() == u'1/2'
|
||||
|
||||
# Reload the page and check we see the student state again.
|
||||
self.get_courseware_page()
|
||||
self.assertEqual(self.get_progress_detail(), u'2/2')
|
||||
assert self.get_progress_detail() == u'2/2'
|
||||
|
||||
# Become the staff user again, and check the problem is still unanswered.
|
||||
self.update_masquerade(role='staff')
|
||||
self.assertEqual(self.get_progress_detail(), u'0/2')
|
||||
assert self.get_progress_detail() == u'0/2'
|
||||
|
||||
# Verify the student state did not change.
|
||||
self.logout()
|
||||
self.login(student.email, 'test')
|
||||
self.assertEqual(self.get_progress_detail(), u'2/2')
|
||||
assert self.get_progress_detail() == u'2/2'
|
||||
|
||||
def test_masquerading_with_language_preference(self):
|
||||
"""
|
||||
@@ -404,12 +400,12 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi
|
||||
# Log in as staff, and check we can see the info page.
|
||||
self.login_staff()
|
||||
content = self.get_course_info_page().content.decode('utf-8')
|
||||
self.assertIn("OOGIE BLOOGIE", content)
|
||||
assert 'OOGIE BLOOGIE' in content
|
||||
|
||||
# Masquerade as the student, and check we can see the info page.
|
||||
self.update_masquerade(role='student', username=self.student_user.username)
|
||||
content = self.get_course_info_page().content.decode('utf-8')
|
||||
self.assertIn("OOGIE BLOOGIE", content)
|
||||
assert 'OOGIE BLOOGIE' in content
|
||||
|
||||
def test_masquerade_as_specific_student_progress(self):
|
||||
"""
|
||||
@@ -419,21 +415,21 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi
|
||||
self.login_student()
|
||||
self.submit_answer('Correct', 'Correct')
|
||||
student_progress = self.get_progress_page().content.decode('utf-8')
|
||||
self.assertNotIn("1 of 2 possible points", student_progress)
|
||||
self.assertIn("2 of 2 possible points", student_progress)
|
||||
assert '1 of 2 possible points' not in student_progress
|
||||
assert '2 of 2 possible points' in student_progress
|
||||
|
||||
# Staff answers are slightly different
|
||||
self.login_staff()
|
||||
self.submit_answer('Incorrect', 'Correct')
|
||||
staff_progress = self.get_progress_page().content.decode('utf-8')
|
||||
self.assertNotIn("2 of 2 possible points", staff_progress)
|
||||
self.assertIn("1 of 2 possible points", staff_progress)
|
||||
assert '2 of 2 possible points' not in staff_progress
|
||||
assert '1 of 2 possible points' in staff_progress
|
||||
|
||||
# Should now see the student's scores
|
||||
self.update_masquerade(role='student', username=self.student_user.username)
|
||||
masquerade_progress = self.get_progress_page().content.decode('utf-8')
|
||||
self.assertNotIn("1 of 2 possible points", masquerade_progress)
|
||||
self.assertIn("2 of 2 possible points", masquerade_progress)
|
||||
assert '1 of 2 possible points' not in masquerade_progress
|
||||
assert '2 of 2 possible points' in masquerade_progress
|
||||
|
||||
|
||||
class TestGetMasqueradingGroupId(StaffMasqueradeTestCase):
|
||||
@@ -457,14 +453,14 @@ class TestGetMasqueradingGroupId(StaffMasqueradeTestCase):
|
||||
"""
|
||||
# Verify there is no masquerading group initially
|
||||
group = get_masquerading_user_group(self.course.id, self.test_user, self.user_partition)
|
||||
self.assertIsNone(group)
|
||||
assert group is None
|
||||
|
||||
# Install a masquerading group
|
||||
self.ensure_masquerade_as_group_member(0, 1)
|
||||
|
||||
# Verify that the masquerading group is returned
|
||||
group = get_masquerading_user_group(self.course.id, self.test_user, self.user_partition)
|
||||
self.assertEqual(group.id, 1)
|
||||
assert group.id == 1
|
||||
|
||||
|
||||
class ReadOnlyKeyValueStore(DictKeyValueStore):
|
||||
@@ -499,32 +495,32 @@ class MasqueradingKeyValueStoreTest(TestCase):
|
||||
self.kvs = MasqueradingKeyValueStore(self.ro_kvs, self.session)
|
||||
|
||||
def test_all(self):
|
||||
self.assertEqual(self.kvs.get('a'), 42)
|
||||
self.assertEqual(self.kvs.get('b'), None)
|
||||
self.assertEqual(self.kvs.get('c'), 'OpenCraft')
|
||||
with self.assertRaises(KeyError):
|
||||
assert self.kvs.get('a') == 42
|
||||
assert self.kvs.get('b') is None
|
||||
assert self.kvs.get('c') == 'OpenCraft'
|
||||
with pytest.raises(KeyError):
|
||||
self.kvs.get('d')
|
||||
|
||||
self.assertTrue(self.kvs.has('a'))
|
||||
self.assertTrue(self.kvs.has('b'))
|
||||
self.assertTrue(self.kvs.has('c'))
|
||||
self.assertFalse(self.kvs.has('d'))
|
||||
assert self.kvs.has('a')
|
||||
assert self.kvs.has('b')
|
||||
assert self.kvs.has('c')
|
||||
assert not self.kvs.has('d')
|
||||
|
||||
self.kvs.set_many({'a': 'Norwegian Blue', 'd': 'Giraffe'})
|
||||
self.kvs.set('b', 7)
|
||||
|
||||
self.assertEqual(self.kvs.get('a'), 'Norwegian Blue')
|
||||
self.assertEqual(self.kvs.get('b'), 7)
|
||||
self.assertEqual(self.kvs.get('c'), 'OpenCraft')
|
||||
self.assertEqual(self.kvs.get('d'), 'Giraffe')
|
||||
assert self.kvs.get('a') == 'Norwegian Blue'
|
||||
assert self.kvs.get('b') == 7
|
||||
assert self.kvs.get('c') == 'OpenCraft'
|
||||
assert self.kvs.get('d') == 'Giraffe'
|
||||
|
||||
for key in 'abd':
|
||||
self.assertTrue(self.kvs.has(key))
|
||||
assert self.kvs.has(key)
|
||||
self.kvs.delete(key)
|
||||
with self.assertRaises(KeyError):
|
||||
with pytest.raises(KeyError):
|
||||
self.kvs.get(key)
|
||||
|
||||
self.assertEqual(self.kvs.get('c'), 'OpenCraft')
|
||||
assert self.kvs.get('c') == 'OpenCraft'
|
||||
|
||||
|
||||
class CourseMasqueradeTest(TestCase):
|
||||
@@ -540,4 +536,4 @@ class CourseMasqueradeTest(TestCase):
|
||||
del cmasq.user_name
|
||||
pickled_cmasq = pickle.dumps(cmasq)
|
||||
unpickled_cmasq = pickle.loads(pickled_cmasq)
|
||||
self.assertEqual(unpickled_cmasq.user_name, None)
|
||||
assert unpickled_cmasq.user_name is None
|
||||
|
||||
@@ -26,7 +26,7 @@ class CoursewareMiddlewareTestCase(SharedModuleStoreTestCase):
|
||||
response = RedirectMiddleware().process_exception(
|
||||
request, Http404()
|
||||
)
|
||||
self.assertIsNone(response)
|
||||
assert response is None
|
||||
|
||||
def test_redirect_exceptions(self):
|
||||
"""
|
||||
@@ -38,6 +38,6 @@ class CoursewareMiddlewareTestCase(SharedModuleStoreTestCase):
|
||||
response = RedirectMiddleware().process_exception(
|
||||
request, exception
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
assert response.status_code == 302
|
||||
target_url = response._headers['location'][1] # lint-amnesty, pylint: disable=protected-access
|
||||
self.assertTrue(target_url.endswith(test_url))
|
||||
assert target_url.endswith(test_url)
|
||||
|
||||
@@ -5,7 +5,7 @@ Test for lms courseware app, module data (runtime data storage for XBlocks)
|
||||
|
||||
import json
|
||||
from functools import partial
|
||||
|
||||
import pytest
|
||||
from django.db import connections, DatabaseError
|
||||
from django.test import TestCase
|
||||
from mock import Mock, patch
|
||||
@@ -89,14 +89,14 @@ class OtherUserFailureTestMixin(object):
|
||||
"""
|
||||
Test for assert failure when a user who didn't create the kvs tries to get from it it
|
||||
"""
|
||||
with self.assertRaises(AssertionError):
|
||||
with pytest.raises(AssertionError):
|
||||
self.kvs.get(self.other_key_factory(self.existing_field_name))
|
||||
|
||||
def test_other_user_kvs_set_failure(self):
|
||||
"""
|
||||
Test for assert failure when a user who didn't create the kvs tries to get from it it
|
||||
"""
|
||||
with self.assertRaises(AssertionError):
|
||||
with pytest.raises(AssertionError):
|
||||
self.kvs.set(self.other_key_factory(self.existing_field_name), "new_value")
|
||||
|
||||
|
||||
@@ -111,7 +111,8 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase):
|
||||
super(TestStudentModuleStorage, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
|
||||
student_module = StudentModuleFactory(state=json.dumps({'a_field': 'a_value', 'b_field': 'b_value'}))
|
||||
self.user = student_module.student
|
||||
self.assertEqual(self.user.id, 1) # check our assumption hard-coded in the key functions above.
|
||||
assert self.user.id == 1
|
||||
# check our assumption hard-coded in the key functions above.
|
||||
|
||||
# There should be only one query to load a single descriptor with a single user_state field
|
||||
with self.assertNumQueries(1):
|
||||
@@ -125,7 +126,7 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase):
|
||||
"Test that getting an existing field in an existing StudentModule works"
|
||||
# This should only read from the cache, not the database
|
||||
with self.assertNumQueries(0):
|
||||
self.assertEqual('a_value', self.kvs.get(user_state_key('a_field')))
|
||||
assert 'a_value' == self.kvs.get(user_state_key('a_field'))
|
||||
|
||||
def test_get_missing_field(self):
|
||||
"Test that getting a missing field from an existing StudentModule raises a KeyError"
|
||||
@@ -143,8 +144,9 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase):
|
||||
with self.assertNumQueries(4, using='default'):
|
||||
with self.assertNumQueries(1, using='student_module_history'):
|
||||
self.kvs.set(user_state_key('a_field'), 'new_value')
|
||||
self.assertEqual(1, StudentModule.objects.all().count())
|
||||
self.assertEqual({'b_field': 'b_value', 'a_field': 'new_value'}, json.loads(StudentModule.objects.all()[0].state)) # lint-amnesty, pylint: disable=line-too-long
|
||||
assert 1 == StudentModule.objects.all().count()
|
||||
assert {'b_field': 'b_value', 'a_field': 'new_value'} == json.loads(StudentModule.objects.all()[0].state)
|
||||
# lint-amnesty, pylint: disable=line-too-long
|
||||
|
||||
def test_set_missing_field(self):
|
||||
"Test that setting a new user_state field changes the value"
|
||||
@@ -156,8 +158,9 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase):
|
||||
with self.assertNumQueries(4, using='default'):
|
||||
with self.assertNumQueries(1, using='student_module_history'):
|
||||
self.kvs.set(user_state_key('not_a_field'), 'new_value')
|
||||
self.assertEqual(1, StudentModule.objects.all().count())
|
||||
self.assertEqual({'b_field': 'b_value', 'a_field': 'a_value', 'not_a_field': 'new_value'}, json.loads(StudentModule.objects.all()[0].state)) # lint-amnesty, pylint: disable=line-too-long
|
||||
assert 1 == StudentModule.objects.all().count()
|
||||
assert {'b_field': 'b_value', 'a_field': 'a_value', 'not_a_field': 'new_value'} == json.loads(StudentModule.objects.all()[0].state)
|
||||
# lint-amnesty, pylint: disable=line-too-long
|
||||
|
||||
def test_delete_existing_field(self):
|
||||
"Test that deleting an existing field removes it from the StudentModule"
|
||||
@@ -169,25 +172,25 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase):
|
||||
with self.assertNumQueries(2, using='default'):
|
||||
with self.assertNumQueries(1, using='student_module_history'):
|
||||
self.kvs.delete(user_state_key('a_field'))
|
||||
self.assertEqual(1, StudentModule.objects.all().count())
|
||||
assert 1 == StudentModule.objects.all().count()
|
||||
self.assertRaises(KeyError, self.kvs.get, user_state_key('not_a_field'))
|
||||
|
||||
def test_delete_missing_field(self):
|
||||
"Test that deleting a missing field from an existing StudentModule raises a KeyError"
|
||||
with self.assertNumQueries(0):
|
||||
self.assertRaises(KeyError, self.kvs.delete, user_state_key('not_a_field'))
|
||||
self.assertEqual(1, StudentModule.objects.all().count())
|
||||
self.assertEqual({'b_field': 'b_value', 'a_field': 'a_value'}, json.loads(StudentModule.objects.all()[0].state))
|
||||
assert 1 == StudentModule.objects.all().count()
|
||||
assert {'b_field': 'b_value', 'a_field': 'a_value'} == json.loads(StudentModule.objects.all()[0].state)
|
||||
|
||||
def test_has_existing_field(self):
|
||||
"Test that `has` returns True for existing fields in StudentModules"
|
||||
with self.assertNumQueries(0):
|
||||
self.assertTrue(self.kvs.has(user_state_key('a_field')))
|
||||
assert self.kvs.has(user_state_key('a_field'))
|
||||
|
||||
def test_has_missing_field(self):
|
||||
"Test that `has` returns False for missing fields in StudentModule"
|
||||
with self.assertNumQueries(0):
|
||||
self.assertFalse(self.kvs.has(user_state_key('not_a_field')))
|
||||
assert not self.kvs.has(user_state_key('not_a_field'))
|
||||
|
||||
def construct_kv_dict(self):
|
||||
"""Construct a kv_dict that can be passed to set_many"""
|
||||
@@ -212,7 +215,7 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase):
|
||||
self.kvs.set_many(kv_dict)
|
||||
|
||||
for key in kv_dict:
|
||||
self.assertEqual(self.kvs.get(key), kv_dict[key])
|
||||
assert self.kvs.get(key) == kv_dict[key]
|
||||
|
||||
def test_set_many_failure(self):
|
||||
"Test failures when setting many fields that are scoped to Scope.user_state"
|
||||
@@ -223,9 +226,9 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase):
|
||||
self.kvs.set(key, 'test_value')
|
||||
|
||||
with patch('django.db.models.Model.save', side_effect=DatabaseError):
|
||||
with self.assertRaises(KeyValueMultiSaveError) as exception_context:
|
||||
with pytest.raises(KeyValueMultiSaveError) as exception_context:
|
||||
self.kvs.set_many(kv_dict)
|
||||
self.assertEqual(exception_context.exception.saved_field_names, [])
|
||||
assert exception_context.value.saved_field_names == []
|
||||
|
||||
|
||||
class TestMissingStudentModule(TestCase): # lint-amnesty, pylint: disable=missing-class-docstring
|
||||
@@ -236,7 +239,8 @@ class TestMissingStudentModule(TestCase): # lint-amnesty, pylint: disable=missi
|
||||
super(TestMissingStudentModule, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
|
||||
|
||||
self.user = UserFactory.create(username='user')
|
||||
self.assertEqual(self.user.id, 1) # check our assumption hard-coded in the key functions above.
|
||||
assert self.user.id == 1
|
||||
# check our assumption hard-coded in the key functions above.
|
||||
|
||||
# The descriptor has no fields, so FDC shouldn't send any queries
|
||||
with self.assertNumQueries(0):
|
||||
@@ -250,8 +254,8 @@ class TestMissingStudentModule(TestCase): # lint-amnesty, pylint: disable=missi
|
||||
|
||||
def test_set_field_in_missing_student_module(self):
|
||||
"Test that setting a field in a missing StudentModule creates the student module"
|
||||
self.assertEqual(0, len(self.field_data_cache))
|
||||
self.assertEqual(0, StudentModule.objects.all().count())
|
||||
assert 0 == len(self.field_data_cache)
|
||||
assert 0 == StudentModule.objects.all().count()
|
||||
|
||||
# We are updating a problem, so we write to courseware_studentmodulehistoryextended
|
||||
# as well as courseware_studentmodule. We also need to read the database
|
||||
@@ -263,14 +267,14 @@ class TestMissingStudentModule(TestCase): # lint-amnesty, pylint: disable=missi
|
||||
with self.assertNumQueries(1, using='student_module_history'):
|
||||
self.kvs.set(user_state_key('a_field'), 'a_value')
|
||||
|
||||
self.assertEqual(1, sum(len(cache) for cache in self.field_data_cache.cache.values()))
|
||||
self.assertEqual(1, StudentModule.objects.all().count())
|
||||
assert 1 == sum((len(cache) for cache in self.field_data_cache.cache.values()))
|
||||
assert 1 == StudentModule.objects.all().count()
|
||||
|
||||
student_module = StudentModule.objects.all()[0]
|
||||
self.assertEqual({'a_field': 'a_value'}, json.loads(student_module.state))
|
||||
self.assertEqual(self.user, student_module.student)
|
||||
self.assertEqual(location('usage_id').replace(run=None), student_module.module_state_key)
|
||||
self.assertEqual(course_id, student_module.course_id)
|
||||
assert {'a_field': 'a_value'} == json.loads(student_module.state)
|
||||
assert self.user == student_module.student
|
||||
assert location('usage_id').replace(run=None) == student_module.module_state_key
|
||||
assert course_id == student_module.course_id
|
||||
|
||||
def test_delete_field_from_missing_student_module(self):
|
||||
"Test that deleting a field from a missing StudentModule raises a KeyError"
|
||||
@@ -280,7 +284,7 @@ class TestMissingStudentModule(TestCase): # lint-amnesty, pylint: disable=missi
|
||||
def test_has_field_for_missing_student_module(self):
|
||||
"Test that `has` returns False for missing StudentModules"
|
||||
with self.assertNumQueries(0):
|
||||
self.assertFalse(self.kvs.has(user_state_key('a_field')))
|
||||
assert not self.kvs.has(user_state_key('a_field'))
|
||||
|
||||
|
||||
class StorageTestBase(object):
|
||||
@@ -315,12 +319,12 @@ class StorageTestBase(object):
|
||||
with self.assertNumQueries(1):
|
||||
self.kvs.set(self.key_factory('existing_field'), 'test_value')
|
||||
with self.assertNumQueries(0):
|
||||
self.assertEqual('test_value', self.kvs.get(self.key_factory('existing_field')))
|
||||
assert 'test_value' == self.kvs.get(self.key_factory('existing_field'))
|
||||
|
||||
def test_get_existing_field(self):
|
||||
"Test that getting an existing field in an existing Storage Field works"
|
||||
with self.assertNumQueries(0):
|
||||
self.assertEqual('old_value', self.kvs.get(self.key_factory('existing_field')))
|
||||
assert 'old_value' == self.kvs.get(self.key_factory('existing_field'))
|
||||
|
||||
def test_get_missing_field(self):
|
||||
"Test that getting a missing field from an existing Storage Field raises a KeyError"
|
||||
@@ -331,38 +335,38 @@ class StorageTestBase(object):
|
||||
"Test that setting an existing field changes the value"
|
||||
with self.assertNumQueries(1):
|
||||
self.kvs.set(self.key_factory('existing_field'), 'new_value')
|
||||
self.assertEqual(1, self.storage_class.objects.all().count())
|
||||
self.assertEqual('new_value', json.loads(self.storage_class.objects.all()[0].value))
|
||||
assert 1 == self.storage_class.objects.all().count()
|
||||
assert 'new_value' == json.loads(self.storage_class.objects.all()[0].value)
|
||||
|
||||
def test_set_missing_field(self):
|
||||
"Test that setting a new field changes the value"
|
||||
with self.assertNumQueries(1):
|
||||
self.kvs.set(self.key_factory('missing_field'), 'new_value')
|
||||
self.assertEqual(2, self.storage_class.objects.all().count())
|
||||
self.assertEqual('old_value', json.loads(self.storage_class.objects.get(field_name='existing_field').value))
|
||||
self.assertEqual('new_value', json.loads(self.storage_class.objects.get(field_name='missing_field').value))
|
||||
assert 2 == self.storage_class.objects.all().count()
|
||||
assert 'old_value' == json.loads(self.storage_class.objects.get(field_name='existing_field').value)
|
||||
assert 'new_value' == json.loads(self.storage_class.objects.get(field_name='missing_field').value)
|
||||
|
||||
def test_delete_existing_field(self):
|
||||
"Test that deleting an existing field removes it"
|
||||
with self.assertNumQueries(1):
|
||||
self.kvs.delete(self.key_factory('existing_field'))
|
||||
self.assertEqual(0, self.storage_class.objects.all().count())
|
||||
assert 0 == self.storage_class.objects.all().count()
|
||||
|
||||
def test_delete_missing_field(self):
|
||||
"Test that deleting a missing field from an existing Storage Field raises a KeyError"
|
||||
with self.assertNumQueries(0):
|
||||
self.assertRaises(KeyError, self.kvs.delete, self.key_factory('missing_field'))
|
||||
self.assertEqual(1, self.storage_class.objects.all().count())
|
||||
assert 1 == self.storage_class.objects.all().count()
|
||||
|
||||
def test_has_existing_field(self):
|
||||
"Test that `has` returns True for an existing Storage Field"
|
||||
with self.assertNumQueries(0):
|
||||
self.assertTrue(self.kvs.has(self.key_factory('existing_field')))
|
||||
assert self.kvs.has(self.key_factory('existing_field'))
|
||||
|
||||
def test_has_missing_field(self):
|
||||
"Test that `has` return False for an existing Storage Field"
|
||||
with self.assertNumQueries(0):
|
||||
self.assertFalse(self.kvs.has(self.key_factory('missing_field')))
|
||||
assert not self.kvs.has(self.key_factory('missing_field'))
|
||||
|
||||
def construct_kv_dict(self):
|
||||
"""Construct a kv_dict that can be passed to set_many"""
|
||||
@@ -381,7 +385,7 @@ class StorageTestBase(object):
|
||||
with self.assertNumQueries(len(kv_dict)):
|
||||
self.kvs.set_many(kv_dict)
|
||||
for key in kv_dict:
|
||||
self.assertEqual(self.kvs.get(key), kv_dict[key])
|
||||
assert self.kvs.get(key) == kv_dict[key]
|
||||
|
||||
def test_set_many_failure(self):
|
||||
"""Test that setting many regular fields with a DB error """
|
||||
@@ -391,11 +395,11 @@ class StorageTestBase(object):
|
||||
self.kvs.set(key, 'test value')
|
||||
|
||||
with patch('django.db.models.Model.save', side_effect=[None, DatabaseError]):
|
||||
with self.assertRaises(KeyValueMultiSaveError) as exception_context:
|
||||
with pytest.raises(KeyValueMultiSaveError) as exception_context:
|
||||
self.kvs.set_many(kv_dict)
|
||||
|
||||
exception = exception_context.exception
|
||||
self.assertEqual(exception.saved_field_names, ['existing_field', 'other_existing_field'])
|
||||
exception = exception_context.value
|
||||
assert exception.saved_field_names == ['existing_field', 'other_existing_field']
|
||||
|
||||
|
||||
class TestUserStateSummaryStorage(StorageTestBase, TestCase):
|
||||
|
||||
@@ -9,7 +9,7 @@ import json
|
||||
import textwrap
|
||||
from datetime import datetime
|
||||
from functools import partial
|
||||
|
||||
import pytest
|
||||
import ddt
|
||||
import pytz
|
||||
import six
|
||||
@@ -229,10 +229,7 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
super(ModuleRenderTestCase, self).tearDown() # lint-amnesty, pylint: disable=super-with-arguments
|
||||
|
||||
def test_get_module(self):
|
||||
self.assertEqual(
|
||||
None,
|
||||
render.get_module('dummyuser', None, 'invalid location', None)
|
||||
)
|
||||
assert render.get_module('dummyuser', None, 'invalid location', None) is None
|
||||
|
||||
def test_module_render_with_jump_to_id(self):
|
||||
"""
|
||||
@@ -260,7 +257,7 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
|
||||
# See if the url got rewritten to the target link
|
||||
# note if the URL mapping changes then this assertion will break
|
||||
self.assertIn('/courses/' + text_type(self.course_key) + '/jump_to_id/vertical_test', html)
|
||||
assert '/courses/' + text_type(self.course_key) + '/jump_to_id/vertical_test' in html
|
||||
|
||||
def test_xqueue_callback_success(self):
|
||||
"""
|
||||
@@ -298,7 +295,7 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
|
||||
with patch('lms.djangoapps.courseware.module_render.load_single_xblock', return_value=self.mock_module):
|
||||
# Test with missing xqueue data
|
||||
with self.assertRaises(Http404):
|
||||
with pytest.raises(Http404):
|
||||
request = self.request_factory.post(self.callback_url, {})
|
||||
render.xqueue_callback(
|
||||
request,
|
||||
@@ -309,7 +306,7 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
)
|
||||
|
||||
# Test with missing xqueue_header
|
||||
with self.assertRaises(Http404):
|
||||
with pytest.raises(Http404):
|
||||
request = self.request_factory.post(self.callback_url, data)
|
||||
render.xqueue_callback(
|
||||
request,
|
||||
@@ -335,7 +332,7 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
"""Test that anonymous GET is allowed."""
|
||||
dispatch_url = self._get_dispatch_url()
|
||||
response = self.client.get(dispatch_url)
|
||||
self.assertEqual(200, response.status_code)
|
||||
assert 200 == response.status_code
|
||||
|
||||
def test_anonymous_post_xblock_callback(self):
|
||||
"""Test that anonymous POST is not allowed."""
|
||||
@@ -343,15 +340,15 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
response = self.client.post(dispatch_url, {'position': 2})
|
||||
|
||||
# https://openedx.atlassian.net/browse/LEARNER-7131
|
||||
self.assertEqual('Unauthenticated', response.content.decode('utf-8'))
|
||||
self.assertEqual(403, response.status_code)
|
||||
assert 'Unauthenticated' == response.content.decode('utf-8')
|
||||
assert 403 == response.status_code
|
||||
|
||||
def test_session_authentication(self):
|
||||
""" Test that the xblock endpoint supports session authentication."""
|
||||
self.client.login(username=self.mock_user.username, password="test")
|
||||
dispatch_url = self._get_dispatch_url()
|
||||
response = self.client.post(dispatch_url)
|
||||
self.assertEqual(200, response.status_code)
|
||||
assert 200 == response.status_code
|
||||
|
||||
def test_oauth_authentication(self):
|
||||
""" Test that the xblock endpoint supports OAuth authentication."""
|
||||
@@ -359,7 +356,7 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
access_token = AccessTokenFactory(user=self.mock_user, application=ApplicationFactory()).token
|
||||
headers = {'HTTP_AUTHORIZATION': 'Bearer ' + access_token}
|
||||
response = self.client.post(dispatch_url, {}, **headers)
|
||||
self.assertEqual(200, response.status_code)
|
||||
assert 200 == response.status_code
|
||||
|
||||
def test_jwt_authentication(self):
|
||||
""" Test that the xblock endpoint supports JWT authentication."""
|
||||
@@ -367,7 +364,7 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
token = create_jwt_for_user(self.mock_user)
|
||||
headers = {'HTTP_AUTHORIZATION': 'JWT ' + token}
|
||||
response = self.client.post(dispatch_url, {}, **headers)
|
||||
self.assertEqual(200, response.status_code)
|
||||
assert 200 == response.status_code
|
||||
|
||||
def test_missing_position_handler(self):
|
||||
"""
|
||||
@@ -376,28 +373,28 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
self.client.login(username=self.mock_user.username, password="test")
|
||||
dispatch_url = self._get_dispatch_url()
|
||||
response = self.client.post(dispatch_url)
|
||||
self.assertEqual(200, response.status_code)
|
||||
self.assertEqual(json.loads(response.content.decode('utf-8')), {'success': True})
|
||||
assert 200 == response.status_code
|
||||
assert json.loads(response.content.decode('utf-8')) == {'success': True}
|
||||
|
||||
response = self.client.post(dispatch_url, {'position': ''})
|
||||
self.assertEqual(200, response.status_code)
|
||||
self.assertEqual(json.loads(response.content.decode('utf-8')), {'success': True})
|
||||
assert 200 == response.status_code
|
||||
assert json.loads(response.content.decode('utf-8')) == {'success': True}
|
||||
|
||||
response = self.client.post(dispatch_url, {'position': '-1'})
|
||||
self.assertEqual(200, response.status_code)
|
||||
self.assertEqual(json.loads(response.content.decode('utf-8')), {'success': True})
|
||||
assert 200 == response.status_code
|
||||
assert json.loads(response.content.decode('utf-8')) == {'success': True}
|
||||
|
||||
response = self.client.post(dispatch_url, {'position': "string"})
|
||||
self.assertEqual(200, response.status_code)
|
||||
self.assertEqual(json.loads(response.content.decode('utf-8')), {'success': True})
|
||||
assert 200 == response.status_code
|
||||
assert json.loads(response.content.decode('utf-8')) == {'success': True}
|
||||
|
||||
response = self.client.post(dispatch_url, {'position': u"Φυσικά"})
|
||||
self.assertEqual(200, response.status_code)
|
||||
self.assertEqual(json.loads(response.content.decode('utf-8')), {'success': True})
|
||||
assert 200 == response.status_code
|
||||
assert json.loads(response.content.decode('utf-8')) == {'success': True}
|
||||
|
||||
response = self.client.post(dispatch_url, {'position': ''})
|
||||
self.assertEqual(200, response.status_code)
|
||||
self.assertEqual(json.loads(response.content.decode('utf-8')), {'success': True})
|
||||
assert 200 == response.status_code
|
||||
assert json.loads(response.content.decode('utf-8')) == {'success': True}
|
||||
|
||||
@ddt.data('pure', 'vertical')
|
||||
@XBlock.register_temp_plugin(PureXBlock, identifier='pure')
|
||||
@@ -479,8 +476,8 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
# check that _unwrapped_field_data is the same as the original
|
||||
# _field_data, but now _field_data as been reset.
|
||||
# pylint: disable=protected-access
|
||||
self.assertIs(descriptor._unwrapped_field_data, original_field_data) # lint-amnesty, pylint: disable=no-member
|
||||
self.assertIsNot(descriptor._unwrapped_field_data, descriptor._field_data) # lint-amnesty, pylint: disable=no-member
|
||||
assert descriptor._unwrapped_field_data is original_field_data # lint-amnesty, pylint: disable=no-member
|
||||
assert descriptor._unwrapped_field_data is not descriptor._field_data # lint-amnesty, pylint: disable=no-member
|
||||
|
||||
# now bind this module to a few other students
|
||||
for user in [UserFactory(), UserFactory(), self.mock_user]:
|
||||
@@ -495,25 +492,14 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
|
||||
# _field_data should now be wrapped by LmsFieldData
|
||||
# pylint: disable=protected-access
|
||||
self.assertIsInstance(descriptor._field_data, LmsFieldData) # lint-amnesty, pylint: disable=no-member
|
||||
assert isinstance(descriptor._field_data, LmsFieldData) # lint-amnesty, pylint: disable=no-member
|
||||
|
||||
# the LmsFieldData should now wrap OverrideFieldData
|
||||
self.assertIsInstance(
|
||||
# pylint: disable=protected-access
|
||||
descriptor._field_data._authored_data._source, # lint-amnesty, pylint: disable=no-member
|
||||
OverrideFieldData
|
||||
)
|
||||
assert isinstance(descriptor._field_data._authored_data._source, OverrideFieldData) # lint-amnesty, pylint: disable=no-member, line-too-long
|
||||
|
||||
# the OverrideFieldData should point to the date FieldData
|
||||
self.assertIsInstance(
|
||||
# pylint: disable=protected-access
|
||||
descriptor._field_data._authored_data._source.fallback, # lint-amnesty, pylint: disable=no-member
|
||||
DateLookupFieldData
|
||||
)
|
||||
self.assertIs(
|
||||
descriptor._field_data._authored_data._source.fallback._defaults, # lint-amnesty, pylint: disable=no-member
|
||||
descriptor._unwrapped_field_data # lint-amnesty, pylint: disable=no-member
|
||||
)
|
||||
assert isinstance(descriptor._field_data._authored_data._source.fallback, DateLookupFieldData) # lint-amnesty, pylint: disable=no-member, line-too-long
|
||||
assert descriptor._field_data._authored_data._source.fallback._defaults is descriptor._unwrapped_field_data # lint-amnesty, pylint: disable=no-member, line-too-long
|
||||
|
||||
def test_hash_resource(self):
|
||||
"""
|
||||
@@ -521,7 +507,7 @@ class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
decoded or otherwise.
|
||||
"""
|
||||
resources = ['ASCII text', u'❄ I am a special snowflake.', "❄ So am I, but I didn't tell you."]
|
||||
self.assertEqual(hash_resource(resources), '50c2ae79fbce9980e0803848914b0a09')
|
||||
assert hash_resource(resources) == '50c2ae79fbce9980e0803848914b0a09'
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -603,7 +589,7 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
'xmodule_handler',
|
||||
'goto_position',
|
||||
)
|
||||
self.assertEqual(403, response.status_code)
|
||||
assert 403 == response.status_code
|
||||
|
||||
def test_valid_csrf_token(self):
|
||||
"""
|
||||
@@ -620,12 +606,12 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
'xmodule_handler',
|
||||
'goto_position',
|
||||
)
|
||||
self.assertEqual(200, response.status_code)
|
||||
assert 200 == response.status_code
|
||||
|
||||
def test_invalid_location(self):
|
||||
request = self.request_factory.post('dummy_url', data={'position': 1})
|
||||
request.user = self.mock_user
|
||||
with self.assertRaises(Http404):
|
||||
with pytest.raises(Http404):
|
||||
render.handle_xblock_callback(
|
||||
request,
|
||||
text_type(self.course_key),
|
||||
@@ -640,18 +626,7 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
data={'file_id': (self._mock_file(), ) * (settings.MAX_FILEUPLOADS_PER_INPUT + 1)}
|
||||
)
|
||||
request.user = self.mock_user
|
||||
self.assertEqual(
|
||||
render.handle_xblock_callback(
|
||||
request,
|
||||
text_type(self.course_key),
|
||||
quote_slashes(text_type(self.location)),
|
||||
'dummy_handler'
|
||||
).content.decode('utf-8'),
|
||||
json.dumps({
|
||||
'success': u'Submission aborted! Maximum %d files may be submitted at once' %
|
||||
settings.MAX_FILEUPLOADS_PER_INPUT
|
||||
}, indent=2)
|
||||
)
|
||||
assert render.handle_xblock_callback(request, text_type(self.course_key), quote_slashes(text_type(self.location)), 'dummy_handler').content.decode('utf-8') == json.dumps({'success': (f'Submission aborted! Maximum {settings.MAX_FILEUPLOADS_PER_INPUT:d} files may be submitted at once')}, indent=2) # pylint: disable=line-too-long
|
||||
|
||||
def test_too_large_file(self):
|
||||
inputfile = self._mock_file(size=1 + settings.STUDENT_FILEUPLOAD_MAX_SIZE)
|
||||
@@ -660,18 +635,7 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
data={'file_id': inputfile}
|
||||
)
|
||||
request.user = self.mock_user
|
||||
self.assertEqual(
|
||||
render.handle_xblock_callback(
|
||||
request,
|
||||
text_type(self.course_key),
|
||||
quote_slashes(text_type(self.location)),
|
||||
'dummy_handler'
|
||||
).content.decode('utf-8'),
|
||||
json.dumps({
|
||||
'success': u'Submission aborted! Your file "%s" is too large (max size: %d MB)' %
|
||||
(inputfile.name, settings.STUDENT_FILEUPLOAD_MAX_SIZE / (1000 ** 2))
|
||||
}, indent=2)
|
||||
)
|
||||
assert render.handle_xblock_callback(request, text_type(self.course_key), quote_slashes(text_type(self.location)), 'dummy_handler').content.decode('utf-8') == json.dumps({'success': (u'Submission aborted! Your file "%s" is too large (max size: %d MB)' % (inputfile.name, (settings.STUDENT_FILEUPLOAD_MAX_SIZE / (1000 ** 2))))}, indent=2) # pylint: disable=line-too-long
|
||||
|
||||
def test_xmodule_dispatch(self):
|
||||
request = self.request_factory.post('dummy_url', data={'position': 1})
|
||||
@@ -683,12 +647,12 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
'xmodule_handler',
|
||||
'goto_position',
|
||||
)
|
||||
self.assertIsInstance(response, HttpResponse)
|
||||
assert isinstance(response, HttpResponse)
|
||||
|
||||
def test_bad_course_id(self):
|
||||
request = self.request_factory.post('dummy_url')
|
||||
request.user = self.mock_user
|
||||
with self.assertRaises(Http404):
|
||||
with pytest.raises(Http404):
|
||||
render.handle_xblock_callback(
|
||||
request,
|
||||
'bad_course_id',
|
||||
@@ -700,7 +664,7 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
def test_bad_location(self):
|
||||
request = self.request_factory.post('dummy_url')
|
||||
request.user = self.mock_user
|
||||
with self.assertRaises(Http404):
|
||||
with pytest.raises(Http404):
|
||||
render.handle_xblock_callback(
|
||||
request,
|
||||
text_type(self.course_key),
|
||||
@@ -712,7 +676,7 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
def test_bad_xmodule_dispatch(self):
|
||||
request = self.request_factory.post('dummy_url')
|
||||
request.user = self.mock_user
|
||||
with self.assertRaises(Http404):
|
||||
with pytest.raises(Http404):
|
||||
render.handle_xblock_callback(
|
||||
request,
|
||||
text_type(self.course_key),
|
||||
@@ -724,7 +688,7 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
def test_missing_handler(self):
|
||||
request = self.request_factory.post('dummy_url')
|
||||
request.user = self.mock_user
|
||||
with self.assertRaises(Http404):
|
||||
with pytest.raises(Http404):
|
||||
render.handle_xblock_callback(
|
||||
request,
|
||||
text_type(self.course_key),
|
||||
@@ -752,13 +716,13 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
'set_score',
|
||||
'',
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
student_module = StudentModule.objects.get(
|
||||
student=self.mock_user,
|
||||
module_state_key=block.scope_ids.usage_id,
|
||||
)
|
||||
self.assertEqual(student_module.grade, 0.75)
|
||||
self.assertEqual(student_module.max_grade, 1)
|
||||
assert student_module.grade == 0.75
|
||||
assert student_module.max_grade == 1
|
||||
|
||||
@ddt.data(
|
||||
('complete', {'completion': 0.625}),
|
||||
@@ -785,7 +749,7 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
'',
|
||||
)
|
||||
mock_complete.assert_not_called()
|
||||
self.assertFalse(BlockCompletion.objects.filter(block_key=block.scope_ids.usage_id).exists())
|
||||
assert not BlockCompletion.objects.filter(block_key=block.scope_ids.usage_id).exists()
|
||||
|
||||
@XBlock.register_temp_plugin(StubCompletableXBlock, identifier='comp')
|
||||
def test_completion_signal_for_completable_xblock(self):
|
||||
@@ -797,9 +761,9 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
{'completion': 0.625}, course, block, 'complete'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
completion = BlockCompletion.objects.get(block_key=block.scope_ids.usage_id)
|
||||
self.assertEqual(completion.completion, 0.625)
|
||||
assert completion.completion == 0.625
|
||||
|
||||
@XBlock.register_temp_plugin(StubCompletableXBlock, identifier='comp')
|
||||
@ddt.data((True, True), (False, False),)
|
||||
@@ -877,8 +841,8 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
{}, course, block, 'progress'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertFalse(BlockCompletion.objects.filter(block_key=block.scope_ids.usage_id).exists())
|
||||
assert response.status_code == 200
|
||||
assert not BlockCompletion.objects.filter(block_key=block.scope_ids.usage_id).exists()
|
||||
|
||||
@XBlock.register_temp_plugin(XBlockWithoutCompletionAPI, identifier='no_comp')
|
||||
def test_progress_signal_processed_for_xblock_without_completion_api(self):
|
||||
@@ -890,9 +854,9 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
{}, course, block, 'progress'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
completion = BlockCompletion.objects.get(block_key=block.scope_ids.usage_id)
|
||||
self.assertEqual(completion.completion, 1.0)
|
||||
assert completion.completion == 1.0
|
||||
|
||||
@XBlock.register_temp_plugin(StubCompletableXBlock, identifier='comp')
|
||||
def test_skip_handlers_for_masquerading_staff(self):
|
||||
@@ -918,8 +882,8 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
'',
|
||||
)
|
||||
mock_masq.assert_called()
|
||||
self.assertEqual(response.status_code, 200)
|
||||
with self.assertRaises(BlockCompletion.DoesNotExist):
|
||||
assert response.status_code == 200
|
||||
with pytest.raises(BlockCompletion.DoesNotExist):
|
||||
BlockCompletion.objects.get(block_key=block.scope_ids.usage_id)
|
||||
|
||||
@XBlock.register_temp_plugin(GradedStatelessXBlock, identifier='stateless_scorer')
|
||||
@@ -940,7 +904,7 @@ class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCas
|
||||
'xmodule_handler',
|
||||
'problem_check',
|
||||
)
|
||||
self.assertFalse(mock_score_signal.called)
|
||||
assert not mock_score_signal.called
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -968,14 +932,14 @@ class TestXBlockView(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
request = self.request_factory.get(self.xblock_view_url)
|
||||
request.user = UserFactory.create()
|
||||
response = render.xblock_view(request, *self.view_args)
|
||||
self.assertEqual(200, response.status_code)
|
||||
assert 200 == response.status_code
|
||||
|
||||
expected = ['csrf_token', 'html', 'resources']
|
||||
content = json.loads(response.content.decode('utf-8'))
|
||||
for section in expected:
|
||||
self.assertIn(section, content)
|
||||
assert section in content
|
||||
doc = PyQuery(content['html'])
|
||||
self.assertEqual(len(doc('div.xblock-student_view-html')), 1)
|
||||
assert len(doc('div.xblock-student_view-html')) == 1
|
||||
|
||||
@ddt.data(True, False)
|
||||
def test_hide_staff_markup(self, hide):
|
||||
@@ -989,16 +953,16 @@ class TestXBlockView(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
if hide:
|
||||
request.GET = {'hide_staff_markup': 'true'}
|
||||
response = render.xblock_view(request, *self.view_args)
|
||||
self.assertEqual(200, response.status_code)
|
||||
assert 200 == response.status_code
|
||||
|
||||
html = json.loads(response.content.decode('utf-8'))['html']
|
||||
self.assertEqual('Staff Debug Info' in html, not hide)
|
||||
assert ('Staff Debug Info' in html) == (not hide)
|
||||
|
||||
def test_xblock_view_handler_not_authenticated(self):
|
||||
request = self.request_factory.get(self.xblock_view_url)
|
||||
request.user = AnonymousUser()
|
||||
response = render.xblock_view(request, *self.view_args)
|
||||
self.assertEqual(401, response.status_code)
|
||||
assert 401 == response.status_code
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -1059,9 +1023,9 @@ class TestTOC(ModuleStoreTestCase):
|
||||
self.request.user, self.request, course, self.chapter, None, self.field_data_cache
|
||||
)
|
||||
for toc_section in expected:
|
||||
self.assertIn(toc_section, actual['chapters'])
|
||||
self.assertIsNone(actual['previous_of_active_section'])
|
||||
self.assertIsNone(actual['next_of_active_section'])
|
||||
assert toc_section in actual['chapters']
|
||||
assert actual['previous_of_active_section'] is None
|
||||
assert actual['next_of_active_section'] is None
|
||||
|
||||
# Mongo makes 3 queries to load the course to depth 2:
|
||||
# - 1 for the course
|
||||
@@ -1098,9 +1062,9 @@ class TestTOC(ModuleStoreTestCase):
|
||||
self.request.user, self.request, self.toy_course, self.chapter, section, self.field_data_cache
|
||||
)
|
||||
for toc_section in expected:
|
||||
self.assertIn(toc_section, actual['chapters'])
|
||||
self.assertEqual(actual['previous_of_active_section']['url_name'], 'Toy_Videos')
|
||||
self.assertEqual(actual['next_of_active_section']['url_name'], 'video_123456789012')
|
||||
assert toc_section in actual['chapters']
|
||||
assert actual['previous_of_active_section']['url_name'] == 'Toy_Videos'
|
||||
assert actual['next_of_active_section']['url_name'] == 'video_123456789012'
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -1252,12 +1216,12 @@ class TestProctoringRendering(SharedModuleStoreTestCase):
|
||||
section_actual = self._find_section(actual['chapters'], 'Overview', 'Toy_Videos')
|
||||
|
||||
if expected:
|
||||
self.assertIn(expected, [section_actual['proctoring']])
|
||||
assert expected in [section_actual['proctoring']]
|
||||
else:
|
||||
# we expect there not to be a 'proctoring' key in the dict
|
||||
self.assertNotIn('proctoring', section_actual)
|
||||
self.assertIsNone(actual['previous_of_active_section'])
|
||||
self.assertEqual(actual['next_of_active_section']['url_name'], u"Welcome")
|
||||
assert 'proctoring' not in section_actual
|
||||
assert actual['previous_of_active_section'] is None
|
||||
assert actual['next_of_active_section']['url_name'] == u'Welcome'
|
||||
|
||||
@ddt.data(
|
||||
(
|
||||
@@ -1364,7 +1328,7 @@ class TestProctoringRendering(SharedModuleStoreTestCase):
|
||||
)
|
||||
content = module.render(STUDENT_VIEW).content
|
||||
|
||||
self.assertIn(expected, content)
|
||||
assert expected in content
|
||||
|
||||
def _setup_test_data(self, enrollment_mode, is_practice_exam, attempt_status):
|
||||
"""
|
||||
@@ -1521,11 +1485,11 @@ class TestGatedSubsectionRendering(SharedModuleStoreTestCase, MilestonesTestCase
|
||||
self.open_seq.display_name,
|
||||
self.field_data_cache
|
||||
)
|
||||
self.assertIsNotNone(self._find_sequential(actual['chapters'], 'Chapter', 'Open_Sequential'))
|
||||
self.assertIsNotNone(self._find_sequential(actual['chapters'], 'Chapter', 'Gated_Sequential'))
|
||||
self.assertIsNone(self._find_sequential(actual['chapters'], 'Non-existent_Chapter', 'Non-existent_Sequential'))
|
||||
self.assertIsNone(actual['previous_of_active_section'])
|
||||
self.assertIsNone(actual['next_of_active_section'])
|
||||
assert self._find_sequential(actual['chapters'], 'Chapter', 'Open_Sequential') is not None
|
||||
assert self._find_sequential(actual['chapters'], 'Chapter', 'Gated_Sequential') is not None
|
||||
assert self._find_sequential(actual['chapters'], 'Non-existent_Chapter', 'Non-existent_Sequential') is None
|
||||
assert actual['previous_of_active_section'] is None
|
||||
assert actual['next_of_active_section'] is None
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -1566,7 +1530,7 @@ class TestHtmlModifiers(ModuleStoreTestCase):
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
|
||||
self.assertEqual(len(PyQuery(result_fragment.content)('div.xblock.xblock-student_view.xmodule_HtmlBlock')), 1)
|
||||
assert len(PyQuery(result_fragment.content)('div.xblock.xblock-student_view.xmodule_HtmlBlock')) == 1
|
||||
|
||||
def test_xmodule_display_wrapper_disabled(self):
|
||||
module = render.get_module(
|
||||
@@ -1578,8 +1542,7 @@ class TestHtmlModifiers(ModuleStoreTestCase):
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
|
||||
self.assertNotIn('div class="xblock xblock-student_view xmodule_display xmodule_HtmlBlock"',
|
||||
result_fragment.content)
|
||||
assert 'div class="xblock xblock-student_view xmodule_display xmodule_HtmlBlock"' not in result_fragment.content
|
||||
|
||||
def test_static_link_rewrite(self):
|
||||
module = render.get_module(
|
||||
@@ -1590,13 +1553,8 @@ class TestHtmlModifiers(ModuleStoreTestCase):
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
|
||||
self.assertIn(
|
||||
'/c4x/{org}/{course}/asset/foo_content'.format(
|
||||
org=self.course.location.org,
|
||||
course=self.course.location.course,
|
||||
),
|
||||
result_fragment.content
|
||||
)
|
||||
assert f'/c4x/{self.course.location.org}/{self.course.location.course}/asset/foo_content' \
|
||||
in result_fragment.content
|
||||
|
||||
def test_static_badlink_rewrite(self):
|
||||
module = render.get_module(
|
||||
@@ -1607,13 +1565,8 @@ class TestHtmlModifiers(ModuleStoreTestCase):
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
|
||||
self.assertIn(
|
||||
'/c4x/{org}/{course}/asset/file.jpg'.format(
|
||||
org=self.course.location.org,
|
||||
course=self.course.location.course,
|
||||
),
|
||||
result_fragment.content
|
||||
)
|
||||
assert f'/c4x/{self.course.location.org}/{self.course.location.course}/asset/file.jpg'\
|
||||
in result_fragment.content
|
||||
|
||||
def test_static_asset_path_use(self):
|
||||
'''
|
||||
@@ -1629,15 +1582,15 @@ class TestHtmlModifiers(ModuleStoreTestCase):
|
||||
static_asset_path="toy_course_dir",
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
self.assertIn('href="/static/toy_course_dir', result_fragment.content)
|
||||
assert 'href="/static/toy_course_dir' in result_fragment.content
|
||||
|
||||
def test_course_image(self):
|
||||
url = course_image_url(self.course)
|
||||
self.assertTrue(url.startswith('/c4x/'))
|
||||
assert url.startswith('/c4x/')
|
||||
|
||||
self.course.static_asset_path = "toy_course_dir"
|
||||
url = course_image_url(self.course)
|
||||
self.assertTrue(url.startswith('/static/toy_course_dir/'))
|
||||
assert url.startswith('/static/toy_course_dir/')
|
||||
self.course.static_asset_path = ""
|
||||
|
||||
@override_settings(DEFAULT_COURSE_ABOUT_IMAGE_URL='test.png')
|
||||
@@ -1652,7 +1605,7 @@ class TestHtmlModifiers(ModuleStoreTestCase):
|
||||
self.course.course_image = ''
|
||||
|
||||
url = course_image_url(self.course)
|
||||
self.assertEqual('static/test.png', url)
|
||||
assert 'static/test.png' == url
|
||||
|
||||
def test_get_course_info_section(self):
|
||||
self.course.static_asset_path = "toy_course_dir"
|
||||
@@ -1669,12 +1622,7 @@ class TestHtmlModifiers(ModuleStoreTestCase):
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
|
||||
self.assertIn(
|
||||
'/courses/{course_id}/bar/content'.format(
|
||||
course_id=text_type(self.course.id)
|
||||
),
|
||||
result_fragment.content
|
||||
)
|
||||
assert '/courses/{course_id}/bar/content'.format(course_id=text_type(self.course.id)) in result_fragment.content
|
||||
|
||||
|
||||
class XBlockWithJsonInitData(XBlock):
|
||||
@@ -1720,9 +1668,9 @@ class JsonInitDataTest(ModuleStoreTestCase):
|
||||
course=course
|
||||
)
|
||||
html = module.render(STUDENT_VIEW).content
|
||||
self.assertIn(json_output, html)
|
||||
assert json_output in html
|
||||
# No matter what data goes in, there should only be one close-script tag.
|
||||
self.assertEqual(html.count("</script>"), 1)
|
||||
assert html.count('</script>') == 1
|
||||
|
||||
|
||||
@XBlock.tag("detached")
|
||||
@@ -1785,7 +1733,7 @@ class TestStaffDebugInfo(SharedModuleStoreTestCase):
|
||||
self.field_data_cache,
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
self.assertNotIn('Staff Debug', result_fragment.content)
|
||||
assert 'Staff Debug' not in result_fragment.content
|
||||
|
||||
def test_staff_debug_info_enabled(self):
|
||||
module = render.get_module(
|
||||
@@ -1795,7 +1743,7 @@ class TestStaffDebugInfo(SharedModuleStoreTestCase):
|
||||
self.field_data_cache,
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
self.assertIn('Staff Debug', result_fragment.content)
|
||||
assert 'Staff Debug' in result_fragment.content
|
||||
|
||||
def test_staff_debug_info_score_for_invalid_dropdown(self):
|
||||
"""
|
||||
@@ -1833,10 +1781,8 @@ class TestStaffDebugInfo(SharedModuleStoreTestCase):
|
||||
<label for="sd_fs_{block_id}"> / 0</label>
|
||||
</div>""")
|
||||
|
||||
self.assertIn(
|
||||
expected_score_override_html.format(block_id=problem_descriptor.location.block_id),
|
||||
html_fragment.content
|
||||
)
|
||||
assert expected_score_override_html.format(block_id=problem_descriptor.location.block_id) in\
|
||||
html_fragment.content
|
||||
|
||||
@XBlock.register_temp_plugin(DetachedXBlock, identifier='detached-block')
|
||||
def test_staff_debug_info_disabled_for_detached_blocks(self):
|
||||
@@ -1858,7 +1804,7 @@ class TestStaffDebugInfo(SharedModuleStoreTestCase):
|
||||
field_data_cache,
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
self.assertNotIn('Staff Debug', result_fragment.content)
|
||||
assert 'Staff Debug' not in result_fragment.content
|
||||
|
||||
@patch.dict('django.conf.settings.FEATURES', {'DISPLAY_HISTOGRAMS_TO_STAFF': False})
|
||||
def test_histogram_disabled(self):
|
||||
@@ -1869,7 +1815,7 @@ class TestStaffDebugInfo(SharedModuleStoreTestCase):
|
||||
self.field_data_cache,
|
||||
)
|
||||
result_fragment = module.render(STUDENT_VIEW)
|
||||
self.assertNotIn('histrogram', result_fragment.content)
|
||||
assert 'histrogram' not in result_fragment.content
|
||||
|
||||
def test_histogram_enabled_for_unscored_xmodules(self):
|
||||
"""Histograms should not display for xmodules which are not scored."""
|
||||
@@ -1892,7 +1838,7 @@ class TestStaffDebugInfo(SharedModuleStoreTestCase):
|
||||
field_data_cache,
|
||||
)
|
||||
module.render(STUDENT_VIEW)
|
||||
self.assertFalse(mock_grade_histogram.called)
|
||||
assert not mock_grade_histogram.called
|
||||
|
||||
def test_histogram_enabled_for_scored_xmodules(self):
|
||||
"""Histograms should display for xmodules which are scored."""
|
||||
@@ -1914,7 +1860,7 @@ class TestStaffDebugInfo(SharedModuleStoreTestCase):
|
||||
self.field_data_cache,
|
||||
)
|
||||
module.render(STUDENT_VIEW)
|
||||
self.assertTrue(mock_grade_histogram.called)
|
||||
assert mock_grade_histogram.called
|
||||
|
||||
|
||||
PER_COURSE_ANONYMIZED_XBLOCKS = (
|
||||
@@ -1993,28 +1939,16 @@ class TestAnonymousStudentId(SharedModuleStoreTestCase, LoginEnrollmentTestCase)
|
||||
@ddt.data(*PER_STUDENT_ANONYMIZED_DESCRIPTORS)
|
||||
def test_per_student_anonymized_id(self, descriptor_class):
|
||||
for course_id in ('MITx/6.00x/2012_Fall', 'MITx/6.00x/2013_Spring'):
|
||||
self.assertEqual(
|
||||
# This value is set by observation, so that later changes to the student
|
||||
# id computation don't break old data
|
||||
'de619ab51c7f4e9c7216b4644c24f3b5',
|
||||
self._get_anonymous_id(CourseKey.from_string(course_id), descriptor_class)
|
||||
)
|
||||
assert 'de619ab51c7f4e9c7216b4644c24f3b5' == \
|
||||
self._get_anonymous_id(CourseKey.from_string(course_id), descriptor_class)
|
||||
|
||||
@ddt.data(*PER_COURSE_ANONYMIZED_XBLOCKS)
|
||||
def test_per_course_anonymized_id(self, xblock_class):
|
||||
self.assertEqual(
|
||||
# This value is set by observation, so that later changes to the student
|
||||
# id computation don't break old data
|
||||
'0c706d119cad686d28067412b9178454',
|
||||
self._get_anonymous_id(CourseKey.from_string('MITx/6.00x/2012_Fall'), xblock_class)
|
||||
)
|
||||
assert '0c706d119cad686d28067412b9178454' == \
|
||||
self._get_anonymous_id(CourseKey.from_string('MITx/6.00x/2012_Fall'), xblock_class)
|
||||
|
||||
self.assertEqual(
|
||||
# This value is set by observation, so that later changes to the student
|
||||
# id computation don't break old data
|
||||
'e9969c28c12c8efa6e987d6dbeedeb0b',
|
||||
self._get_anonymous_id(CourseKey.from_string('MITx/6.00x/2013_Spring'), xblock_class)
|
||||
)
|
||||
assert 'e9969c28c12c8efa6e987d6dbeedeb0b' == \
|
||||
self._get_anonymous_id(CourseKey.from_string('MITx/6.00x/2013_Spring'), xblock_class)
|
||||
|
||||
|
||||
@patch('common.djangoapps.track.views.eventtracker', autospec=True)
|
||||
@@ -2048,7 +1982,7 @@ class TestModuleTrackingContext(SharedModuleStoreTestCase):
|
||||
def test_context_contains_display_name(self, mock_tracker):
|
||||
problem_display_name = u'Option Response Problem'
|
||||
module_info = self.handle_callback_and_get_module_info(mock_tracker, problem_display_name)
|
||||
self.assertEqual(problem_display_name, module_info['display_name'])
|
||||
assert problem_display_name == module_info['display_name']
|
||||
|
||||
@XBlockAside.register_temp_plugin(AsideTestType, 'test_aside')
|
||||
@patch('xmodule.modulestore.mongo.base.CachingDescriptorSystem.applicable_aside_types',
|
||||
@@ -2074,12 +2008,12 @@ class TestModuleTrackingContext(SharedModuleStoreTestCase):
|
||||
# We are sending this `call_idx` to get the mock call that we are interested in.
|
||||
context_info = self.handle_callback_and_get_context_info(mock_tracker, problem_display_name, call_idx=4)
|
||||
|
||||
self.assertIn('asides', context_info)
|
||||
self.assertIn('test_aside', context_info['asides'])
|
||||
self.assertIn('content', context_info['asides']['test_aside'])
|
||||
self.assertEqual(context_info['asides']['test_aside']['content'], 'test1')
|
||||
self.assertIn('data_field', context_info['asides']['test_aside'])
|
||||
self.assertEqual(context_info['asides']['test_aside']['data_field'], 'test2')
|
||||
assert 'asides' in context_info
|
||||
assert 'test_aside' in context_info['asides']
|
||||
assert 'content' in context_info['asides']['test_aside']
|
||||
assert context_info['asides']['test_aside']['content'] == 'test1'
|
||||
assert 'data_field' in context_info['asides']['test_aside']
|
||||
assert context_info['asides']['test_aside']['data_field'] == 'test2'
|
||||
|
||||
def handle_callback_and_get_context_info(self,
|
||||
mock_tracker,
|
||||
@@ -2107,11 +2041,13 @@ class TestModuleTrackingContext(SharedModuleStoreTestCase):
|
||||
'problem_check',
|
||||
)
|
||||
|
||||
self.assertEquals(len(mock_tracker.emit.mock_calls), 1) # lint-amnesty, pylint: disable=deprecated-method
|
||||
assert len(mock_tracker.emit.mock_calls) == 1
|
||||
# lint-amnesty, pylint: disable=deprecated-method
|
||||
mock_call = mock_tracker.emit.mock_calls[0]
|
||||
event = mock_call[2]
|
||||
|
||||
self.assertEquals(event['name'], 'problem_check') # lint-amnesty, pylint: disable=deprecated-method
|
||||
assert event['name'] == 'problem_check'
|
||||
# lint-amnesty, pylint: disable=deprecated-method
|
||||
|
||||
# for different operations, there are different number of context calls.
|
||||
# We are sending this `call_idx` to get the mock call that we are interested in.
|
||||
@@ -2131,7 +2067,7 @@ class TestModuleTrackingContext(SharedModuleStoreTestCase):
|
||||
|
||||
def test_missing_display_name(self, mock_tracker):
|
||||
actual_display_name = self.handle_callback_and_get_module_info(mock_tracker)['display_name']
|
||||
self.assertTrue(actual_display_name.startswith('problem'))
|
||||
assert actual_display_name.startswith('problem')
|
||||
|
||||
def test_library_source_information(self, mock_tracker):
|
||||
"""
|
||||
@@ -2144,10 +2080,10 @@ class TestModuleTrackingContext(SharedModuleStoreTestCase):
|
||||
mock_get_original_usage = lambda _, key: (original_usage_key, original_usage_version)
|
||||
with patch('xmodule.modulestore.mixed.MixedModuleStore.get_block_original_usage', mock_get_original_usage):
|
||||
module_info = self.handle_callback_and_get_module_info(mock_tracker)
|
||||
self.assertIn('original_usage_key', module_info)
|
||||
self.assertEqual(module_info['original_usage_key'], text_type(original_usage_key))
|
||||
self.assertIn('original_usage_version', module_info)
|
||||
self.assertEqual(module_info['original_usage_version'], text_type(original_usage_version))
|
||||
assert 'original_usage_key' in module_info
|
||||
assert module_info['original_usage_key'] == text_type(original_usage_key)
|
||||
assert 'original_usage_version' in module_info
|
||||
assert module_info['original_usage_version'] == text_type(original_usage_version)
|
||||
|
||||
|
||||
class TestXmoduleRuntimeEvent(TestSubmittingProblems):
|
||||
@@ -2186,16 +2122,16 @@ class TestXmoduleRuntimeEvent(TestSubmittingProblems):
|
||||
"""Tests the publish mechanism"""
|
||||
self.set_module_grade_using_publish(self.grade_dict)
|
||||
student_module = StudentModule.objects.get(student=self.student_user, module_state_key=self.problem.location)
|
||||
self.assertEqual(student_module.grade, self.grade_dict['value'])
|
||||
self.assertEqual(student_module.max_grade, self.grade_dict['max_value'])
|
||||
assert student_module.grade == self.grade_dict['value']
|
||||
assert student_module.max_grade == self.grade_dict['max_value']
|
||||
|
||||
def test_xmodule_runtime_publish_delete(self):
|
||||
"""Test deleting the grade using the publish mechanism"""
|
||||
module = self.set_module_grade_using_publish(self.grade_dict)
|
||||
module.system.publish(module, 'grade', self.delete_dict)
|
||||
student_module = StudentModule.objects.get(student=self.student_user, module_state_key=self.problem.location)
|
||||
self.assertIsNone(student_module.grade)
|
||||
self.assertIsNone(student_module.max_grade)
|
||||
assert student_module.grade is None
|
||||
assert student_module.max_grade is None
|
||||
|
||||
@patch('lms.djangoapps.grades.signals.handlers.PROBLEM_RAW_SCORE_CHANGED.send')
|
||||
def test_score_change_signal(self, send_mock):
|
||||
@@ -2279,7 +2215,7 @@ class TestRebindModule(TestSubmittingProblems):
|
||||
render.LmsModuleRenderError,
|
||||
"rebind_noauth_module_to_user can only be called from a module bound to an anonymous user"
|
||||
):
|
||||
self.assertTrue(module.system.rebind_noauth_module_to_user(module, user2))
|
||||
assert module.system.rebind_noauth_module_to_user(module, user2)
|
||||
|
||||
def test_rebind_noauth_module_to_user_anonymous(self):
|
||||
"""
|
||||
@@ -2290,10 +2226,10 @@ class TestRebindModule(TestSubmittingProblems):
|
||||
user2 = UserFactory()
|
||||
user2.id = 2
|
||||
module.system.rebind_noauth_module_to_user(module, user2)
|
||||
self.assertTrue(module)
|
||||
self.assertEqual(module.system.anonymous_student_id, anonymous_id_for_user(user2, self.course.id))
|
||||
self.assertEqual(module.scope_ids.user_id, user2.id)
|
||||
self.assertEqual(module.scope_ids.user_id, user2.id)
|
||||
assert module
|
||||
assert module.system.anonymous_student_id == anonymous_id_for_user(user2, self.course.id)
|
||||
assert module.scope_ids.user_id == user2.id
|
||||
assert module.scope_ids.user_id == user2.id
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -2374,7 +2310,7 @@ class LMSXBlockServiceBindingTest(SharedModuleStoreTestCase):
|
||||
course=self.course
|
||||
)
|
||||
service = runtime.service(descriptor, expected_service)
|
||||
self.assertIsNotNone(service)
|
||||
assert service is not None
|
||||
|
||||
def test_beta_tester_fields_added(self):
|
||||
"""
|
||||
@@ -2394,8 +2330,8 @@ class LMSXBlockServiceBindingTest(SharedModuleStoreTestCase):
|
||||
)
|
||||
|
||||
# pylint: disable=no-member
|
||||
self.assertFalse(runtime.user_is_beta_tester)
|
||||
self.assertEqual(runtime.days_early_for_beta, 5)
|
||||
assert not runtime.user_is_beta_tester
|
||||
assert runtime.days_early_for_beta == 5
|
||||
|
||||
|
||||
class PureXBlockWithChildren(PureXBlock):
|
||||
@@ -2575,7 +2511,7 @@ class TestFilteredChildren(SharedModuleStoreTestCase):
|
||||
"""
|
||||
Used to assert that sets of children are equivalent.
|
||||
"""
|
||||
self.assertEqual(set(child_usage_ids), set(child.scope_ids.usage_id for child in block.get_children()))
|
||||
assert set(child_usage_ids) == set((child.scope_ids.usage_id for child in block.get_children()))
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -2621,5 +2557,5 @@ class TestDisabledXBlockTypes(ModuleStoreTestCase):
|
||||
item_id = item.scope_ids.usage_id # lint-amnesty, pylint: disable=no-member
|
||||
|
||||
item = self.store.get_item(item_id)
|
||||
self.assertEqual(item.__class__.__name__, descriptor)
|
||||
assert item.__class__.__name__ == descriptor
|
||||
return item_id
|
||||
|
||||
@@ -122,8 +122,8 @@ class TestNavigation(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
'chapter': 'Chrome',
|
||||
'section': displayname,
|
||||
}))
|
||||
self.assertEqual('course-tabs' in response.content.decode('utf-8'), tabs)
|
||||
self.assertEqual('course-navigation' in response.content.decode('utf-8'), accordion)
|
||||
assert ('course-tabs' in response.content.decode('utf-8')) == tabs
|
||||
assert ('course-navigation' in response.content.decode('utf-8')) == accordion
|
||||
|
||||
self.assertTabInactive('progress', response)
|
||||
self.assertTabActive('courseware', response)
|
||||
@@ -148,7 +148,7 @@ class TestNavigation(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
|
||||
# make sure we can access courseware immediately
|
||||
resp = self.client.get(reverse('dashboard'))
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
# then wait a bit and see if we get timed out
|
||||
time.sleep(2)
|
||||
|
||||
@@ -61,7 +61,7 @@ class PermissionTests(ModuleStoreTestCase):
|
||||
has_perm = self.user.has_perm(
|
||||
'edx_proctoring.can_take_proctored_exam', {'course_id': str(self.course_id)}
|
||||
)
|
||||
self.assertFalse(has_perm)
|
||||
assert not has_perm
|
||||
|
||||
@patch.dict(
|
||||
'django.conf.settings.PROCTORING_BACKENDS',
|
||||
@@ -78,13 +78,6 @@ class PermissionTests(ModuleStoreTestCase):
|
||||
enable_proctored_exams=True, proctoring_provider='mock_proctoring_allow_honor_mode'
|
||||
)
|
||||
CourseEnrollment.enroll(self.user, course_allow_honor.id, mode='honor')
|
||||
self.assertTrue(
|
||||
self.user.has_perm(
|
||||
'edx_proctoring.can_take_proctored_exam',
|
||||
{
|
||||
'course_id': str(course_allow_honor.id),
|
||||
'backend': 'mock_proctoring_allow_honor_mode',
|
||||
'is_proctored': True,
|
||||
},
|
||||
)
|
||||
)
|
||||
assert self.user.has_perm('edx_proctoring.can_take_proctored_exam',
|
||||
{'course_id': str(course_allow_honor.id),
|
||||
'backend': 'mock_proctoring_allow_honor_mode', 'is_proctored': True})
|
||||
|
||||
@@ -77,11 +77,11 @@ class SelfPacedDateOverrideTest(ModuleStoreTestCase):
|
||||
|
||||
def test_instructor_paced_due_date(self):
|
||||
__, ip_section = self.setup_course(display_name="Instructor Paced Course", self_paced=False)
|
||||
self.assertEqual(ip_section.due, self.now)
|
||||
assert ip_section.due == self.now
|
||||
|
||||
def test_self_paced_due_date(self):
|
||||
__, sp_section = self.setup_course(display_name="Self-Paced Course", self_paced=True)
|
||||
self.assertIsNone(sp_section.due)
|
||||
assert sp_section.due is None
|
||||
|
||||
@patch.dict('lms.djangoapps.courseware.access.settings.FEATURES', {'DISABLE_START_DATES': False})
|
||||
def test_course_access_to_beta_users(self):
|
||||
@@ -100,16 +100,16 @@ class SelfPacedDateOverrideTest(ModuleStoreTestCase):
|
||||
beta_tester = BetaTesterFactory(course_key=self_paced_course.id)
|
||||
|
||||
# Verify course is `self_paced` and course has start date but not section.
|
||||
self.assertTrue(self_paced_course.self_paced)
|
||||
self.assertEqual(self_paced_course.start, one_month_from_now)
|
||||
self.assertIsNone(self_paced_section.start)
|
||||
assert self_paced_course.self_paced
|
||||
assert self_paced_course.start == one_month_from_now
|
||||
assert self_paced_section.start is None
|
||||
|
||||
# Verify that non-staff user do not have access to the course
|
||||
self.assertFalse(has_access(self.non_staff_user, 'load', self_paced_course))
|
||||
assert not has_access(self.non_staff_user, 'load', self_paced_course)
|
||||
|
||||
# Verify beta tester can access the course as well as the course sections
|
||||
self.assertTrue(has_access(beta_tester, 'load', self_paced_course))
|
||||
self.assertTrue(has_access(beta_tester, 'load', self_paced_section, self_paced_course.id))
|
||||
assert has_access(beta_tester, 'load', self_paced_course)
|
||||
assert has_access(beta_tester, 'load', self_paced_section, self_paced_course.id)
|
||||
|
||||
@patch.dict('lms.djangoapps.courseware.access.settings.FEATURES', {'DISABLE_START_DATES': False})
|
||||
def test_instructor_paced_discussion_xblock_visibility(self):
|
||||
@@ -122,9 +122,7 @@ class SelfPacedDateOverrideTest(ModuleStoreTestCase):
|
||||
|
||||
# Only the released xblocks should be visible when the course is instructor-paced.
|
||||
xblocks = get_accessible_discussion_xblocks(course, self.non_staff_user)
|
||||
self.assertTrue(
|
||||
all(xblock.display_name == 'released' for xblock in xblocks)
|
||||
)
|
||||
assert all(((xblock.display_name == 'released') for xblock in xblocks))
|
||||
|
||||
@patch.dict('lms.djangoapps.courseware.access.settings.FEATURES', {'DISABLE_START_DATES': False})
|
||||
def test_self_paced_discussion_xblock_visibility(self):
|
||||
@@ -137,7 +135,5 @@ class SelfPacedDateOverrideTest(ModuleStoreTestCase):
|
||||
|
||||
# The scheduled xblocks should be visible when the course is self-paced.
|
||||
xblocks = get_accessible_discussion_xblocks(course, self.non_staff_user)
|
||||
self.assertEqual(len(xblocks), 2)
|
||||
self.assertTrue(
|
||||
any(xblock.display_name == 'scheduled' for xblock in xblocks)
|
||||
)
|
||||
assert len(xblocks) == 2
|
||||
assert any(((xblock.display_name == 'scheduled') for xblock in xblocks))
|
||||
|
||||
@@ -122,4 +122,4 @@ class TestUserStateService(ModuleStoreTestCase):
|
||||
params.update(state_params)
|
||||
self._create_student_module({'key_1': 'value_1'})
|
||||
state = UserStateService().get_state_as_dict(**params)
|
||||
self.assertFalse(state)
|
||||
assert not state
|
||||
|
||||
@@ -127,24 +127,21 @@ class SplitTestBase(SharedModuleStoreTestCase):
|
||||
unicode_content = resp.content.decode(resp.charset)
|
||||
|
||||
# Assert we see the proper icon in the top display
|
||||
self.assertIn(
|
||||
u'<button class="{} inactive nav-item tab"'.format(self.ICON_CLASSES[user_tag]),
|
||||
unicode_content
|
||||
)
|
||||
assert u'<button class="{} inactive nav-item tab"'.format(self.ICON_CLASSES[user_tag]) in unicode_content
|
||||
|
||||
# And proper tooltips
|
||||
for tooltip in self.TOOLTIPS[user_tag]:
|
||||
self.assertIn(tooltip, unicode_content)
|
||||
assert tooltip in unicode_content
|
||||
|
||||
for key in self.included_usage_keys[user_tag]:
|
||||
self.assertIn(six.text_type(key), unicode_content)
|
||||
assert six.text_type(key) in unicode_content
|
||||
|
||||
for key in self.excluded_usage_keys[user_tag]:
|
||||
self.assertNotIn(six.text_type(key), unicode_content)
|
||||
assert six.text_type(key) not in unicode_content
|
||||
|
||||
# Assert that we can see the data from the appropriate test condition
|
||||
for visible in self.VISIBLE_CONTENT[user_tag]:
|
||||
self.assertIn(visible, unicode_content)
|
||||
assert visible in unicode_content
|
||||
|
||||
|
||||
class TestSplitTestVert(SplitTestBase):
|
||||
|
||||
@@ -269,7 +269,7 @@ class TestSubmittingProblems(ModuleStoreTestCase, LoginEnrollmentTestCase, Probl
|
||||
"""
|
||||
Assert that percent grade is as expected.
|
||||
"""
|
||||
self.assertEqual(self.get_course_grade().percent, percent)
|
||||
assert self.get_course_grade().percent == percent
|
||||
|
||||
def earned_hw_scores(self):
|
||||
"""
|
||||
@@ -316,7 +316,7 @@ class TestCourseGrades(TestSubmittingProblems):
|
||||
Submits correct answer to the problem.
|
||||
"""
|
||||
resp = self.submit_question_answer('p1', {'2_1': 'Correct'})
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
def _verify_grade(self, expected_problem_score, expected_hw_grade):
|
||||
"""
|
||||
@@ -324,8 +324,8 @@ class TestCourseGrades(TestSubmittingProblems):
|
||||
"""
|
||||
hw_grade = self.hw_grade('homework')
|
||||
problem_score = list(hw_grade.problem_scores.values())[0]
|
||||
self.assertEqual((problem_score.earned, problem_score.possible), expected_problem_score)
|
||||
self.assertEqual((hw_grade.graded_total.earned, hw_grade.graded_total.possible), expected_hw_grade)
|
||||
assert (problem_score.earned, problem_score.possible) == expected_problem_score
|
||||
assert (hw_grade.graded_total.earned, hw_grade.graded_total.possible) == expected_hw_grade
|
||||
|
||||
def test_basic(self):
|
||||
self._submit_correct_answer()
|
||||
@@ -452,12 +452,12 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
"""Test problem for due date in the past"""
|
||||
self.basic_setup(late=True)
|
||||
resp = self.submit_question_answer('p1', {'2_1': 'Correct'})
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
err_msg = (
|
||||
"The state of this problem has changed since you loaded this page. "
|
||||
"Please refresh your page."
|
||||
)
|
||||
self.assertEqual(json.loads(resp.content.decode('utf-8')).get("success"), err_msg)
|
||||
assert json.loads(resp.content.decode('utf-8')).get('success') == err_msg
|
||||
|
||||
def test_submission_reset(self):
|
||||
"""Test problem ProcessingErrors due to resets"""
|
||||
@@ -465,23 +465,23 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
resp = self.submit_question_answer('p1', {'2_1': 'Correct'})
|
||||
# submit a second time to draw NotFoundError
|
||||
resp = self.submit_question_answer('p1', {'2_1': 'Correct'})
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
err_msg = (
|
||||
"The state of this problem has changed since you loaded this page. "
|
||||
"Please refresh your page."
|
||||
)
|
||||
self.assertEqual(json.loads(resp.content.decode('utf-8')).get("success"), err_msg)
|
||||
assert json.loads(resp.content.decode('utf-8')).get('success') == err_msg
|
||||
|
||||
def test_submission_show_answer(self):
|
||||
"""Test problem for ProcessingErrors due to showing answer"""
|
||||
self.basic_setup(showanswer=True)
|
||||
resp = self.show_question_answer('p1')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
err_msg = (
|
||||
"The state of this problem has changed since you loaded this page. "
|
||||
"Please refresh your page."
|
||||
)
|
||||
self.assertEqual(json.loads(resp.content.decode('utf-8')).get("success"), err_msg)
|
||||
assert json.loads(resp.content.decode('utf-8')).get('success') == err_msg
|
||||
|
||||
def test_show_answer_doesnt_write_to_csm(self):
|
||||
self.basic_setup()
|
||||
@@ -494,14 +494,14 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
)
|
||||
# count how many state history entries there are
|
||||
baseline = BaseStudentModuleHistory.get_history(student_module)
|
||||
self.assertEqual(len(baseline), 2)
|
||||
assert len(baseline) == 2
|
||||
|
||||
# now click "show answer"
|
||||
self.show_question_answer('p1')
|
||||
|
||||
# check that we don't have more state history entries
|
||||
csmh = BaseStudentModuleHistory.get_history(student_module)
|
||||
self.assertEqual(len(csmh), 2)
|
||||
assert len(csmh) == 2
|
||||
|
||||
def test_grade_with_collected_max_score(self):
|
||||
"""
|
||||
@@ -511,11 +511,7 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
self.basic_setup()
|
||||
self.submit_question_answer('p1', {'2_1': 'Correct'})
|
||||
self.look_at_question('p2')
|
||||
self.assertTrue(
|
||||
StudentModule.objects.filter(
|
||||
module_state_key=self.problem_location('p2')
|
||||
).exists()
|
||||
)
|
||||
assert StudentModule.objects.filter(module_state_key=self.problem_location('p2')).exists()
|
||||
|
||||
# problem isn't in the cache, but will be when graded
|
||||
self.check_grade_percent(0.33)
|
||||
@@ -529,7 +525,7 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
"""
|
||||
self.basic_setup()
|
||||
self.check_grade_percent(0)
|
||||
self.assertEqual(self.get_course_grade().letter_grade, None)
|
||||
assert self.get_course_grade().letter_grade is None
|
||||
|
||||
def test_b_grade_exact(self):
|
||||
"""
|
||||
@@ -538,7 +534,7 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
self.basic_setup()
|
||||
self.submit_question_answer('p1', {'2_1': 'Correct'})
|
||||
self.check_grade_percent(0.33)
|
||||
self.assertEqual(self.get_course_grade().letter_grade, 'B')
|
||||
assert self.get_course_grade().letter_grade == 'B'
|
||||
|
||||
def test_b_grade_above(self):
|
||||
"""
|
||||
@@ -548,7 +544,7 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
self.submit_question_answer('p1', {'2_1': 'Correct'})
|
||||
self.submit_question_answer('p2', {'2_1': 'Correct'})
|
||||
self.check_grade_percent(0.67)
|
||||
self.assertEqual(self.get_course_grade().letter_grade, 'B')
|
||||
assert self.get_course_grade().letter_grade == 'B'
|
||||
|
||||
def test_a_grade(self):
|
||||
"""
|
||||
@@ -559,7 +555,7 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
self.submit_question_answer('p2', {'2_1': 'Correct'})
|
||||
self.submit_question_answer('p3', {'2_1': 'Correct'})
|
||||
self.check_grade_percent(1.0)
|
||||
self.assertEqual(self.get_course_grade().letter_grade, 'A')
|
||||
assert self.get_course_grade().letter_grade == 'A'
|
||||
|
||||
def test_wrong_answers(self):
|
||||
"""
|
||||
@@ -570,7 +566,7 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
self.submit_question_answer('p2', {'2_1': 'Correct'})
|
||||
self.submit_question_answer('p3', {'2_1': 'Incorrect'})
|
||||
self.check_grade_percent(0.67)
|
||||
self.assertEqual(self.get_course_grade().letter_grade, 'B')
|
||||
assert self.get_course_grade().letter_grade == 'B'
|
||||
|
||||
def test_submissions_api_overrides_scores(self):
|
||||
"""
|
||||
@@ -581,7 +577,7 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
self.submit_question_answer('p2', {'2_1': 'Correct'})
|
||||
self.submit_question_answer('p3', {'2_1': 'Incorrect'})
|
||||
self.check_grade_percent(0.67)
|
||||
self.assertEqual(self.get_course_grade().letter_grade, 'B')
|
||||
assert self.get_course_grade().letter_grade == 'B'
|
||||
|
||||
student_item = {
|
||||
'student_id': anonymous_id_for_user(self.student_user, self.course.id),
|
||||
@@ -592,7 +588,7 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
submission = submissions_api.create_submission(student_item, 'any answer')
|
||||
submissions_api.set_score(submission['uuid'], 1, 1)
|
||||
self.check_grade_percent(1.0)
|
||||
self.assertEqual(self.get_course_grade().letter_grade, 'A')
|
||||
assert self.get_course_grade().letter_grade == 'A'
|
||||
|
||||
def test_submissions_api_anonymous_student_id(self):
|
||||
"""
|
||||
@@ -627,8 +623,9 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
# Get both parts correct
|
||||
self.submit_question_answer('H1P1', {'2_1': 'Correct', '2_2': 'Correct'})
|
||||
self.check_grade_percent(0.25)
|
||||
self.assertEqual(self.earned_hw_scores(), [2.0]) # Order matters
|
||||
self.assertEqual(self.score_for_hw('homework'), [2.0])
|
||||
assert self.earned_hw_scores() == [2.0]
|
||||
# Order matters
|
||||
assert self.score_for_hw('homework') == [2.0]
|
||||
|
||||
def test_weighted_exam(self):
|
||||
"""
|
||||
@@ -674,9 +671,10 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
self.dropping_setup()
|
||||
self.dropping_homework_stage1()
|
||||
|
||||
self.assertEqual(self.score_for_hw('homework1'), [1.0, 0.0])
|
||||
self.assertEqual(self.score_for_hw('homework2'), [1.0, 1.0])
|
||||
self.assertEqual(self.earned_hw_scores(), [1.0, 2.0, 0]) # Order matters
|
||||
assert self.score_for_hw('homework1') == [1.0, 0.0]
|
||||
assert self.score_for_hw('homework2') == [1.0, 1.0]
|
||||
assert self.earned_hw_scores() == [1.0, 2.0, 0]
|
||||
# Order matters
|
||||
self.check_grade_percent(0.75)
|
||||
|
||||
def test_dropping_nochange(self):
|
||||
@@ -687,10 +685,11 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
self.dropping_homework_stage1()
|
||||
self.submit_question_answer(self.hw3_names[0], {'2_1': 'Correct'})
|
||||
|
||||
self.assertEqual(self.score_for_hw('homework1'), [1.0, 0.0])
|
||||
self.assertEqual(self.score_for_hw('homework2'), [1.0, 1.0])
|
||||
self.assertEqual(self.score_for_hw('homework3'), [1.0, 0.0])
|
||||
self.assertEqual(self.earned_hw_scores(), [1.0, 2.0, 1.0]) # Order matters
|
||||
assert self.score_for_hw('homework1') == [1.0, 0.0]
|
||||
assert self.score_for_hw('homework2') == [1.0, 1.0]
|
||||
assert self.score_for_hw('homework3') == [1.0, 0.0]
|
||||
assert self.earned_hw_scores() == [1.0, 2.0, 1.0]
|
||||
# Order matters
|
||||
self.check_grade_percent(0.75)
|
||||
|
||||
def test_dropping_all_correct(self):
|
||||
@@ -704,8 +703,9 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
self.submit_question_answer(name, {'2_1': 'Correct'})
|
||||
|
||||
self.check_grade_percent(1.0)
|
||||
self.assertEqual(self.earned_hw_scores(), [1.0, 2.0, 2.0]) # Order matters
|
||||
self.assertEqual(self.score_for_hw('homework3'), [1.0, 1.0])
|
||||
assert self.earned_hw_scores() == [1.0, 2.0, 2.0]
|
||||
# Order matters
|
||||
assert self.score_for_hw('homework3') == [1.0, 1.0]
|
||||
|
||||
@ddt.data(
|
||||
*CourseMode.CREDIT_ELIGIBLE_MODES
|
||||
@@ -743,14 +743,14 @@ class TestCourseGrader(TestSubmittingProblems):
|
||||
|
||||
# Credit requirement is not satisfied before passing grade
|
||||
req_status = get_credit_requirement_status(self.course.id, self.student_user.username, 'grade', 'grade')
|
||||
self.assertEqual(req_status[0]["status"], None)
|
||||
assert req_status[0]['status'] is None
|
||||
|
||||
self.submit_question_answer('p1', {'2_1': 'Correct'})
|
||||
self.submit_question_answer('p2', {'2_1': 'Correct'})
|
||||
|
||||
# Credit requirement is now satisfied after passing grade
|
||||
req_status = get_credit_requirement_status(self.course.id, self.student_user.username, 'grade', 'grade')
|
||||
self.assertEqual(req_status[0]["status"], 'satisfied')
|
||||
assert req_status[0]['status'] == 'satisfied'
|
||||
|
||||
|
||||
class ProblemWithUploadedFilesTest(TestSubmittingProblems):
|
||||
@@ -794,15 +794,15 @@ class ProblemWithUploadedFilesTest(TestSubmittingProblems):
|
||||
with patch('lms.djangoapps.courseware.module_render.XQUEUE_INTERFACE.session') as mock_session:
|
||||
resp = self.submit_question_answer("the_problem", {'2_1': fileobjs})
|
||||
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
json_resp = json.loads(resp.content.decode('utf-8'))
|
||||
self.assertEqual(json_resp['success'], "incorrect")
|
||||
assert json_resp['success'] == 'incorrect'
|
||||
|
||||
# See how post got called.
|
||||
name, args, kwargs = mock_session.mock_calls[0]
|
||||
self.assertEqual(name, "post")
|
||||
self.assertEqual(len(args), 1)
|
||||
self.assertTrue(args[0].endswith("/submit/"))
|
||||
assert name == 'post'
|
||||
assert len(args) == 1
|
||||
assert args[0].endswith('/submit/')
|
||||
six.assertCountEqual(self, list(kwargs.keys()), ["files", "data", "timeout"])
|
||||
six.assertCountEqual(self, list(kwargs['files'].keys()), filenames.split())
|
||||
|
||||
@@ -986,7 +986,7 @@ class TestPythonGradedResponse(TestSubmittingProblems):
|
||||
resp = self.submit_question_answer(name, {'2_1': self.correct_responses[name]})
|
||||
|
||||
respdata = json.loads(resp.content.decode('utf-8'))
|
||||
self.assertEqual(respdata['success'], 'correct')
|
||||
assert respdata['success'] == 'correct'
|
||||
|
||||
def _check_incorrect(self, name):
|
||||
"""
|
||||
@@ -995,7 +995,7 @@ class TestPythonGradedResponse(TestSubmittingProblems):
|
||||
resp = self.submit_question_answer(name, {'2_1': self.incorrect_responses[name]})
|
||||
|
||||
respdata = json.loads(resp.content.decode('utf-8'))
|
||||
self.assertEqual(respdata['success'], 'incorrect')
|
||||
assert respdata['success'] == 'incorrect'
|
||||
|
||||
def _check_ireset(self, name):
|
||||
"""
|
||||
@@ -1009,7 +1009,7 @@ class TestPythonGradedResponse(TestSubmittingProblems):
|
||||
resp = self.submit_question_answer(name, {'2_1': self.correct_responses[name]})
|
||||
|
||||
respdata = json.loads(resp.content.decode('utf-8'))
|
||||
self.assertEqual(respdata['success'], 'correct')
|
||||
assert respdata['success'] == 'correct'
|
||||
|
||||
def test_schematic_correct(self):
|
||||
name = "schematic_problem"
|
||||
@@ -1183,9 +1183,9 @@ class TestConditionalContent(TestSubmittingProblems):
|
||||
self.submit_question_answer('H2P1_GROUP0', {'2_1': 'Correct'})
|
||||
self.submit_question_answer('H2P2_GROUP0', {'2_1': 'Correct', '2_2': 'Incorrect', '2_3': 'Correct'})
|
||||
|
||||
self.assertEqual(self.score_for_hw('homework1'), [1.0])
|
||||
self.assertEqual(self.score_for_hw('homework2'), [1.0, 2.0])
|
||||
self.assertEqual(self.earned_hw_scores(), [1.0, 3.0])
|
||||
assert self.score_for_hw('homework1') == [1.0]
|
||||
assert self.score_for_hw('homework2') == [1.0, 2.0]
|
||||
assert self.earned_hw_scores() == [1.0, 3.0]
|
||||
|
||||
# Grade percent is .63. Here is the calculation:
|
||||
# homework_1_score = 1.0 / 2
|
||||
@@ -1202,9 +1202,9 @@ class TestConditionalContent(TestSubmittingProblems):
|
||||
|
||||
self.submit_question_answer('H2P1_GROUP1', {'2_1': 'Correct'})
|
||||
|
||||
self.assertEqual(self.score_for_hw('homework1'), [1.0])
|
||||
self.assertEqual(self.score_for_hw('homework2'), [1.0])
|
||||
self.assertEqual(self.earned_hw_scores(), [1.0, 1.0])
|
||||
assert self.score_for_hw('homework1') == [1.0]
|
||||
assert self.score_for_hw('homework2') == [1.0]
|
||||
assert self.earned_hw_scores() == [1.0, 1.0]
|
||||
|
||||
# Grade percent is .75. Here is the calculation:
|
||||
# homework_1_score = 1.0 / 2
|
||||
@@ -1236,9 +1236,9 @@ class TestConditionalContent(TestSubmittingProblems):
|
||||
"""
|
||||
self.split_one_group_no_problems_setup(self.user_partition_group_0)
|
||||
|
||||
self.assertEqual(self.score_for_hw('homework1'), [1.0])
|
||||
self.assertEqual(self.score_for_hw('homework2'), [])
|
||||
self.assertEqual(self.earned_hw_scores(), [1.0])
|
||||
assert self.score_for_hw('homework1') == [1.0]
|
||||
assert self.score_for_hw('homework2') == []
|
||||
assert self.earned_hw_scores() == [1.0]
|
||||
|
||||
# Grade percent is .25. Here is the calculation:
|
||||
# homework_1_score = 1.0 / 2
|
||||
@@ -1254,9 +1254,9 @@ class TestConditionalContent(TestSubmittingProblems):
|
||||
|
||||
self.submit_question_answer('H2P1_GROUP1', {'2_1': 'Correct'})
|
||||
|
||||
self.assertEqual(self.score_for_hw('homework1'), [1.0])
|
||||
self.assertEqual(self.score_for_hw('homework2'), [1.0])
|
||||
self.assertEqual(self.earned_hw_scores(), [1.0, 1.0])
|
||||
assert self.score_for_hw('homework1') == [1.0]
|
||||
assert self.score_for_hw('homework2') == [1.0]
|
||||
assert self.earned_hw_scores() == [1.0, 1.0]
|
||||
|
||||
# Grade percent is .75. Here is the calculation.
|
||||
# homework_1_score = 1.0 / 2
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Test cases for tabs.
|
||||
"""
|
||||
|
||||
|
||||
import pytest
|
||||
import six
|
||||
from crum import set_current_request
|
||||
from django.contrib.auth.models import AnonymousUser
|
||||
@@ -109,18 +109,18 @@ class TabTestCase(SharedModuleStoreTestCase):
|
||||
tab = tab_class(tab_dict=dict_tab)
|
||||
|
||||
# name is as expected
|
||||
self.assertEqual(tab.name, expected_name)
|
||||
assert tab.name == expected_name
|
||||
|
||||
# link is as expected
|
||||
self.assertEqual(tab.link_func(self.course, self.reverse), expected_link)
|
||||
assert tab.link_func(self.course, self.reverse) == expected_link
|
||||
|
||||
# verify active page name
|
||||
self.assertEqual(tab.tab_id, expected_tab_id)
|
||||
assert tab.tab_id == expected_tab_id
|
||||
|
||||
# validate tab
|
||||
self.assertTrue(tab.validate(dict_tab))
|
||||
assert tab.validate(dict_tab)
|
||||
if invalid_dict_tab:
|
||||
with self.assertRaises(xmodule_tabs.InvalidTabsException):
|
||||
with pytest.raises(xmodule_tabs.InvalidTabsException):
|
||||
tab.validate(invalid_dict_tab)
|
||||
|
||||
# check get and set methods
|
||||
@@ -137,17 +137,20 @@ class TabTestCase(SharedModuleStoreTestCase):
|
||||
|
||||
def check_tab_equality(self, tab, dict_tab):
|
||||
"""Tests the equality methods on the given tab"""
|
||||
self.assertEqual(tab, dict_tab) # test __eq__
|
||||
assert tab == dict_tab
|
||||
# test __eq__
|
||||
ne_dict_tab = dict_tab
|
||||
ne_dict_tab['type'] = 'fake_type'
|
||||
self.assertNotEqual(tab, ne_dict_tab) # test __ne__: incorrect type
|
||||
self.assertNotEqual(tab, {'fake_key': 'fake_value'}) # test __ne__: missing type
|
||||
assert tab != ne_dict_tab
|
||||
# test __ne__: incorrect type
|
||||
assert tab != {'fake_key': 'fake_value'}
|
||||
# test __ne__: missing type
|
||||
|
||||
def check_tab_json_methods(self, tab):
|
||||
"""Tests the json from and to methods on the given tab"""
|
||||
serialized_tab = tab.to_json()
|
||||
deserialized_tab = tab.from_json(serialized_tab)
|
||||
self.assertEqual(serialized_tab, deserialized_tab)
|
||||
assert serialized_tab == deserialized_tab
|
||||
|
||||
def check_can_display_results(
|
||||
self,
|
||||
@@ -160,27 +163,27 @@ class TabTestCase(SharedModuleStoreTestCase):
|
||||
"""Checks can display results for various users"""
|
||||
if for_staff_only:
|
||||
user = self.create_mock_user(is_staff=True, is_enrolled=True)
|
||||
self.assertEqual(expected_value, self.is_tab_enabled(tab, self.course, user))
|
||||
assert expected_value == self.is_tab_enabled(tab, self.course, user)
|
||||
if for_authenticated_users_only:
|
||||
user = self.create_mock_user(is_staff=False, is_enrolled=False)
|
||||
self.assertEqual(expected_value, self.is_tab_enabled(tab, self.course, user))
|
||||
assert expected_value == self.is_tab_enabled(tab, self.course, user)
|
||||
if not for_staff_only and not for_authenticated_users_only and not for_enrolled_users_only:
|
||||
user = AnonymousUser()
|
||||
self.assertEqual(expected_value, self.is_tab_enabled(tab, self.course, user))
|
||||
assert expected_value == self.is_tab_enabled(tab, self.course, user)
|
||||
if for_enrolled_users_only:
|
||||
user = self.create_mock_user(is_staff=False, is_enrolled=True)
|
||||
self.assertEqual(expected_value, self.is_tab_enabled(tab, self.course, user))
|
||||
assert expected_value == self.is_tab_enabled(tab, self.course, user)
|
||||
|
||||
def check_get_and_set_methods(self, tab):
|
||||
"""Test __getitem__ and __setitem__ calls"""
|
||||
self.assertEqual(tab['type'], tab.type)
|
||||
self.assertEqual(tab['tab_id'], tab.tab_id)
|
||||
with self.assertRaises(KeyError):
|
||||
assert tab['type'] == tab.type
|
||||
assert tab['tab_id'] == tab.tab_id
|
||||
with pytest.raises(KeyError):
|
||||
_ = tab['invalid_key']
|
||||
|
||||
self.check_get_and_set_method_for_key(tab, 'name')
|
||||
self.check_get_and_set_method_for_key(tab, 'tab_id')
|
||||
with self.assertRaises(KeyError):
|
||||
with pytest.raises(KeyError):
|
||||
tab['invalid_key'] = 'New Value'
|
||||
|
||||
def check_get_and_set_method_for_key(self, tab, key):
|
||||
@@ -188,9 +191,9 @@ class TabTestCase(SharedModuleStoreTestCase):
|
||||
old_value = tab[key]
|
||||
new_value = 'New Value'
|
||||
tab[key] = new_value
|
||||
self.assertEqual(tab[key], new_value)
|
||||
assert tab[key] == new_value
|
||||
tab[key] = old_value
|
||||
self.assertEqual(tab[key], old_value)
|
||||
assert tab[key] == old_value
|
||||
|
||||
|
||||
class TextbooksTestCase(TabTestCase):
|
||||
@@ -227,10 +230,10 @@ class TextbooksTestCase(TabTestCase):
|
||||
type_to_reverse_name[book_type],
|
||||
args=[text_type(self.course.id), book_index]
|
||||
)
|
||||
self.assertEqual(tab.link_func(self.course, self.reverse), expected_link)
|
||||
self.assertTrue(tab.name.startswith('Book{0}'.format(book_index)))
|
||||
assert tab.link_func(self.course, self.reverse) == expected_link
|
||||
assert tab.name.startswith('Book{0}'.format(book_index))
|
||||
num_textbooks_found = num_textbooks_found + 1
|
||||
self.assertEqual(num_textbooks_found, self.num_textbooks)
|
||||
assert num_textbooks_found == self.num_textbooks
|
||||
|
||||
|
||||
class StaticTabDateTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase):
|
||||
@@ -264,7 +267,7 @@ class StaticTabDateTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase):
|
||||
self.setup_user()
|
||||
self.addCleanup(set_current_request, None)
|
||||
request = get_mock_request(self.user)
|
||||
with self.assertRaises(Http404):
|
||||
with pytest.raises(Http404):
|
||||
StaticCourseTabView().get(request, course_id='edX/toy', tab_slug='new_tab')
|
||||
|
||||
def test_get_static_tab_fragment(self):
|
||||
@@ -276,8 +279,8 @@ class StaticTabDateTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase):
|
||||
|
||||
# Test render works okay
|
||||
tab_content = get_static_tab_fragment(request, course, tab).content
|
||||
self.assertIn(text_type(self.course.id), tab_content)
|
||||
self.assertIn('static_tab', tab_content)
|
||||
assert text_type(self.course.id) in tab_content
|
||||
assert 'static_tab' in tab_content
|
||||
|
||||
# Test when render raises an exception
|
||||
with patch('lms.djangoapps.courseware.views.views.get_module') as mock_module_render:
|
||||
@@ -285,7 +288,7 @@ class StaticTabDateTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase):
|
||||
render=Mock(side_effect=Exception('Render failed!'))
|
||||
)
|
||||
static_tab_content = get_static_tab_fragment(request, course, tab).content
|
||||
self.assertIn("this module is temporarily unavailable", static_tab_content)
|
||||
assert 'this module is temporarily unavailable' in static_tab_content
|
||||
|
||||
|
||||
class StaticTabDateTestCaseXML(LoginEnrollmentTestCase, ModuleStoreTestCase):
|
||||
@@ -400,9 +403,9 @@ class EntranceExamsTabsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, Mi
|
||||
milestone
|
||||
)
|
||||
course_tab_list = get_course_tab_list(self.user, self.course)
|
||||
self.assertEqual(len(course_tab_list), 1)
|
||||
self.assertEqual(course_tab_list[0]['tab_id'], 'courseware')
|
||||
self.assertEqual(course_tab_list[0]['name'], 'Entrance Exam')
|
||||
assert len(course_tab_list) == 1
|
||||
assert course_tab_list[0]['tab_id'] == 'courseware'
|
||||
assert course_tab_list[0]['name'] == 'Entrance Exam'
|
||||
|
||||
def test_get_course_tabs_list_skipped_entrance_exam(self):
|
||||
"""
|
||||
@@ -419,13 +422,13 @@ class EntranceExamsTabsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, Mi
|
||||
response = self.client.post(url, {
|
||||
'unique_student_identifier': student.email,
|
||||
})
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
# log in again as student
|
||||
self.client.logout()
|
||||
self.login(self.email, self.password)
|
||||
course_tab_list = get_course_tab_list(self.user, self.course)
|
||||
self.assertEqual(len(course_tab_list), 4)
|
||||
assert len(course_tab_list) == 4
|
||||
|
||||
def test_course_tabs_list_for_staff_members(self):
|
||||
"""
|
||||
@@ -437,7 +440,7 @@ class EntranceExamsTabsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, Mi
|
||||
staff_user = StaffFactory(course_key=self.course.id)
|
||||
self.client.login(username=staff_user.username, password='test')
|
||||
course_tab_list = get_course_tab_list(staff_user, self.course)
|
||||
self.assertEqual(len(course_tab_list), 4)
|
||||
assert len(course_tab_list) == 4
|
||||
|
||||
|
||||
class TextBookCourseViewsTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase):
|
||||
@@ -488,14 +491,14 @@ class TextBookCourseViewsTestCase(LoginEnrollmentTestCase, SharedModuleStoreTest
|
||||
args=[text_type(self.course.id), book_index]
|
||||
)
|
||||
tab_link = tab.link_func(self.course, reverse)
|
||||
self.assertEqual(tab_link, expected_link)
|
||||
assert tab_link == expected_link
|
||||
num_of_textbooks_found += 1
|
||||
self.assertEqual(num_of_textbooks_found, self.num_textbooks)
|
||||
assert num_of_textbooks_found == self.num_textbooks
|
||||
|
||||
@patch.dict("django.conf.settings.FEATURES", {"ENABLE_TEXTBOOK": False})
|
||||
def test_textbooks_disabled(self):
|
||||
tab = xmodule_tabs.CourseTab.load('textbooks')
|
||||
self.assertFalse(tab.is_enabled(self.course, self.user))
|
||||
assert not tab.is_enabled(self.course, self.user)
|
||||
|
||||
|
||||
class TabListTestCase(TabTestCase):
|
||||
@@ -571,12 +574,12 @@ class ValidateTabsTestCase(TabListTestCase):
|
||||
def test_validate_tabs(self):
|
||||
tab_list = xmodule_tabs.CourseTabList()
|
||||
for invalid_tab_list in self.invalid_tabs:
|
||||
with self.assertRaises(xmodule_tabs.InvalidTabsException):
|
||||
with pytest.raises(xmodule_tabs.InvalidTabsException):
|
||||
tab_list.from_json(invalid_tab_list)
|
||||
|
||||
for valid_tab_list in self.valid_tabs:
|
||||
from_json_result = tab_list.from_json(valid_tab_list)
|
||||
self.assertEqual(len(from_json_result), len(valid_tab_list))
|
||||
assert len(from_json_result) == len(valid_tab_list)
|
||||
|
||||
def test_invalid_tab_type(self):
|
||||
"""
|
||||
@@ -584,14 +587,9 @@ class ValidateTabsTestCase(TabListTestCase):
|
||||
the tabs to be undisplayable.
|
||||
"""
|
||||
tab_list = xmodule_tabs.CourseTabList()
|
||||
self.assertEqual(
|
||||
len(tab_list.from_json([
|
||||
{'type': CoursewareTab.type},
|
||||
{'type': CourseInfoTab.type, 'name': 'fake_name'},
|
||||
{'type': 'no_such_type'}
|
||||
])),
|
||||
2
|
||||
)
|
||||
assert len(tab_list.from_json([{'type': CoursewareTab.type},
|
||||
{'type': CourseInfoTab.type, 'name': 'fake_name'},
|
||||
{'type': 'no_such_type'}])) == 2
|
||||
|
||||
|
||||
class CourseTabListTestCase(TabListTestCase):
|
||||
@@ -612,27 +610,27 @@ class CourseTabListTestCase(TabListTestCase):
|
||||
self.course.tabs = []
|
||||
self.course.syllabus_present = False
|
||||
xmodule_tabs.CourseTabList.initialize_default(self.course)
|
||||
self.assertFalse(self.has_tab(self.course.tabs, 'syllabus'))
|
||||
assert not self.has_tab(self.course.tabs, 'syllabus')
|
||||
|
||||
def test_initialize_default_with_syllabus(self):
|
||||
self.course.tabs = []
|
||||
self.course.syllabus_present = True
|
||||
xmodule_tabs.CourseTabList.initialize_default(self.course)
|
||||
self.assertTrue(self.has_tab(self.course.tabs, 'syllabus'))
|
||||
assert self.has_tab(self.course.tabs, 'syllabus')
|
||||
|
||||
def test_initialize_default_with_external_link(self):
|
||||
self.course.tabs = []
|
||||
self.course.discussion_link = "other_discussion_link"
|
||||
xmodule_tabs.CourseTabList.initialize_default(self.course)
|
||||
self.assertTrue(self.has_tab(self.course.tabs, 'external_discussion'))
|
||||
self.assertFalse(self.has_tab(self.course.tabs, 'discussion'))
|
||||
assert self.has_tab(self.course.tabs, 'external_discussion')
|
||||
assert not self.has_tab(self.course.tabs, 'discussion')
|
||||
|
||||
def test_initialize_default_without_external_link(self):
|
||||
self.course.tabs = []
|
||||
self.course.discussion_link = ""
|
||||
xmodule_tabs.CourseTabList.initialize_default(self.course)
|
||||
self.assertFalse(self.has_tab(self.course.tabs, 'external_discussion'))
|
||||
self.assertTrue(self.has_tab(self.course.tabs, 'discussion'))
|
||||
assert not self.has_tab(self.course.tabs, 'external_discussion')
|
||||
assert self.has_tab(self.course.tabs, 'discussion')
|
||||
|
||||
@patch.dict("django.conf.settings.FEATURES", {
|
||||
"ENABLE_TEXTBOOK": True,
|
||||
@@ -663,23 +661,19 @@ class CourseTabListTestCase(TabListTestCase):
|
||||
for i, tab in enumerate(xmodule_tabs.CourseTabList.iterate_displayable(self.course, user=user)):
|
||||
if getattr(tab, 'is_collection_item', False):
|
||||
# a collection item was found as a result of a collection tab
|
||||
self.assertTrue(getattr(self.course.tabs[i], 'is_collection', False))
|
||||
assert getattr(self.course.tabs[i], 'is_collection', False)
|
||||
else:
|
||||
# all other tabs must match the expected type
|
||||
self.assertEqual(tab.type, self.course.tabs[i].type)
|
||||
assert tab.type == self.course.tabs[i].type
|
||||
|
||||
# test including non-empty collections
|
||||
self.assertIn(
|
||||
{'type': 'html_textbooks'},
|
||||
list(xmodule_tabs.CourseTabList.iterate_displayable(self.course, inline_collections=False)),
|
||||
)
|
||||
assert {'type': 'html_textbooks'} in\
|
||||
list(xmodule_tabs.CourseTabList.iterate_displayable(self.course, inline_collections=False))
|
||||
|
||||
# test not including empty collections
|
||||
self.course.html_textbooks = []
|
||||
self.assertNotIn(
|
||||
{'type': 'html_textbooks'},
|
||||
list(xmodule_tabs.CourseTabList.iterate_displayable(self.course, inline_collections=False)),
|
||||
)
|
||||
assert {'type': 'html_textbooks'} not in\
|
||||
list(xmodule_tabs.CourseTabList.iterate_displayable(self.course, inline_collections=False))
|
||||
|
||||
def test_get_tab_by_methods(self):
|
||||
"""Tests the get_tab methods in CourseTabList"""
|
||||
@@ -687,10 +681,10 @@ class CourseTabListTestCase(TabListTestCase):
|
||||
for tab in self.course.tabs:
|
||||
|
||||
# get tab by type
|
||||
self.assertEqual(xmodule_tabs.CourseTabList.get_tab_by_type(self.course.tabs, tab.type), tab)
|
||||
assert xmodule_tabs.CourseTabList.get_tab_by_type(self.course.tabs, tab.type) == tab
|
||||
|
||||
# get tab by id
|
||||
self.assertEqual(xmodule_tabs.CourseTabList.get_tab_by_id(self.course.tabs, tab.tab_id), tab)
|
||||
assert xmodule_tabs.CourseTabList.get_tab_by_id(self.course.tabs, tab.tab_id) == tab
|
||||
|
||||
def test_course_tabs_staff_only(self):
|
||||
"""
|
||||
@@ -708,8 +702,8 @@ class CourseTabListTestCase(TabListTestCase):
|
||||
self.addCleanup(set_current_request, None)
|
||||
course_tab_list = get_course_tab_list(user, self.course)
|
||||
name_list = [x.name for x in course_tab_list]
|
||||
self.assertIn('Static Tab Free', name_list)
|
||||
self.assertNotIn('Static Tab Instructors Only', name_list)
|
||||
assert 'Static Tab Free' in name_list
|
||||
assert 'Static Tab Instructors Only' not in name_list
|
||||
|
||||
# Login as member of staff
|
||||
self.client.logout()
|
||||
@@ -717,8 +711,8 @@ class CourseTabListTestCase(TabListTestCase):
|
||||
self.client.login(username=staff_user.username, password='test')
|
||||
course_tab_list_staff = get_course_tab_list(staff_user, self.course)
|
||||
name_list_staff = [x.name for x in course_tab_list_staff]
|
||||
self.assertIn('Static Tab Free', name_list_staff)
|
||||
self.assertIn('Static Tab Instructors Only', name_list_staff)
|
||||
assert 'Static Tab Free' in name_list_staff
|
||||
assert 'Static Tab Instructors Only' in name_list_staff
|
||||
|
||||
|
||||
class ProgressTestCase(TabTestCase):
|
||||
@@ -783,13 +777,13 @@ class CourseInfoTabTestCase(TabTestCase):
|
||||
# a lower priority than courseware so seems odd that it would ever be first.
|
||||
# As such, I feel comfortable updating this test so it passes until it is removed
|
||||
# as part of the linked ticket
|
||||
self.assertEqual(tabs[1].type, 'course_info')
|
||||
assert tabs[1].type == 'course_info'
|
||||
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
def test_default_tab_for_new_course_experience(self):
|
||||
# Verify that the unified course experience hides the course info tab
|
||||
tabs = get_course_tab_list(self.user, self.course)
|
||||
self.assertEqual(tabs[0].type, 'courseware')
|
||||
assert tabs[0].type == 'courseware'
|
||||
|
||||
# TODO: LEARNER-611 - remove once course_info is removed.
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@@ -797,7 +791,7 @@ class CourseInfoTabTestCase(TabTestCase):
|
||||
tabs = xmodule_tabs.CourseTabList.iterate_displayable(self.course, self.user)
|
||||
for i, tab in enumerate(tabs):
|
||||
if i == 0:
|
||||
self.assertEqual(tab.type, 'course_info')
|
||||
assert tab.type == 'course_info'
|
||||
|
||||
|
||||
class DiscussionLinkTestCase(TabTestCase):
|
||||
@@ -836,14 +830,9 @@ class DiscussionLinkTestCase(TabTestCase):
|
||||
user = self.create_mock_user(is_staff=is_staff, is_enrolled=is_enrolled)
|
||||
with patch('common.djangoapps.student.models.CourseEnrollment.is_enrolled') as check_is_enrolled:
|
||||
check_is_enrolled.return_value = is_enrolled
|
||||
self.assertEqual(
|
||||
(
|
||||
discussion_tab is not None and
|
||||
self.is_tab_enabled(discussion_tab, self.course, user) and
|
||||
(discussion_tab.link_func(self.course, self._reverse(self.course)) == expected_discussion_link)
|
||||
),
|
||||
expected_can_display_value
|
||||
)
|
||||
assert ((discussion_tab is not None) and self.is_tab_enabled(discussion_tab, self.course, user) and
|
||||
(discussion_tab.link_func(self.course, self._reverse(self.course))
|
||||
== expected_discussion_link)) == expected_can_display_value
|
||||
|
||||
@patch.dict("django.conf.settings.FEATURES", {"ENABLE_DISCUSSION_SERVICE": False})
|
||||
def test_explicit_discussion_link(self):
|
||||
@@ -917,14 +906,14 @@ class DatesTabTestCase(TabListTestCase):
|
||||
|
||||
is_enrolled.return_value = False
|
||||
unenrolled_user = self.create_mock_user(is_staff=False, is_enrolled=False)
|
||||
self.assertFalse(self.is_tab_enabled(tab, self.course, unenrolled_user))
|
||||
assert not self.is_tab_enabled(tab, self.course, unenrolled_user)
|
||||
|
||||
staff_user = self.create_mock_user(is_staff=True, is_enrolled=False)
|
||||
self.assertTrue(self.is_tab_enabled(tab, self.course, staff_user))
|
||||
assert self.is_tab_enabled(tab, self.course, staff_user)
|
||||
|
||||
is_enrolled.return_value = True
|
||||
enrolled_user = self.create_mock_user(is_staff=False, is_enrolled=True)
|
||||
self.assertTrue(self.is_tab_enabled(tab, self.course, enrolled_user))
|
||||
assert self.is_tab_enabled(tab, self.course, enrolled_user)
|
||||
|
||||
@patch('lms.djangoapps.courseware.tabs.RELATIVE_DATES_FLAG')
|
||||
def test_singular_dates_tab(self, mock_flag):
|
||||
@@ -939,7 +928,7 @@ class DatesTabTestCase(TabListTestCase):
|
||||
for tab in self.course.tabs:
|
||||
if tab.type == 'dates':
|
||||
has_dates_tab = True
|
||||
self.assertTrue(has_dates_tab)
|
||||
assert has_dates_tab
|
||||
|
||||
# Verify that there is only 1 'dates' tab in the returned result from get_course_tab_list()
|
||||
tabs = get_course_tab_list(user, self.course)
|
||||
@@ -947,4 +936,4 @@ class DatesTabTestCase(TabListTestCase):
|
||||
for tab in tabs:
|
||||
if tab.type == 'dates':
|
||||
num_dates_tabs += 1
|
||||
self.assertEqual(num_dates_tabs, 1)
|
||||
assert num_dates_tabs == 1
|
||||
|
||||
@@ -7,7 +7,7 @@ import os
|
||||
import tempfile
|
||||
import textwrap
|
||||
from datetime import timedelta
|
||||
|
||||
import pytest
|
||||
import ddt
|
||||
import freezegun
|
||||
import six
|
||||
@@ -168,25 +168,25 @@ class TestVideo(BaseTestVideoXBlock):
|
||||
}
|
||||
|
||||
status_codes = {response.status_code for response in responses.values()}
|
||||
self.assertEqual(status_codes.pop(), 404)
|
||||
assert status_codes.pop() == 404
|
||||
|
||||
def test_handle_ajax_for_speed_with_nan(self):
|
||||
self.item_descriptor.handle_ajax('save_user_state', {'speed': json.dumps(1.0)})
|
||||
self.assertEqual(self.item_descriptor.speed, 1.0)
|
||||
self.assertEqual(self.item_descriptor.global_speed, 1.0)
|
||||
assert self.item_descriptor.speed == 1.0
|
||||
assert self.item_descriptor.global_speed == 1.0
|
||||
|
||||
# try to set NaN value for speed.
|
||||
response = self.item_descriptor.handle_ajax(
|
||||
'save_user_state', {'speed': json.dumps(float('NaN'))}
|
||||
)
|
||||
|
||||
self.assertFalse(json.loads(response)['success'])
|
||||
assert not json.loads(response)['success']
|
||||
expected_error = u"Invalid speed value nan, must be a float."
|
||||
self.assertEqual(json.loads(response)['error'], expected_error)
|
||||
assert json.loads(response)['error'] == expected_error
|
||||
|
||||
# verify that the speed and global speed are still 1.0
|
||||
self.assertEqual(self.item_descriptor.speed, 1.0)
|
||||
self.assertEqual(self.item_descriptor.global_speed, 1.0)
|
||||
assert self.item_descriptor.speed == 1.0
|
||||
assert self.item_descriptor.global_speed == 1.0
|
||||
|
||||
def test_handle_ajax(self):
|
||||
|
||||
@@ -203,32 +203,32 @@ class TestVideo(BaseTestVideoXBlock):
|
||||
self.get_url('save_user_state'),
|
||||
sample,
|
||||
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
self.assertEqual(self.item_descriptor.speed, None)
|
||||
assert self.item_descriptor.speed is None
|
||||
self.item_descriptor.handle_ajax('save_user_state', {'speed': json.dumps(2.0)})
|
||||
self.assertEqual(self.item_descriptor.speed, 2.0)
|
||||
self.assertEqual(self.item_descriptor.global_speed, 2.0)
|
||||
assert self.item_descriptor.speed == 2.0
|
||||
assert self.item_descriptor.global_speed == 2.0
|
||||
|
||||
self.assertEqual(self.item_descriptor.saved_video_position, timedelta(0))
|
||||
assert self.item_descriptor.saved_video_position == timedelta(0)
|
||||
self.item_descriptor.handle_ajax('save_user_state', {'saved_video_position': "00:00:10"})
|
||||
self.assertEqual(self.item_descriptor.saved_video_position, timedelta(0, 10))
|
||||
assert self.item_descriptor.saved_video_position == timedelta(0, 10)
|
||||
|
||||
self.assertEqual(self.item_descriptor.transcript_language, 'en')
|
||||
assert self.item_descriptor.transcript_language == 'en'
|
||||
self.item_descriptor.handle_ajax('save_user_state', {'transcript_language': "uk"})
|
||||
self.assertEqual(self.item_descriptor.transcript_language, 'uk')
|
||||
assert self.item_descriptor.transcript_language == 'uk'
|
||||
|
||||
self.assertEqual(self.item_descriptor.bumper_do_not_show_again, False)
|
||||
assert self.item_descriptor.bumper_do_not_show_again is False
|
||||
self.item_descriptor.handle_ajax('save_user_state', {'bumper_do_not_show_again': True})
|
||||
self.assertEqual(self.item_descriptor.bumper_do_not_show_again, True)
|
||||
assert self.item_descriptor.bumper_do_not_show_again is True
|
||||
|
||||
with freezegun.freeze_time(now()):
|
||||
self.assertEqual(self.item_descriptor.bumper_last_view_date, None)
|
||||
assert self.item_descriptor.bumper_last_view_date is None
|
||||
self.item_descriptor.handle_ajax('save_user_state', {'bumper_last_view_date': True})
|
||||
self.assertEqual(self.item_descriptor.bumper_last_view_date, now())
|
||||
assert self.item_descriptor.bumper_last_view_date == now()
|
||||
|
||||
response = self.item_descriptor.handle_ajax('save_user_state', {u'demoo<EFBFBD>': "sample"})
|
||||
self.assertEqual(json.loads(response)['success'], True)
|
||||
assert json.loads(response)['success'] is True
|
||||
|
||||
def get_handler_url(self, handler, suffix):
|
||||
"""
|
||||
@@ -278,14 +278,14 @@ class TestTranscriptAvailableTranslationsDispatch(TestVideo): # lint-amnesty, p
|
||||
|
||||
request = Request.blank('/available_translations')
|
||||
response = self.item.transcript(request=request, dispatch='available_translations')
|
||||
self.assertEqual(json.loads(response.body.decode('utf-8')), ['en'])
|
||||
assert json.loads(response.body.decode('utf-8')) == ['en']
|
||||
|
||||
def test_available_translation_non_en(self):
|
||||
_upload_file(_create_srt_file(), self.item_descriptor.location, os.path.split(self.srt_file.name)[1])
|
||||
|
||||
request = Request.blank('/available_translations')
|
||||
response = self.item.transcript(request=request, dispatch='available_translations')
|
||||
self.assertEqual(json.loads(response.body.decode('utf-8')), ['uk'])
|
||||
assert json.loads(response.body.decode('utf-8')) == ['uk']
|
||||
|
||||
@patch('xmodule.video_module.transcripts_utils.get_video_transcript_content')
|
||||
def test_multiple_available_translations(self, mock_get_video_transcript_content):
|
||||
@@ -311,7 +311,7 @@ class TestTranscriptAvailableTranslationsDispatch(TestVideo): # lint-amnesty, p
|
||||
|
||||
request = Request.blank('/available_translations')
|
||||
response = self.item.transcript(request=request, dispatch='available_translations')
|
||||
self.assertEqual(sorted(json.loads(response.body.decode('utf-8'))), sorted(['en', 'uk']))
|
||||
assert sorted(json.loads(response.body.decode('utf-8'))) == sorted(['en', 'uk'])
|
||||
|
||||
@patch('xmodule.video_module.transcripts_utils.get_video_transcript_content')
|
||||
@patch('xmodule.video_module.transcripts_utils.get_available_transcript_languages')
|
||||
@@ -398,7 +398,7 @@ class TestTranscriptAvailableTranslationsDispatch(TestVideo): # lint-amnesty, p
|
||||
mock_get_available_transcript_languages.return_value = ['en', 'de', 'ro']
|
||||
request = Request.blank('/available_translations')
|
||||
response = self.item.transcript(request=request, dispatch='available_translations')
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -438,7 +438,7 @@ class TestTranscriptAvailableTranslationsBumperDispatch(TestVideo): # lint-amne
|
||||
|
||||
request = Request.blank('/' + self.dispatch)
|
||||
response = self.item.transcript(request=request, dispatch=self.dispatch)
|
||||
self.assertEqual(json.loads(response.body.decode('utf-8')), [lang])
|
||||
assert json.loads(response.body.decode('utf-8')) == [lang]
|
||||
|
||||
@patch('xmodule.video_module.transcripts_utils.get_available_transcript_languages')
|
||||
def test_multiple_available_translations(self, mock_get_transcript_languages):
|
||||
@@ -463,7 +463,7 @@ class TestTranscriptAvailableTranslationsBumperDispatch(TestVideo): # lint-amne
|
||||
request = Request.blank('/' + self.dispatch)
|
||||
response = self.item.transcript(request=request, dispatch=self.dispatch)
|
||||
# Assert that bumper only get its own translations.
|
||||
self.assertEqual(sorted(json.loads(response.body.decode('utf-8'))), sorted(['en', 'uk']))
|
||||
assert sorted(json.loads(response.body.decode('utf-8'))) == sorted(['en', 'uk'])
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -497,7 +497,7 @@ class TestTranscriptDownloadDispatch(TestVideo): # lint-amnesty, pylint: disabl
|
||||
def test_download_transcript_not_exist(self):
|
||||
request = Request.blank('/download')
|
||||
response = self.item.transcript(request=request, dispatch='download')
|
||||
self.assertEqual(response.status, '404 Not Found')
|
||||
assert response.status == '404 Not Found'
|
||||
|
||||
@patch(
|
||||
'xmodule.video_module.video_handlers.get_transcript',
|
||||
@@ -506,9 +506,9 @@ class TestTranscriptDownloadDispatch(TestVideo): # lint-amnesty, pylint: disabl
|
||||
def test_download_srt_exist(self, __):
|
||||
request = Request.blank('/download')
|
||||
response = self.item.transcript(request=request, dispatch='download')
|
||||
self.assertEqual(response.body.decode('utf-8'), 'Subs!')
|
||||
self.assertEqual(response.headers['Content-Type'], 'application/x-subrip; charset=utf-8')
|
||||
self.assertEqual(response.headers['Content-Language'], 'en')
|
||||
assert response.body.decode('utf-8') == 'Subs!'
|
||||
assert response.headers['Content-Type'] == 'application/x-subrip; charset=utf-8'
|
||||
assert response.headers['Content-Language'] == 'en'
|
||||
|
||||
@patch(
|
||||
'xmodule.video_module.video_handlers.get_transcript',
|
||||
@@ -518,15 +518,15 @@ class TestTranscriptDownloadDispatch(TestVideo): # lint-amnesty, pylint: disabl
|
||||
self.item.transcript_format = 'txt'
|
||||
request = Request.blank('/download')
|
||||
response = self.item.transcript(request=request, dispatch='download')
|
||||
self.assertEqual(response.body.decode('utf-8'), 'Subs!')
|
||||
self.assertEqual(response.headers['Content-Type'], 'text/plain; charset=utf-8')
|
||||
self.assertEqual(response.headers['Content-Language'], 'en')
|
||||
assert response.body.decode('utf-8') == 'Subs!'
|
||||
assert response.headers['Content-Type'] == 'text/plain; charset=utf-8'
|
||||
assert response.headers['Content-Language'] == 'en'
|
||||
|
||||
def test_download_en_no_sub(self):
|
||||
request = Request.blank('/download')
|
||||
response = self.item.transcript(request=request, dispatch='download')
|
||||
self.assertEqual(response.status, '404 Not Found')
|
||||
with self.assertRaises(NotFoundError):
|
||||
assert response.status == '404 Not Found'
|
||||
with pytest.raises(NotFoundError):
|
||||
get_transcript(self.item)
|
||||
|
||||
@patch(
|
||||
@@ -536,9 +536,9 @@ class TestTranscriptDownloadDispatch(TestVideo): # lint-amnesty, pylint: disabl
|
||||
def test_download_non_en_non_ascii_filename(self, __):
|
||||
request = Request.blank('/download')
|
||||
response = self.item.transcript(request=request, dispatch='download')
|
||||
self.assertEqual(response.body.decode('utf-8'), 'Subs!')
|
||||
self.assertEqual(response.headers['Content-Type'], 'application/x-subrip; charset=utf-8')
|
||||
self.assertEqual(response.headers['Content-Disposition'], 'attachment; filename="en_塞.srt"')
|
||||
assert response.body.decode('utf-8') == 'Subs!'
|
||||
assert response.headers['Content-Type'] == 'application/x-subrip; charset=utf-8'
|
||||
assert response.headers['Content-Disposition'] == 'attachment; filename="en_塞.srt"'
|
||||
|
||||
@patch('xmodule.video_module.transcripts_utils.edxval_api.get_video_transcript_data')
|
||||
@patch('xmodule.video_module.get_transcript', Mock(side_effect=NotFoundError))
|
||||
@@ -568,10 +568,10 @@ class TestTranscriptDownloadDispatch(TestVideo): # lint-amnesty, pylint: disabl
|
||||
}
|
||||
|
||||
# Assert the actual response
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.text, expected_content)
|
||||
assert response.status_code == 200
|
||||
assert response.text == expected_content
|
||||
for attribute, value in six.iteritems(expected_headers):
|
||||
self.assertEqual(response.headers[attribute], value)
|
||||
assert response.headers[attribute] == value
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -623,7 +623,7 @@ class TestTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, pylint:
|
||||
def test_translation_fails(self, url, dispatch, status_code):
|
||||
request = Request.blank(url)
|
||||
response = self.item.transcript(request=request, dispatch=dispatch)
|
||||
self.assertEqual(response.status, status_code)
|
||||
assert response.status == status_code
|
||||
|
||||
@ddt.data(
|
||||
('translation/en?videoId={}', 'translation/en', attach_sub),
|
||||
@@ -734,27 +734,21 @@ class TestTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, pylint:
|
||||
# Test youtube style en
|
||||
request = Request.blank('/translation/en?videoId=12345')
|
||||
response = self.item.transcript(request=request, dispatch='translation/en')
|
||||
self.assertEqual(response.status, '307 Temporary Redirect')
|
||||
self.assertIn(
|
||||
('Location', '/static/dummy/static/subs_12345.srt.sjson'),
|
||||
response.headerlist
|
||||
)
|
||||
assert response.status == '307 Temporary Redirect'
|
||||
assert ('Location', '/static/dummy/static/subs_12345.srt.sjson') in response.headerlist
|
||||
|
||||
# Test HTML5 video style
|
||||
self.item.sub = 'OEoXaMPEzfM'
|
||||
request = Request.blank('/translation/en')
|
||||
response = self.item.transcript(request=request, dispatch='translation/en')
|
||||
self.assertEqual(response.status, '307 Temporary Redirect')
|
||||
self.assertIn(
|
||||
('Location', '/static/dummy/static/subs_OEoXaMPEzfM.srt.sjson'),
|
||||
response.headerlist
|
||||
)
|
||||
assert response.status == '307 Temporary Redirect'
|
||||
assert ('Location', '/static/dummy/static/subs_OEoXaMPEzfM.srt.sjson') in response.headerlist
|
||||
|
||||
# Test different language to ensure we are just ignoring it since we can't
|
||||
# translate with static fallback
|
||||
request = Request.blank('/translation/uk')
|
||||
response = self.item.transcript(request=request, dispatch='translation/uk')
|
||||
self.assertEqual(response.status, '404 Not Found')
|
||||
assert response.status == '404 Not Found'
|
||||
|
||||
@ddt.data(
|
||||
# Test youtube style en
|
||||
@@ -782,12 +776,9 @@ class TestTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, pylint:
|
||||
attach(self.item, sub)
|
||||
request = Request.blank(url)
|
||||
response = self.item.transcript(request=request, dispatch=dispatch)
|
||||
self.assertEqual(response.status, status_code)
|
||||
assert response.status == status_code
|
||||
if sub:
|
||||
self.assertIn(
|
||||
('Location', '/static/dummy/static/subs_{}.srt.sjson'.format(sub)),
|
||||
response.headerlist
|
||||
)
|
||||
assert ('Location', '/static/dummy/static/subs_{}.srt.sjson'.format(sub)) in response.headerlist
|
||||
|
||||
@patch('xmodule.video_module.VideoBlock.course_id', return_value='not_a_course_locator')
|
||||
def test_translation_static_non_course(self, __):
|
||||
@@ -800,7 +791,7 @@ class TestTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, pylint:
|
||||
# When course_id is not mocked out, these values would result in 307, as tested above.
|
||||
request = Request.blank('/translation/en?videoId=12345')
|
||||
response = self.item.transcript(request=request, dispatch='translation/en')
|
||||
self.assertEqual(response.status, '404 Not Found')
|
||||
assert response.status == '404 Not Found'
|
||||
|
||||
def _set_static_asset_path(self):
|
||||
""" Helper method for setting up the static_asset_path information """
|
||||
@@ -838,10 +829,10 @@ class TestTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, pylint:
|
||||
}
|
||||
|
||||
# Assert the actual response
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.text, transcript['content'])
|
||||
assert response.status_code == 200
|
||||
assert response.text == transcript['content']
|
||||
for attribute, value in six.iteritems(expected_headers):
|
||||
self.assertEqual(response.headers[attribute], value)
|
||||
assert response.headers[attribute] == value
|
||||
|
||||
@patch('xmodule.video_module.VideoBlock.translation', Mock(side_effect=NotFoundError))
|
||||
@patch('xmodule.video_module.VideoBlock.get_static_transcript', Mock(return_value=Response(status=404)))
|
||||
@@ -852,7 +843,7 @@ class TestTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, pylint:
|
||||
# Make request to XModule transcript handler
|
||||
response = self.item.transcript(request=Request.blank('/translation/en'), dispatch='translation/en')
|
||||
# Assert the actual response
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
class TestStudioTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, pylint: disable=test-inherits-tests
|
||||
@@ -879,13 +870,13 @@ class TestStudioTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, py
|
||||
# No language
|
||||
request = Request.blank("")
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch="translation")
|
||||
self.assertEqual(response.status, "400 Bad Request")
|
||||
assert response.status == '400 Bad Request'
|
||||
|
||||
# No language_code param in request.GET
|
||||
request = Request.blank("")
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch="translation")
|
||||
self.assertEqual(response.status, "400 Bad Request")
|
||||
self.assertEqual(response.json["error"], "Language is required.")
|
||||
assert response.status == '400 Bad Request'
|
||||
assert response.json['error'] == 'Language is required.'
|
||||
|
||||
# Correct case:
|
||||
filename = os.path.split(self.srt_file.name)[1]
|
||||
@@ -893,13 +884,10 @@ class TestStudioTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, py
|
||||
request = Request.blank(u"translation?language_code=uk")
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch="translation?language_code=uk")
|
||||
self.srt_file.seek(0)
|
||||
self.assertEqual(response.body, self.srt_file.read())
|
||||
self.assertEqual(response.headers["Content-Type"], "application/x-subrip; charset=utf-8")
|
||||
self.assertEqual(
|
||||
response.headers["Content-Disposition"],
|
||||
u'attachment; filename="uk_{}"'.format(filename)
|
||||
)
|
||||
self.assertEqual(response.headers["Content-Language"], "uk")
|
||||
assert response.body == self.srt_file.read()
|
||||
assert response.headers['Content-Type'] == 'application/x-subrip; charset=utf-8'
|
||||
assert response.headers['Content-Disposition'] == u'attachment; filename="uk_{}"'.format(filename)
|
||||
assert response.headers['Content-Language'] == 'uk'
|
||||
|
||||
# Non ascii file name download:
|
||||
self.srt_file.seek(0)
|
||||
@@ -907,10 +895,10 @@ class TestStudioTranscriptTranslationGetDispatch(TestVideo): # lint-amnesty, py
|
||||
request = Request.blank("translation?language_code=zh")
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch="translation?language_code=zh")
|
||||
self.srt_file.seek(0)
|
||||
self.assertEqual(response.body, self.srt_file.read())
|
||||
self.assertEqual(response.headers["Content-Type"], "application/x-subrip; charset=utf-8")
|
||||
self.assertEqual(response.headers["Content-Disposition"], 'attachment; filename="zh_塞.srt"')
|
||||
self.assertEqual(response.headers["Content-Language"], "zh")
|
||||
assert response.body == self.srt_file.read()
|
||||
assert response.headers['Content-Type'] == 'application/x-subrip; charset=utf-8'
|
||||
assert response.headers['Content-Disposition'] == 'attachment; filename="zh_塞.srt"'
|
||||
assert response.headers['Content-Language'] == 'zh'
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -959,7 +947,7 @@ class TestStudioTranscriptTranslationPostDispatch(TestVideo): # lint-amnesty, p
|
||||
self.item_descriptor.available_translations = lambda transcripts, verify_assets: ['ur']
|
||||
request = Request.blank('/translation', POST=post_data)
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch='translation')
|
||||
self.assertEqual(response.json["error"], error_message)
|
||||
assert response.json['error'] == error_message
|
||||
|
||||
@ddt.data(
|
||||
{
|
||||
@@ -993,11 +981,11 @@ class TestStudioTranscriptTranslationPostDispatch(TestVideo): # lint-amnesty, p
|
||||
|
||||
request = Request.blank('/translation', POST=post_data)
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch='translation')
|
||||
self.assertEqual(response.status, '201 Created')
|
||||
assert response.status == '201 Created'
|
||||
response = json.loads(response.text)
|
||||
self.assertTrue(response["language_code"], "uk")
|
||||
assert response['language_code'], 'uk'
|
||||
self.assertDictEqual(self.item_descriptor.transcripts, {})
|
||||
self.assertTrue(edxval_api.get_video_transcript_data(video_id=response["edx_video_id"], language_code="uk"))
|
||||
assert edxval_api.get_video_transcript_data(video_id=response['edx_video_id'], language_code='uk')
|
||||
|
||||
def test_studio_transcript_post_bad_content(self):
|
||||
"""
|
||||
@@ -1012,11 +1000,8 @@ class TestStudioTranscriptTranslationPostDispatch(TestVideo): # lint-amnesty, p
|
||||
|
||||
request = Request.blank("/translation", POST=post_data)
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch="translation")
|
||||
self.assertEqual(response.status_code, 400)
|
||||
self.assertEqual(
|
||||
response.json["error"],
|
||||
"There is a problem with this transcript file. Try to upload a different file."
|
||||
)
|
||||
assert response.status_code == 400
|
||||
assert response.json['error'] == 'There is a problem with this transcript file. Try to upload a different file.'
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -1048,7 +1033,7 @@ class TestStudioTranscriptTranslationDeleteDispatch(TestVideo): # lint-amnesty,
|
||||
"""
|
||||
request = Request(self.REQUEST_META, body=json.dumps(params).encode('utf-8'))
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch='translation')
|
||||
self.assertEqual(response.status_code, 400)
|
||||
assert response.status_code == 400
|
||||
|
||||
def test_translation_delete_w_edx_video_id(self):
|
||||
"""
|
||||
@@ -1071,15 +1056,15 @@ class TestStudioTranscriptTranslationDeleteDispatch(TestVideo): # lint-amnesty,
|
||||
)
|
||||
|
||||
# verify that a video transcript exists for expected data
|
||||
self.assertTrue(api.get_video_transcript_data(video_id=self.EDX_VIDEO_ID, language_code=self.LANGUAGE_CODE_UK))
|
||||
assert api.get_video_transcript_data(video_id=self.EDX_VIDEO_ID, language_code=self.LANGUAGE_CODE_UK)
|
||||
|
||||
request = Request(self.REQUEST_META, body=request_body.encode('utf-8'))
|
||||
self.item_descriptor.edx_video_id = self.EDX_VIDEO_ID
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch='translation')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
# verify that a video transcript dose not exist for expected data
|
||||
self.assertFalse(api.get_video_transcript_data(video_id=self.EDX_VIDEO_ID, language_code=self.LANGUAGE_CODE_UK))
|
||||
assert not api.get_video_transcript_data(video_id=self.EDX_VIDEO_ID, language_code=self.LANGUAGE_CODE_UK)
|
||||
|
||||
def test_translation_delete_wo_edx_video_id(self):
|
||||
"""
|
||||
@@ -1091,19 +1076,19 @@ class TestStudioTranscriptTranslationDeleteDispatch(TestVideo): # lint-amnesty,
|
||||
|
||||
# upload and verify that srt file exists in assets
|
||||
_upload_file(self.SRT_FILE, self.item_descriptor.location, srt_file_name_uk)
|
||||
self.assertTrue(_check_asset(self.item_descriptor.location, srt_file_name_uk))
|
||||
assert _check_asset(self.item_descriptor.location, srt_file_name_uk)
|
||||
|
||||
# verify transcripts field
|
||||
self.assertNotEqual(self.item_descriptor.transcripts, {})
|
||||
self.assertTrue(self.LANGUAGE_CODE_UK in self.item_descriptor.transcripts) # lint-amnesty, pylint: disable=wrong-assert-type
|
||||
assert self.item_descriptor.transcripts != {}
|
||||
assert self.LANGUAGE_CODE_UK in self.item_descriptor.transcripts
|
||||
|
||||
# make request and verify response
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch='translation')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
# verify that srt file is deleted
|
||||
self.assertEqual(self.item_descriptor.transcripts, {})
|
||||
self.assertFalse(_check_asset(self.item_descriptor.location, srt_file_name_uk))
|
||||
assert self.item_descriptor.transcripts == {}
|
||||
assert not _check_asset(self.item_descriptor.location, srt_file_name_uk)
|
||||
|
||||
def test_translation_delete_w_english_lang(self):
|
||||
"""
|
||||
@@ -1116,15 +1101,15 @@ class TestStudioTranscriptTranslationDeleteDispatch(TestVideo): # lint-amnesty,
|
||||
|
||||
# upload and verify that srt file exists in assets
|
||||
_upload_file(self.SRT_FILE, self.item_descriptor.location, srt_file_name_en)
|
||||
self.assertTrue(_check_asset(self.item_descriptor.location, srt_file_name_en))
|
||||
assert _check_asset(self.item_descriptor.location, srt_file_name_en)
|
||||
|
||||
# make request and verify response
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch='translation')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
# verify that srt file is deleted
|
||||
self.assertTrue(self.LANGUAGE_CODE_EN not in self.item_descriptor.transcripts) # lint-amnesty, pylint: disable=wrong-assert-type
|
||||
self.assertFalse(_check_asset(self.item_descriptor.location, srt_file_name_en))
|
||||
assert self.LANGUAGE_CODE_EN not in self.item_descriptor.transcripts
|
||||
assert not _check_asset(self.item_descriptor.location, srt_file_name_en)
|
||||
|
||||
def test_translation_delete_w_sub(self):
|
||||
"""
|
||||
@@ -1135,19 +1120,21 @@ class TestStudioTranscriptTranslationDeleteDispatch(TestVideo): # lint-amnesty,
|
||||
request = Request(self.REQUEST_META, body=request_body.encode('utf-8'))
|
||||
|
||||
# sub should not be empy
|
||||
self.assertFalse(self.item_descriptor.sub == u'') # lint-amnesty, pylint: disable=wrong-assert-type
|
||||
assert not self.item_descriptor.sub == u''
|
||||
# lint-amnesty, pylint: disable=wrong-assert-type
|
||||
|
||||
# upload and verify that srt file exists in assets
|
||||
_upload_file(self.SRT_FILE, self.item_descriptor.location, sub_file_name)
|
||||
self.assertTrue(_check_asset(self.item_descriptor.location, sub_file_name))
|
||||
assert _check_asset(self.item_descriptor.location, sub_file_name)
|
||||
|
||||
# make request and verify response
|
||||
response = self.item_descriptor.studio_transcript(request=request, dispatch='translation')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
# verify that sub is empty and transcript is deleted also
|
||||
self.assertTrue(self.item_descriptor.sub == u'') # lint-amnesty, pylint: disable=wrong-assert-type
|
||||
self.assertFalse(_check_asset(self.item_descriptor.location, sub_file_name))
|
||||
assert self.item_descriptor.sub == u''
|
||||
# lint-amnesty, pylint: disable=wrong-assert-type
|
||||
assert not _check_asset(self.item_descriptor.location, sub_file_name)
|
||||
|
||||
|
||||
class TestGetTranscript(TestVideo): # lint-amnesty, pylint: disable=test-inherits-tests
|
||||
@@ -1213,9 +1200,9 @@ class TestGetTranscript(TestVideo): # lint-amnesty, pylint: disable=test-inheri
|
||||
|
||||
""")
|
||||
|
||||
self.assertEqual(text, expected_text)
|
||||
self.assertEqual(filename[:-4], 'en_' + self.item.sub)
|
||||
self.assertEqual(mime_type, 'application/x-subrip; charset=utf-8')
|
||||
assert text == expected_text
|
||||
assert filename[:(- 4)] == ('en_' + self.item.sub)
|
||||
assert mime_type == 'application/x-subrip; charset=utf-8'
|
||||
|
||||
def test_good_txt_transcript(self):
|
||||
good_sjson = _create_file(content=textwrap.dedent("""\
|
||||
@@ -1242,21 +1229,21 @@ class TestGetTranscript(TestVideo): # lint-amnesty, pylint: disable=test-inheri
|
||||
Hi, welcome to Edx.
|
||||
Let's start with what is on your screen right now.""")
|
||||
|
||||
self.assertEqual(text, expected_text)
|
||||
self.assertEqual(filename, 'en_' + self.item.sub + '.txt')
|
||||
self.assertEqual(mime_type, 'text/plain; charset=utf-8')
|
||||
assert text == expected_text
|
||||
assert filename == (('en_' + self.item.sub) + '.txt')
|
||||
assert mime_type == 'text/plain; charset=utf-8'
|
||||
|
||||
def test_en_with_empty_sub(self):
|
||||
|
||||
self.item.sub = ""
|
||||
self.item.transcripts = None
|
||||
# no self.sub, self.youttube_1_0 exist, but no file in assets
|
||||
with self.assertRaises(NotFoundError):
|
||||
with pytest.raises(NotFoundError):
|
||||
get_transcript(self.item)
|
||||
|
||||
# no self.sub and no self.youtube_1_0, no non-en transcritps
|
||||
self.item.youtube_id_1_0 = None
|
||||
with self.assertRaises(NotFoundError):
|
||||
with pytest.raises(NotFoundError):
|
||||
get_transcript(self.item)
|
||||
|
||||
# no self.sub but youtube_1_0 exists with file in assets
|
||||
@@ -1291,9 +1278,9 @@ class TestGetTranscript(TestVideo): # lint-amnesty, pylint: disable=test-inheri
|
||||
|
||||
""")
|
||||
|
||||
self.assertEqual(text, expected_text)
|
||||
self.assertEqual(filename, 'en_' + self.item.youtube_id_1_0 + '.srt')
|
||||
self.assertEqual(mime_type, 'application/x-subrip; charset=utf-8')
|
||||
assert text == expected_text
|
||||
assert filename == (('en_' + self.item.youtube_id_1_0) + '.srt')
|
||||
assert mime_type == 'application/x-subrip; charset=utf-8'
|
||||
|
||||
def test_non_en_with_non_ascii_filename(self):
|
||||
self.item.transcript_language = 'zh'
|
||||
@@ -1307,9 +1294,9 @@ class TestGetTranscript(TestVideo): # lint-amnesty, pylint: disable=test-inheri
|
||||
00:00:00,12 --> 00:00:00,100
|
||||
Привіт, edX вітає вас.
|
||||
""")
|
||||
self.assertEqual(text, expected_text)
|
||||
self.assertEqual(filename, u"zh_塞.srt")
|
||||
self.assertEqual(mime_type, 'application/x-subrip; charset=utf-8')
|
||||
assert text == expected_text
|
||||
assert filename == u'zh_塞.srt'
|
||||
assert mime_type == 'application/x-subrip; charset=utf-8'
|
||||
|
||||
def test_value_error(self):
|
||||
good_sjson = _create_file(content='bad content')
|
||||
@@ -1318,7 +1305,7 @@ class TestGetTranscript(TestVideo): # lint-amnesty, pylint: disable=test-inheri
|
||||
self.item.sub = _get_subs_id(good_sjson.name)
|
||||
|
||||
transcripts = self.item.get_transcripts_info() # lint-amnesty, pylint: disable=unused-variable
|
||||
with self.assertRaises(ValueError):
|
||||
with pytest.raises(ValueError):
|
||||
get_transcript(self.item)
|
||||
|
||||
def test_key_error(self):
|
||||
@@ -1339,5 +1326,5 @@ class TestGetTranscript(TestVideo): # lint-amnesty, pylint: disable=test-inheri
|
||||
self.item.sub = _get_subs_id(good_sjson.name)
|
||||
|
||||
transcripts = self.item.get_transcripts_info() # lint-amnesty, pylint: disable=unused-variable
|
||||
with self.assertRaises(KeyError):
|
||||
with pytest.raises(KeyError):
|
||||
get_transcript(self.item)
|
||||
|
||||
@@ -10,7 +10,7 @@ import shutil
|
||||
from collections import OrderedDict
|
||||
from tempfile import mkdtemp
|
||||
from uuid import uuid4
|
||||
|
||||
import pytest
|
||||
import ddt
|
||||
import six
|
||||
from django.conf import settings
|
||||
@@ -133,12 +133,9 @@ class TestVideoYouTube(TestVideo): # lint-amnesty, pylint: disable=missing-clas
|
||||
'poster': 'null',
|
||||
}
|
||||
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(context),
|
||||
get_context_dict_from_string(
|
||||
self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
)
|
||||
)
|
||||
assert get_context_dict_from_string(context) ==\
|
||||
get_context_dict_from_string(self.item_descriptor.xmodule_runtime.render_template('video.html',
|
||||
expected_context))
|
||||
|
||||
|
||||
class TestVideoNonYouTube(TestVideo): # pylint: disable=test-inherits-tests
|
||||
@@ -220,12 +217,9 @@ class TestVideoNonYouTube(TestVideo): # pylint: disable=test-inherits-tests
|
||||
expected_result = get_context_dict_from_string(
|
||||
self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
)
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(context),
|
||||
expected_result
|
||||
)
|
||||
self.assertEqual(expected_result['download_video_link'], 'example.mp4')
|
||||
self.assertEqual(expected_result['display_name'], 'A Name')
|
||||
assert get_context_dict_from_string(context) == expected_result
|
||||
assert expected_result['download_video_link'] == 'example.mp4'
|
||||
assert expected_result['display_name'] == 'A Name'
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -392,12 +386,9 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
'metadata': json.dumps(metadata)
|
||||
})
|
||||
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(context),
|
||||
get_context_dict_from_string(
|
||||
self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
)
|
||||
)
|
||||
assert get_context_dict_from_string(context) ==\
|
||||
get_context_dict_from_string(self.item_descriptor.xmodule_runtime.render_template('video.html',
|
||||
expected_context))
|
||||
|
||||
def test_get_html_source(self):
|
||||
# lint-amnesty, pylint: disable=invalid-name, redefined-outer-name
|
||||
@@ -503,12 +494,9 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
'metadata': json.dumps(expected_context['metadata'])
|
||||
})
|
||||
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(context),
|
||||
get_context_dict_from_string(
|
||||
self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
)
|
||||
)
|
||||
assert get_context_dict_from_string(context) ==\
|
||||
get_context_dict_from_string(self.item_descriptor.xmodule_runtime.render_template('video.html',
|
||||
expected_context))
|
||||
|
||||
def test_get_html_with_non_existent_edx_video_id(self):
|
||||
"""
|
||||
@@ -550,7 +538,7 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
|
||||
# Referencing a non-existent VAL ID in courseware won't cause an error --
|
||||
# it'll just fall back to the values in the VideoBlock.
|
||||
self.assertIn("example.mp4", self.item_descriptor.render(STUDENT_VIEW).content)
|
||||
assert 'example.mp4' in self.item_descriptor.render(STUDENT_VIEW).content
|
||||
|
||||
def test_get_html_with_mocked_edx_video_id(self):
|
||||
# lint-amnesty, pylint: disable=invalid-name, redefined-outer-name
|
||||
@@ -646,12 +634,9 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
'metadata': json.dumps(expected_context['metadata'])
|
||||
})
|
||||
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(context),
|
||||
get_context_dict_from_string(
|
||||
self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
)
|
||||
)
|
||||
assert get_context_dict_from_string(context) ==\
|
||||
get_context_dict_from_string(self.item_descriptor.xmodule_runtime.render_template('video.html',
|
||||
expected_context))
|
||||
|
||||
def test_get_html_with_existing_edx_video_id(self):
|
||||
"""
|
||||
@@ -677,12 +662,9 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
# context returned by get_html when provided with above data
|
||||
# expected_context, a dict to assert with context
|
||||
context, expected_context = self.helper_get_html_with_edx_video_id(data)
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(context),
|
||||
get_context_dict_from_string(
|
||||
self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
)
|
||||
)
|
||||
assert get_context_dict_from_string(context) ==\
|
||||
get_context_dict_from_string(self.item_descriptor.xmodule_runtime.render_template('video.html',
|
||||
expected_context))
|
||||
|
||||
def test_get_html_with_existing_unstripped_edx_video_id(self):
|
||||
"""
|
||||
@@ -711,12 +693,9 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
# expected_context, a dict to assert with context
|
||||
context, expected_context = self.helper_get_html_with_edx_video_id(data)
|
||||
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(context),
|
||||
get_context_dict_from_string(
|
||||
self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
)
|
||||
)
|
||||
assert get_context_dict_from_string(context) ==\
|
||||
get_context_dict_from_string(self.item_descriptor.xmodule_runtime.render_template('video.html',
|
||||
expected_context))
|
||||
|
||||
def encode_and_create_video(self, edx_video_id):
|
||||
"""
|
||||
@@ -742,7 +721,7 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
encoded_videos=encoded_videos,
|
||||
)
|
||||
)
|
||||
self.assertEqual(result, edx_video_id)
|
||||
assert result == edx_video_id
|
||||
return encoded_videos
|
||||
|
||||
def helper_get_html_with_edx_video_id(self, data):
|
||||
@@ -923,12 +902,9 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
'metadata': json.dumps(expected_context['metadata'])
|
||||
})
|
||||
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(context),
|
||||
get_context_dict_from_string(
|
||||
self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
)
|
||||
)
|
||||
assert get_context_dict_from_string(context) ==\
|
||||
get_context_dict_from_string(self.item_descriptor.xmodule_runtime.render_template('video.html',
|
||||
expected_context))
|
||||
|
||||
# pylint: disable=invalid-name
|
||||
def test_get_html_cdn_source_external_video(self):
|
||||
@@ -1028,12 +1004,9 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
'metadata': json.dumps(expected_context['metadata'])
|
||||
})
|
||||
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(context),
|
||||
get_context_dict_from_string(
|
||||
self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
)
|
||||
)
|
||||
assert get_context_dict_from_string(context) ==\
|
||||
get_context_dict_from_string(self.item_descriptor.xmodule_runtime.render_template('video.html',
|
||||
expected_context))
|
||||
|
||||
@ddt.data(
|
||||
(True, ['youtube', 'desktop_webm', 'desktop_mp4', 'hls']),
|
||||
@@ -1082,12 +1055,10 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
self.initialize_block(data=video_xml)
|
||||
context = self.item_descriptor.render(STUDENT_VIEW).content
|
||||
|
||||
self.assertIn("'download_video_link': 'https://mp4.com/dm.mp4'", context)
|
||||
self.assertIn('"streams": "1.00:https://yt.com/?v=v0TFmdO4ZP0"', context)
|
||||
self.assertEqual(
|
||||
sorted(["https://webm.com/dw.webm", "https://mp4.com/dm.mp4", "https://hls.com/hls.m3u8"]),
|
||||
sorted(get_context_dict_from_string(context)['metadata']['sources'])
|
||||
)
|
||||
assert "'download_video_link': 'https://mp4.com/dm.mp4'" in context
|
||||
assert '"streams": "1.00:https://yt.com/?v=v0TFmdO4ZP0"' in context
|
||||
assert sorted(['https://webm.com/dw.webm', 'https://mp4.com/dm.mp4', 'https://hls.com/hls.m3u8']) ==\
|
||||
sorted(get_context_dict_from_string(context)['metadata']['sources'])
|
||||
|
||||
def test_get_html_hls_no_video_id(self):
|
||||
"""
|
||||
@@ -1101,7 +1072,7 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
|
||||
self.initialize_block(data=video_xml)
|
||||
context = self.item_descriptor.render(STUDENT_VIEW).content
|
||||
self.assertIn("'download_video_link': None", context)
|
||||
assert "'download_video_link': None" in context
|
||||
|
||||
def test_html_student_public_view(self):
|
||||
"""
|
||||
@@ -1115,9 +1086,9 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
|
||||
self.initialize_block(data=video_xml)
|
||||
context = self.item_descriptor.render(STUDENT_VIEW).content
|
||||
self.assertIn('"saveStateEnabled": true', context)
|
||||
assert '"saveStateEnabled": true' in context
|
||||
context = self.item_descriptor.render(PUBLIC_VIEW).content
|
||||
self.assertIn('"saveStateEnabled": false', context)
|
||||
assert '"saveStateEnabled": false' in context
|
||||
|
||||
@patch('xmodule.video_module.video_module.edxval_api.get_course_video_image_url')
|
||||
def test_poster_image(self, get_course_video_image_url):
|
||||
@@ -1130,7 +1101,7 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
self.initialize_block(data=video_xml)
|
||||
context = self.item_descriptor.render(STUDENT_VIEW).content
|
||||
|
||||
self.assertIn('"poster": "/media/video-images/poster.png"', context)
|
||||
assert '"poster": "/media/video-images/poster.png"' in context
|
||||
|
||||
@patch('xmodule.video_module.video_module.edxval_api.get_course_video_image_url')
|
||||
def test_poster_image_without_edx_video_id(self, get_course_video_image_url):
|
||||
@@ -1143,7 +1114,7 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
self.initialize_block(data=video_xml)
|
||||
context = self.item_descriptor.render(STUDENT_VIEW).content
|
||||
|
||||
self.assertIn("\'poster\': \'null\'", context)
|
||||
assert "'poster': 'null'" in context
|
||||
|
||||
@patch('xmodule.video_module.video_module.HLSPlaybackEnabledFlag.feature_enabled', Mock(return_value=False))
|
||||
def test_hls_primary_playback_on_toggling_hls_feature(self):
|
||||
@@ -1153,7 +1124,7 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
video_xml = '<video display_name="Video" download_video="true" edx_video_id="12345-67890">[]</video>'
|
||||
self.initialize_block(data=video_xml)
|
||||
context = self.item_descriptor.render(STUDENT_VIEW).content
|
||||
self.assertIn('"prioritizeHls": false', context)
|
||||
assert '"prioritizeHls": false' in context
|
||||
|
||||
@ddt.data(
|
||||
{
|
||||
@@ -1208,7 +1179,7 @@ class TestGetHtmlMethod(BaseTestVideoXBlock):
|
||||
with override_flag(DEPRECATE_YOUTUBE_FLAG.name, active=data['waffle_enabled']):
|
||||
self.initialize_block(data=video_xml, metadata=metadata)
|
||||
context = self.item_descriptor.render(STUDENT_VIEW).content
|
||||
self.assertIn(u'"prioritizeHls": {}'.format(data['result']), context)
|
||||
assert u'"prioritizeHls": {}'.format(data['result']) in context
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -1272,7 +1243,7 @@ class TestVideoBlockInitialization(BaseTestVideoXBlock):
|
||||
data='<video display_name="Video" download_video="true" edx_video_id="12345-67890">[]</video>'
|
||||
)
|
||||
context = self.item_descriptor.get_context()
|
||||
self.assertEqual(context['transcripts_basic_tab_metadata']['video_url']['value'], video_url)
|
||||
assert context['transcripts_basic_tab_metadata']['video_url']['value'] == video_url
|
||||
|
||||
@ddt.data(
|
||||
(
|
||||
@@ -1310,7 +1281,7 @@ class TestVideoBlockInitialization(BaseTestVideoXBlock):
|
||||
data='<video display_name="Video" youtube_id_1_0="" download_video="true" edx_video_id="12345-67890">[]</video>'
|
||||
)
|
||||
context = self.item_descriptor.get_context()
|
||||
self.assertEqual(context['transcripts_basic_tab_metadata']['video_url']['value'], video_url)
|
||||
assert context['transcripts_basic_tab_metadata']['video_url']['value'] == video_url
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -1348,12 +1319,12 @@ class TestEditorSavedMethod(BaseTestVideoXBlock):
|
||||
save_to_store(myfile.read(), self.file_name, 'text/sjson', item.location)
|
||||
item.sub = "3_yD_cEKoCk"
|
||||
# subs_video.srt.sjson does not exist before calling editor_saved function
|
||||
with self.assertRaises(NotFoundError):
|
||||
with pytest.raises(NotFoundError):
|
||||
Transcript.get_asset(item.location, 'subs_video.srt.sjson')
|
||||
old_metadata = own_metadata(item)
|
||||
# calling editor_saved will generate new file subs_video.srt.sjson for html5_sources
|
||||
item.editor_saved(self.user, old_metadata, None)
|
||||
self.assertIsInstance(Transcript.get_asset(item.location, 'subs_3_yD_cEKoCk.srt.sjson'), StaticContent)
|
||||
assert isinstance(Transcript.get_asset(item.location, 'subs_3_yD_cEKoCk.srt.sjson'), StaticContent)
|
||||
|
||||
@ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
|
||||
def test_editor_saved_when_youtube_and_html5_subs_exist(self, default_store):
|
||||
@@ -1369,12 +1340,12 @@ class TestEditorSavedMethod(BaseTestVideoXBlock):
|
||||
save_to_store(myfile.read(), 'subs_video.srt.sjson', 'text/sjson', item.location)
|
||||
item.sub = "3_yD_cEKoCk"
|
||||
# subs_3_yD_cEKoCk.srt.sjson and subs_video.srt.sjson already exist
|
||||
self.assertIsInstance(Transcript.get_asset(item.location, self.file_name), StaticContent)
|
||||
self.assertIsInstance(Transcript.get_asset(item.location, 'subs_video.srt.sjson'), StaticContent)
|
||||
assert isinstance(Transcript.get_asset(item.location, self.file_name), StaticContent)
|
||||
assert isinstance(Transcript.get_asset(item.location, 'subs_video.srt.sjson'), StaticContent)
|
||||
old_metadata = own_metadata(item)
|
||||
with patch('xmodule.video_module.video_module.manage_video_subtitles_save') as manage_video_subtitles_save:
|
||||
item.editor_saved(self.user, old_metadata, None)
|
||||
self.assertFalse(manage_video_subtitles_save.called)
|
||||
assert not manage_video_subtitles_save.called
|
||||
|
||||
@ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
|
||||
def test_editor_saved_with_unstripped_video_id(self, default_store):
|
||||
@@ -1389,13 +1360,13 @@ class TestEditorSavedMethod(BaseTestVideoXBlock):
|
||||
})
|
||||
self.initialize_block(metadata=self.metadata)
|
||||
item = self.store.get_item(self.item_descriptor.location)
|
||||
self.assertEqual(item.edx_video_id, unstripped_video_id)
|
||||
assert item.edx_video_id == unstripped_video_id
|
||||
|
||||
# Now, modifying and saving the video module should strip the video id.
|
||||
old_metadata = own_metadata(item)
|
||||
item.display_name = u'New display name'
|
||||
item.editor_saved(self.user, old_metadata, None)
|
||||
self.assertEqual(item.edx_video_id, stripped_video_id)
|
||||
assert item.edx_video_id == stripped_video_id
|
||||
|
||||
@ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
|
||||
@patch('xmodule.video_module.video_module.edxval_api.get_url_for_profile', Mock(return_value='test_yt_id'))
|
||||
@@ -1407,13 +1378,13 @@ class TestEditorSavedMethod(BaseTestVideoXBlock):
|
||||
self.MODULESTORE = MODULESTORES[default_store]
|
||||
self.initialize_block(metadata=self.metadata)
|
||||
item = self.store.get_item(self.item_descriptor.location)
|
||||
self.assertEqual(item.youtube_id_1_0, '3_yD_cEKoCk')
|
||||
assert item.youtube_id_1_0 == '3_yD_cEKoCk'
|
||||
|
||||
# Now, modify `edx_video_id` and save should override `youtube_id_1_0`.
|
||||
old_metadata = own_metadata(item)
|
||||
item.edx_video_id = six.text_type(uuid4())
|
||||
item.editor_saved(self.user, old_metadata, None)
|
||||
self.assertEqual(item.youtube_id_1_0, 'test_yt_id')
|
||||
assert item.youtube_id_1_0 == 'test_yt_id'
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -1657,10 +1628,8 @@ class VideoBlockTest(TestCase, VideoBlockTestBase):
|
||||
self.assertListEqual(rendered_context['tabs'], correct_tabs)
|
||||
|
||||
# Assert that the Video ID field is present in basic tab metadata context.
|
||||
self.assertEqual(
|
||||
rendered_context['transcripts_basic_tab_metadata']['edx_video_id'],
|
||||
self.descriptor.editable_metadata_fields['edx_video_id']
|
||||
)
|
||||
assert rendered_context['transcripts_basic_tab_metadata']['edx_video_id'] ==\
|
||||
self.descriptor.editable_metadata_fields['edx_video_id']
|
||||
|
||||
def test_export_val_data_with_internal(self):
|
||||
"""
|
||||
@@ -1718,13 +1687,13 @@ class VideoBlockTest(TestCase, VideoBlockTestBase):
|
||||
self.assertXmlEqual(expected, actual)
|
||||
|
||||
# Verify transcript file is created.
|
||||
self.assertEqual([transcript_file_name], self.file_system.listdir(EXPORT_IMPORT_STATIC_DIR))
|
||||
assert [transcript_file_name] == self.file_system.listdir(EXPORT_IMPORT_STATIC_DIR)
|
||||
|
||||
# Also verify the content of created transcript file.
|
||||
expected_transcript_content = File(io.open(expected_transcript_path)).read()
|
||||
transcript = get_video_transcript_data(video_id=self.descriptor.edx_video_id, language_code=language_code)
|
||||
|
||||
self.assertEqual(transcript['content'].decode('utf-8'), expected_transcript_content)
|
||||
assert transcript['content'].decode('utf-8') == expected_transcript_content
|
||||
|
||||
@ddt.data(
|
||||
(['en', 'da'], 'test_sub', ''),
|
||||
@@ -1765,7 +1734,7 @@ class VideoBlockTest(TestCase, VideoBlockTestBase):
|
||||
video_xml = self.descriptor.definition_to_xml(resource_fs=self.file_system)
|
||||
|
||||
# Assert `sub` and `transcripts` attribute in the xml
|
||||
self.assertEqual(video_xml.get('sub'), expected_sub)
|
||||
assert video_xml.get('sub') == expected_sub
|
||||
|
||||
expected_transcripts = {
|
||||
language: "{edx_video_id}-{language}.srt".format(
|
||||
@@ -1785,7 +1754,7 @@ class VideoBlockTest(TestCase, VideoBlockTestBase):
|
||||
expected_transcript_content = File(io.open(expected_transcript_path)).read()
|
||||
transcript = get_video_transcript_data(video_id=self.descriptor.edx_video_id, language_code=language)
|
||||
|
||||
self.assertEqual(transcript['content'].decode('utf-8'), expected_transcript_content)
|
||||
assert transcript['content'].decode('utf-8') == expected_transcript_content
|
||||
|
||||
def test_export_val_data_not_found(self):
|
||||
"""
|
||||
@@ -1874,16 +1843,16 @@ class VideoBlockTest(TestCase, VideoBlockTestBase):
|
||||
id_generator.target_course_id = "test_course_id"
|
||||
video = self.descriptor.from_xml(xml_data, module_system, id_generator)
|
||||
|
||||
self.assertEqual(video.edx_video_id, 'test_edx_video_id')
|
||||
assert video.edx_video_id == 'test_edx_video_id'
|
||||
video_data = get_video_info(video.edx_video_id)
|
||||
self.assertEqual(video_data['client_video_id'], 'test_client_video_id')
|
||||
self.assertEqual(video_data['duration'], 111.0)
|
||||
self.assertEqual(video_data['status'], 'imported')
|
||||
self.assertEqual(video_data['courses'], [{id_generator.target_course_id: None}])
|
||||
self.assertEqual(video_data['encoded_videos'][0]['profile'], 'mobile')
|
||||
self.assertEqual(video_data['encoded_videos'][0]['url'], 'http://example.com/video')
|
||||
self.assertEqual(video_data['encoded_videos'][0]['file_size'], 222)
|
||||
self.assertEqual(video_data['encoded_videos'][0]['bitrate'], 333)
|
||||
assert video_data['client_video_id'] == 'test_client_video_id'
|
||||
assert video_data['duration'] == 111.0
|
||||
assert video_data['status'] == 'imported'
|
||||
assert video_data['courses'] == [{id_generator.target_course_id: None}]
|
||||
assert video_data['encoded_videos'][0]['profile'] == 'mobile'
|
||||
assert video_data['encoded_videos'][0]['url'] == 'http://example.com/video'
|
||||
assert video_data['encoded_videos'][0]['file_size'] == 222
|
||||
assert video_data['encoded_videos'][0]['bitrate'] == 333
|
||||
|
||||
# Verify that VAL transcript is imported.
|
||||
self.assertDictContainsSubset(
|
||||
@@ -1922,17 +1891,17 @@ class VideoBlockTest(TestCase, VideoBlockTestBase):
|
||||
id_generator = Mock()
|
||||
|
||||
# Verify edx_video_id is empty before.
|
||||
self.assertEqual(self.descriptor.edx_video_id, u'')
|
||||
assert self.descriptor.edx_video_id == u''
|
||||
|
||||
video = self.descriptor.from_xml(xml_data, module_system, id_generator)
|
||||
|
||||
# Verify edx_video_id is populated after the import.
|
||||
self.assertNotEqual(video.edx_video_id, u'')
|
||||
assert video.edx_video_id != u''
|
||||
|
||||
video_data = get_video_info(video.edx_video_id)
|
||||
self.assertEqual(video_data['client_video_id'], 'External Video')
|
||||
self.assertEqual(video_data['duration'], 0.0)
|
||||
self.assertEqual(video_data['status'], 'external')
|
||||
assert video_data['client_video_id'] == 'External Video'
|
||||
assert video_data['duration'] == 0.0
|
||||
assert video_data['status'] == 'external'
|
||||
|
||||
def test_import_val_transcript(self):
|
||||
"""
|
||||
@@ -1969,15 +1938,15 @@ class VideoBlockTest(TestCase, VideoBlockTestBase):
|
||||
)
|
||||
|
||||
# Verify edx_video_id is empty before.
|
||||
self.assertEqual(self.descriptor.edx_video_id, u'')
|
||||
assert self.descriptor.edx_video_id == u''
|
||||
|
||||
video = self.descriptor.from_xml(xml_data, module_system, id_generator)
|
||||
|
||||
# Verify edx_video_id is populated after the import.
|
||||
self.assertNotEqual(video.edx_video_id, u'')
|
||||
assert video.edx_video_id != u''
|
||||
|
||||
video_data = get_video_info(video.edx_video_id)
|
||||
self.assertEqual(video_data['status'], 'external')
|
||||
assert video_data['status'] == 'external'
|
||||
|
||||
# Verify that VAL transcript is imported.
|
||||
self.assertDictContainsSubset(
|
||||
@@ -2110,15 +2079,15 @@ class VideoBlockTest(TestCase, VideoBlockTestBase):
|
||||
xml_data += '</video_asset></video>'
|
||||
|
||||
# Verify edx_video_id is empty before import.
|
||||
self.assertEqual(self.descriptor.edx_video_id, u'')
|
||||
assert self.descriptor.edx_video_id == u''
|
||||
|
||||
video = self.descriptor.from_xml(xml_data, module_system, id_generator)
|
||||
|
||||
# Verify edx_video_id is not empty after import.
|
||||
self.assertNotEqual(video.edx_video_id, u'')
|
||||
assert video.edx_video_id != u''
|
||||
|
||||
video_data = get_video_info(video.edx_video_id)
|
||||
self.assertEqual(video_data['status'], 'external')
|
||||
assert video_data['status'] == 'external'
|
||||
|
||||
# Verify that correct transcripts are imported.
|
||||
self.assertDictContainsSubset(
|
||||
@@ -2138,9 +2107,9 @@ class VideoBlockTest(TestCase, VideoBlockTestBase):
|
||||
</video_asset>
|
||||
</video>
|
||||
"""
|
||||
with self.assertRaises(ValCannotCreateError):
|
||||
with pytest.raises(ValCannotCreateError):
|
||||
VideoBlock.from_xml(xml_data, module_system, id_generator=Mock())
|
||||
with self.assertRaises(ValVideoNotFoundError):
|
||||
with pytest.raises(ValVideoNotFoundError):
|
||||
get_video_info("test_edx_video_id")
|
||||
|
||||
|
||||
@@ -2170,12 +2139,12 @@ class TestVideoWithBumper(TestVideo): # pylint: disable=test-inherits-tests
|
||||
"transcripts": {},
|
||||
}
|
||||
with override_settings(FEATURES=self.FEATURES):
|
||||
self.assertTrue(bumper_utils.is_bumper_enabled(self.item_descriptor))
|
||||
assert bumper_utils.is_bumper_enabled(self.item_descriptor)
|
||||
|
||||
self.FEATURES.update({"ENABLE_VIDEO_BUMPER": False})
|
||||
|
||||
with override_settings(FEATURES=self.FEATURES):
|
||||
self.assertFalse(bumper_utils.is_bumper_enabled(self.item_descriptor))
|
||||
assert not bumper_utils.is_bumper_enabled(self.item_descriptor)
|
||||
|
||||
@patch('xmodule.video_module.bumper_utils.is_bumper_enabled')
|
||||
@patch('xmodule.video_module.bumper_utils.get_bumper_settings')
|
||||
@@ -2269,9 +2238,7 @@ class TestVideoWithBumper(TestVideo): # pylint: disable=test-inherits-tests
|
||||
}
|
||||
|
||||
expected_content = self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
self.assertEqual(
|
||||
get_context_dict_from_string(content), get_context_dict_from_string(expected_content)
|
||||
)
|
||||
assert get_context_dict_from_string(content) == get_context_dict_from_string(expected_content)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -2364,7 +2331,7 @@ class TestAutoAdvanceVideo(TestVideo): # lint-amnesty, pylint: disable=test-inh
|
||||
with override_settings(FEATURES=self.FEATURES):
|
||||
expected_content = self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context)
|
||||
|
||||
self.assertEqual(get_context_dict_from_string(content), get_context_dict_from_string(expected_content))
|
||||
assert get_context_dict_from_string(content) == get_context_dict_from_string(expected_content)
|
||||
|
||||
def change_course_setting_autoadvance(self, new_value):
|
||||
"""
|
||||
|
||||
@@ -45,10 +45,7 @@ class VideoBlockLogicTest(TestCase):
|
||||
"""Test parsing old-style Youtube ID strings into a dict."""
|
||||
youtube_str = '0.75:jNCf2gIqpeE,1.00:ZwkTiUPN0mg,1.25:rsq9auxASqI,1.50:kMyNdzVHHgg'
|
||||
output = VideoBlock._parse_youtube(youtube_str)
|
||||
self.assertEqual(output, {'0.75': 'jNCf2gIqpeE',
|
||||
'1.00': 'ZwkTiUPN0mg',
|
||||
'1.25': 'rsq9auxASqI',
|
||||
'1.50': 'kMyNdzVHHgg'})
|
||||
assert output == {'0.75': 'jNCf2gIqpeE', '1.00': 'ZwkTiUPN0mg', '1.25': 'rsq9auxASqI', '1.50': 'kMyNdzVHHgg'}
|
||||
|
||||
def test_parse_youtube_one_video(self):
|
||||
"""
|
||||
@@ -57,10 +54,7 @@ class VideoBlockLogicTest(TestCase):
|
||||
"""
|
||||
youtube_str = '0.75:jNCf2gIqpeE'
|
||||
output = VideoBlock._parse_youtube(youtube_str)
|
||||
self.assertEqual(output, {'0.75': 'jNCf2gIqpeE',
|
||||
'1.00': '',
|
||||
'1.25': '',
|
||||
'1.50': ''})
|
||||
assert output == {'0.75': 'jNCf2gIqpeE', '1.00': '', '1.25': '', '1.50': ''}
|
||||
|
||||
def test_parse_youtube_key_format(self):
|
||||
"""
|
||||
@@ -68,18 +62,11 @@ class VideoBlockLogicTest(TestCase):
|
||||
"""
|
||||
youtube_str = '1.00:p2Q6BrNhdh8'
|
||||
youtube_str_hack = '1.0:p2Q6BrNhdh8'
|
||||
self.assertEqual(
|
||||
VideoBlock._parse_youtube(youtube_str),
|
||||
VideoBlock._parse_youtube(youtube_str_hack)
|
||||
)
|
||||
assert VideoBlock._parse_youtube(youtube_str) == VideoBlock._parse_youtube(youtube_str_hack)
|
||||
|
||||
def test_parse_youtube_empty(self):
|
||||
"""
|
||||
Some courses have empty youtube attributes, so we should handle
|
||||
that well.
|
||||
"""
|
||||
self.assertEqual(VideoBlock._parse_youtube(''),
|
||||
{'0.75': '',
|
||||
'1.00': '',
|
||||
'1.25': '',
|
||||
'1.50': ''})
|
||||
assert VideoBlock._parse_youtube('') == {'0.75': '', '1.00': '', '1.25': '', '1.50': ''}
|
||||
|
||||
@@ -321,8 +321,8 @@ class TestViewAuth(EnterpriseTestConsentRequired, ModuleStoreTestCase, LoginEnro
|
||||
self.course = self.update_course(self.course, self.user.id)
|
||||
self.test_course = self.update_course(self.test_course, self.user.id)
|
||||
|
||||
self.assertFalse(self.course.has_started())
|
||||
self.assertFalse(self.test_course.has_started())
|
||||
assert not self.course.has_started()
|
||||
assert not self.test_course.has_started()
|
||||
|
||||
# First, try with an enrolled student
|
||||
self.login(self.enrolled_user)
|
||||
@@ -400,18 +400,18 @@ class TestViewAuth(EnterpriseTestConsentRequired, ModuleStoreTestCase, LoginEnro
|
||||
|
||||
# First, try with an enrolled student
|
||||
self.login(self.unenrolled_user)
|
||||
self.assertFalse(self.enroll(self.course))
|
||||
self.assertTrue(self.enroll(self.test_course))
|
||||
assert not self.enroll(self.course)
|
||||
assert self.enroll(self.test_course)
|
||||
|
||||
# Then, try as an instructor
|
||||
self.logout()
|
||||
self.login(self.instructor_user)
|
||||
self.assertTrue(self.enroll(self.course))
|
||||
assert self.enroll(self.course)
|
||||
|
||||
# Then, try as global staff
|
||||
self.logout()
|
||||
self.login(self.global_staff_user)
|
||||
self.assertTrue(self.enroll(self.course))
|
||||
assert self.enroll(self.course)
|
||||
|
||||
|
||||
class TestBetatesterAccess(ModuleStoreTestCase, CourseAccessTestMixin):
|
||||
@@ -436,7 +436,7 @@ class TestBetatesterAccess(ModuleStoreTestCase, CourseAccessTestMixin):
|
||||
"""
|
||||
Check that beta-test access works for courses.
|
||||
"""
|
||||
self.assertFalse(self.course.has_started()) # lint-amnesty, pylint: disable=no-member
|
||||
assert not self.course.has_started() # lint-amnesty, pylint: disable=no-member
|
||||
self.assertCannotAccessCourse(self.normal_student, 'load', self.course)
|
||||
self.assertCanAccessCourse(self.beta_tester, 'load', self.course)
|
||||
|
||||
@@ -446,7 +446,7 @@ class TestBetatesterAccess(ModuleStoreTestCase, CourseAccessTestMixin):
|
||||
Check that beta-test access works for content.
|
||||
"""
|
||||
# student user shouldn't see it
|
||||
self.assertFalse(has_access(self.normal_student, 'load', self.content, self.course.id)) # lint-amnesty, pylint: disable=no-member
|
||||
assert not has_access(self.normal_student, 'load', self.content, self.course.id) # lint-amnesty, pylint: disable=no-member, line-too-long
|
||||
|
||||
# now the student should see it
|
||||
self.assertTrue(has_access(self.beta_tester, 'load', self.content, self.course.id)) # lint-amnesty, pylint: disable=no-member
|
||||
assert has_access(self.beta_tester, 'load', self.content, self.course.id) # lint-amnesty, pylint: disable=no-member, line-too-long
|
||||
|
||||
@@ -132,7 +132,7 @@ class TestJumpTo(ModuleStoreTestCase):
|
||||
# can't use the reverse calls from the CMS
|
||||
jumpto_url = '{0}/{1}/jump_to/{2}'.format('/courses', six.text_type(self.course_key), six.text_type(location))
|
||||
response = self.client.get(jumpto_url)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
def test_jumpto_from_section(self):
|
||||
course = CourseFactory.create()
|
||||
@@ -223,7 +223,7 @@ class TestJumpTo(ModuleStoreTestCase):
|
||||
six.text_type(self.course_key),
|
||||
six.text_type(location))
|
||||
response = self.client.get(jumpto_url)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
@ddt.data(
|
||||
(False, '1'),
|
||||
@@ -258,7 +258,7 @@ class TestJumpTo(ModuleStoreTestCase):
|
||||
)
|
||||
expected_url += "?{}".format(urlencode({'activate_block_id': six.text_type(staff_only_vertical.location)}))
|
||||
|
||||
self.assertEqual(expected_url, get_redirect_url(course_key, usage_key, request))
|
||||
assert expected_url == get_redirect_url(course_key, usage_key, request)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -301,7 +301,7 @@ class IndexQueryTestCase(ModuleStoreTestCase):
|
||||
}
|
||||
)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
class BaseViewsTestCase(ModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
|
||||
@@ -361,7 +361,7 @@ class BaseViewsTestCase(ModuleStoreTestCase): # lint-amnesty, pylint: disable=m
|
||||
self.org = u"ꜱᴛᴀʀᴋ ɪɴᴅᴜꜱᴛʀɪᴇꜱ"
|
||||
self.org_html = "<p>'+Stark/Industries+'</p>"
|
||||
|
||||
self.assertTrue(self.client.login(username=self.user.username, password=TEST_PASSWORD))
|
||||
assert self.client.login(username=self.user.username, password=TEST_PASSWORD)
|
||||
|
||||
# refresh the course from the modulestore so that it has children
|
||||
self.course = modulestore().get_course(self.course.id)
|
||||
@@ -371,7 +371,7 @@ class BaseViewsTestCase(ModuleStoreTestCase): # lint-amnesty, pylint: disable=m
|
||||
Create global staff user and log them in
|
||||
"""
|
||||
self.global_staff = GlobalStaffFactory.create() # pylint: disable=attribute-defined-outside-init
|
||||
self.assertTrue(self.client.login(username=self.global_staff.username, password=TEST_PASSWORD))
|
||||
assert self.client.login(username=self.global_staff.username, password=TEST_PASSWORD)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -392,7 +392,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
# re-access to the main course page redirects to last accessed view.
|
||||
url = reverse('courseware', kwargs={'course_id': six.text_type(self.course_key)})
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
assert response.status_code == 302
|
||||
response = self.client.get(response.url)
|
||||
self.assertNotContains(response, self.problem.location)
|
||||
self.assertContains(response, self.problem2.location)
|
||||
@@ -429,7 +429,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
}
|
||||
)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, expected_response_code)
|
||||
assert response.status_code == expected_response_code
|
||||
return response
|
||||
|
||||
def test_index_no_visible_section_in_chapter(self):
|
||||
@@ -448,7 +448,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
'chapter': six.text_type(self.chapter.location.block_id)},
|
||||
)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
self.assertNotContains(response, 'Problem 1')
|
||||
self.assertNotContains(response, 'Problem 2')
|
||||
|
||||
@@ -483,11 +483,11 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
self._create_global_staff_user()
|
||||
courseware_url, enroll_url = self._create_url_for_enroll_staff()
|
||||
response = self.client.post(enroll_url, data=data, follow=True)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
# we were redirected to our current location
|
||||
self.assertIn(302, response.redirect_chain[0])
|
||||
self.assertEqual(len(response.redirect_chain), 1)
|
||||
assert 302 in response.redirect_chain[0]
|
||||
assert len(response.redirect_chain) == 1
|
||||
if enrollment:
|
||||
self.assertRedirects(response, courseware_url)
|
||||
else:
|
||||
@@ -501,7 +501,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
self._create_global_staff_user()
|
||||
__, enroll_url = self._create_url_for_enroll_staff()
|
||||
response = self.client.post(enroll_url, data={'test': "test"})
|
||||
self.assertEqual(response.status_code, 302)
|
||||
assert response.status_code == 302
|
||||
self.assertRedirects(response, '/courses/{}/about'.format(six.text_type(self.course_key)))
|
||||
|
||||
def assert_enrollment_link_present(self, is_anonymous):
|
||||
@@ -519,7 +519,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
if is_anonymous:
|
||||
self.client.logout()
|
||||
else:
|
||||
self.assertTrue(self.client.login(username=self.user.username, password=TEST_PASSWORD))
|
||||
assert self.client.login(username=self.user.username, password=TEST_PASSWORD)
|
||||
|
||||
# Construct the link according the following scenarios and verify its presence in the response:
|
||||
# (1) shopping cart is enabled and the user is not logged in
|
||||
@@ -538,39 +538,27 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
if not is_anonymous:
|
||||
self.assert_enrollment_link_present(is_anonymous=is_anonymous)
|
||||
else:
|
||||
self.assertEqual(EcommerceService().is_enabled(AnonymousUser()), False)
|
||||
assert EcommerceService().is_enabled(AnonymousUser()) is False
|
||||
|
||||
def test_user_groups(self):
|
||||
# deprecated function
|
||||
mock_user = MagicMock()
|
||||
type(mock_user).is_authenticated = PropertyMock(return_value=False)
|
||||
self.assertEqual(views.user_groups(mock_user), [])
|
||||
assert views.user_groups(mock_user) == []
|
||||
|
||||
def test_get_redirect_url(self):
|
||||
# test the course location
|
||||
self.assertEqual(
|
||||
u'/courses/{course_key}/courseware?{activate_block_id}'.format(
|
||||
course_key=text_type(self.course_key),
|
||||
activate_block_id=urlencode({'activate_block_id': text_type(self.course.location)})
|
||||
),
|
||||
get_redirect_url(self.course_key, self.course.location),
|
||||
)
|
||||
assert u'/courses/{course_key}/courseware?{activate_block_id}'.format(course_key=text_type(self.course_key), activate_block_id=urlencode({'activate_block_id': text_type(self.course.location)})) == get_redirect_url(self.course_key, self.course.location) # pylint: disable=line-too-long
|
||||
# test a section location
|
||||
self.assertEqual(
|
||||
u'/courses/{course_key}/courseware/Chapter_1/Sequential_1/?{activate_block_id}'.format(
|
||||
course_key=text_type(self.course_key),
|
||||
activate_block_id=urlencode({'activate_block_id': text_type(self.section.location)})
|
||||
),
|
||||
get_redirect_url(self.course_key, self.section.location),
|
||||
)
|
||||
assert u'/courses/{course_key}/courseware/Chapter_1/Sequential_1/?{activate_block_id}'.format(course_key=text_type(self.course_key), activate_block_id=urlencode({'activate_block_id': text_type(self.section.location)})) == get_redirect_url(self.course_key, self.section.location) # pylint: disable=line-too-long
|
||||
|
||||
def test_invalid_course_id(self):
|
||||
response = self.client.get('/courses/MITx/3.091X/')
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
def test_incomplete_course_id(self):
|
||||
response = self.client.get('/courses/MITx/')
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
def test_index_invalid_position(self):
|
||||
request_url = '/'.join([
|
||||
@@ -581,9 +569,9 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
self.section.location.block_id,
|
||||
'f'
|
||||
])
|
||||
self.assertTrue(self.client.login(username=self.user.username, password=TEST_PASSWORD))
|
||||
assert self.client.login(username=self.user.username, password=TEST_PASSWORD)
|
||||
response = self.client.get(request_url)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
def test_unicode_handling_in_url(self):
|
||||
url_parts = [
|
||||
@@ -594,19 +582,19 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
self.section.location.block_id,
|
||||
'1'
|
||||
]
|
||||
self.assertTrue(self.client.login(username=self.user.username, password=TEST_PASSWORD))
|
||||
assert self.client.login(username=self.user.username, password=TEST_PASSWORD)
|
||||
for idx, val in enumerate(url_parts):
|
||||
url_parts_copy = url_parts[:]
|
||||
url_parts_copy[idx] = val + u'χ'
|
||||
request_url = '/'.join(url_parts_copy)
|
||||
response = self.client.get(request_url)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
def test_jump_to_invalid(self):
|
||||
# TODO add a test for invalid location
|
||||
# TODO add a test for no data *
|
||||
response = self.client.get(reverse('jump_to', args=['foo/bar/baz', 'baz']))
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
def verify_end_date(self, course_id, expected_end_text=None):
|
||||
"""
|
||||
@@ -626,7 +614,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
# log into a staff account
|
||||
admin = AdminFactory()
|
||||
|
||||
self.assertTrue(self.client.login(username=admin.username, password='test'))
|
||||
assert self.client.login(username=admin.username, password='test')
|
||||
|
||||
url = reverse('submission_history', kwargs={
|
||||
'course_id': six.text_type(self.course_key),
|
||||
@@ -641,7 +629,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
# log into a staff account
|
||||
admin = AdminFactory()
|
||||
|
||||
self.assertTrue(self.client.login(username=admin.username, password='test'))
|
||||
assert self.client.login(username=admin.username, password='test')
|
||||
|
||||
# try it with an existing user and a malicious location
|
||||
url = reverse('submission_history', kwargs={
|
||||
@@ -665,7 +653,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
# log into a staff account
|
||||
admin = AdminFactory.create()
|
||||
|
||||
self.assertTrue(self.client.login(username=admin.username, password='test'))
|
||||
assert self.client.login(username=admin.username, password='test')
|
||||
|
||||
usage_key = self.course_key.make_usage_key('problem', 'test-history')
|
||||
state_client = DjangoXBlockUserStateClient(admin)
|
||||
@@ -699,12 +687,12 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
# displayed (but not the order), and also the indexes assigned in the output
|
||||
# #1 - #4
|
||||
|
||||
self.assertIn('#1', response_content)
|
||||
self.assertIn(json.dumps({'field_a': 'a', 'field_b': 'b'}, sort_keys=True, indent=2), response_content)
|
||||
self.assertIn("Score: 0.0 / 3.0", response_content)
|
||||
self.assertIn(json.dumps({'field_a': 'x', 'field_b': 'y'}, sort_keys=True, indent=2), response_content)
|
||||
self.assertIn("Score: 3.0 / 3.0", response_content)
|
||||
self.assertIn('#4', response_content)
|
||||
assert '#1' in response_content
|
||||
assert json.dumps({'field_a': 'a', 'field_b': 'b'}, sort_keys=True, indent=2) in response_content
|
||||
assert 'Score: 0.0 / 3.0' in response_content
|
||||
assert json.dumps({'field_a': 'x', 'field_b': 'y'}, sort_keys=True, indent=2) in response_content
|
||||
assert 'Score: 3.0 / 3.0' in response_content
|
||||
assert '#4' in response_content
|
||||
|
||||
@ddt.data(('America/New_York', -5), # UTC - 5
|
||||
('Asia/Pyongyang', 9), # UTC + 9
|
||||
@@ -719,7 +707,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
course_key = course.id
|
||||
client = Client()
|
||||
admin = AdminFactory.create()
|
||||
self.assertTrue(client.login(username=admin.username, password='test'))
|
||||
assert client.login(username=admin.username, password='test')
|
||||
state_client = DjangoXBlockUserStateClient(admin)
|
||||
usage_key = course_key.make_usage_key('problem', 'test-history')
|
||||
state_client.set(
|
||||
@@ -754,7 +742,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
url = reverse('financial_assistance')
|
||||
response = self.client.get(url)
|
||||
# This is a static page, so just assert that it is returned correctly
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
self.assertContains(response, 'Financial Assistance Application')
|
||||
|
||||
@ddt.data(([CourseMode.AUDIT, CourseMode.VERIFIED], CourseMode.AUDIT, True, YESTERDAY),
|
||||
@@ -790,7 +778,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
|
||||
url = reverse('financial_assistance_form')
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
self.assertNotContains(response, str(course.id))
|
||||
|
||||
@@ -812,7 +800,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
|
||||
url = reverse('financial_assistance_form')
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
self.assertContains(response, str(course))
|
||||
|
||||
@@ -844,7 +832,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
'mktg-permission': False,
|
||||
}
|
||||
response = self._submit_financial_assistance_form(data)
|
||||
self.assertEqual(response.status_code, 204)
|
||||
assert response.status_code == 204
|
||||
|
||||
__, __, ticket_subject, __ = mock_create_zendesk_ticket.call_args[0]
|
||||
mocked_kwargs = mock_create_zendesk_ticket.call_args[1]
|
||||
@@ -854,20 +842,14 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
|
||||
private_comment = '\n'.join(list(additional_info.values()))
|
||||
for info in (country, income, reason_for_applying, goals, effort, username, legal_name, course):
|
||||
self.assertIn(info, private_comment)
|
||||
assert info in private_comment
|
||||
|
||||
self.assertEqual(additional_info['Allowed for marketing purposes'], 'No')
|
||||
assert additional_info['Allowed for marketing purposes'] == 'No'
|
||||
|
||||
self.assertEqual(
|
||||
ticket_subject,
|
||||
u'Financial assistance request for learner {username} in course {course}'.format(
|
||||
username=username,
|
||||
course=self.course.display_name
|
||||
)
|
||||
)
|
||||
assert ticket_subject == u'Financial assistance request for learner {username} in course {course}'.format(username=username, course=self.course.display_name) # pylint: disable=line-too-long
|
||||
self.assertDictContainsSubset({'course_id': course}, tags)
|
||||
self.assertIn('Client IP', additional_info)
|
||||
self.assertEqual(group_name, 'Financial Assistance')
|
||||
assert 'Client IP' in additional_info
|
||||
assert group_name == 'Financial Assistance'
|
||||
|
||||
@patch.object(views, 'create_zendesk_ticket', return_value=500)
|
||||
def test_zendesk_submission_failed(self, _mock_create_zendesk_ticket):
|
||||
@@ -883,7 +865,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
'effort': '',
|
||||
'mktg-permission': False,
|
||||
})
|
||||
self.assertEqual(response.status_code, 500)
|
||||
assert response.status_code == 500
|
||||
|
||||
@ddt.data(
|
||||
({}, 400),
|
||||
@@ -893,7 +875,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
@ddt.unpack
|
||||
def test_submit_financial_assistance_errors(self, data, status):
|
||||
response = self._submit_financial_assistance_form(data)
|
||||
self.assertEqual(response.status_code, status)
|
||||
assert response.status_code == status
|
||||
|
||||
def test_financial_assistance_login_required(self):
|
||||
for url in (
|
||||
@@ -910,13 +892,13 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
course_id = six.text_type(self.course_key)
|
||||
|
||||
response = self.client.get(reverse('info', args=[course_id]))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
response = self.client.get(reverse('info', args=[course_id]), HTTP_REFERER=reverse('dashboard'))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
response = self.client.get(reverse('info', args=[course_id]), HTTP_REFERER='foo')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
# TODO: TNL-6387: Remove test
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
@@ -968,7 +950,7 @@ class TestProgramMarketingView(SharedModuleStoreTestCase):
|
||||
mock_cache.get.return_value = None
|
||||
|
||||
response = self.client.get(self.url)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
assert response.status_code == 404
|
||||
|
||||
def test_200(self, mock_cache):
|
||||
"""
|
||||
@@ -977,7 +959,7 @@ class TestProgramMarketingView(SharedModuleStoreTestCase):
|
||||
mock_cache.get.return_value = self.data
|
||||
|
||||
response = self.client.get(self.url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
# setting TIME_ZONE_DISPLAYED_FOR_DEADLINES explicitly
|
||||
@@ -1010,7 +992,7 @@ class BaseDueDateTests(ModuleStoreTestCase):
|
||||
ItemFactory.create(category='problem', parent_location=vertical.location)
|
||||
|
||||
course = modulestore().get_course(course.id)
|
||||
self.assertIsNotNone(course.get_children()[0].get_children()[0].due)
|
||||
assert course.get_children()[0].get_children()[0].due is not None
|
||||
CourseEnrollmentFactory(user=self.user, course_id=course.id)
|
||||
CourseOverview.load_from_module_store(course.id)
|
||||
return course
|
||||
@@ -1018,7 +1000,7 @@ class BaseDueDateTests(ModuleStoreTestCase):
|
||||
def setUp(self):
|
||||
super(BaseDueDateTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
|
||||
self.user = UserFactory.create()
|
||||
self.assertTrue(self.client.login(username=self.user.username, password='test'))
|
||||
assert self.client.login(username=self.user.username, password='test')
|
||||
|
||||
self.time_with_tz = "2013-09-18 11:30:00+00:00"
|
||||
|
||||
@@ -1031,7 +1013,7 @@ class BaseDueDateTests(ModuleStoreTestCase):
|
||||
response = self.get_response(course)
|
||||
self.assertContains(response, self.time_with_tz)
|
||||
# Test that show_timezone has been cleared (which means you get the default value of True).
|
||||
self.assertTrue(course.show_timezone)
|
||||
assert course.show_timezone
|
||||
|
||||
def test_defaults(self):
|
||||
course = self.set_up_course()
|
||||
@@ -1160,7 +1142,7 @@ class ProgressPageBaseTests(ModuleStoreTestCase):
|
||||
def setUp(self):
|
||||
super(ProgressPageBaseTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
|
||||
self.user = UserFactory.create()
|
||||
self.assertTrue(self.client.login(username=self.user.username, password='test'))
|
||||
assert self.client.login(username=self.user.username, password='test')
|
||||
|
||||
self.setup_course()
|
||||
|
||||
@@ -1191,7 +1173,7 @@ class ProgressPageBaseTests(ModuleStoreTestCase):
|
||||
resp = self.client.get(
|
||||
reverse('progress', args=[six.text_type(self.course.id)])
|
||||
)
|
||||
self.assertEqual(resp.status_code, expected_status_code)
|
||||
assert resp.status_code == expected_status_code
|
||||
return resp
|
||||
|
||||
def _get_student_progress_page(self, expected_status_code=200):
|
||||
@@ -1201,7 +1183,7 @@ class ProgressPageBaseTests(ModuleStoreTestCase):
|
||||
resp = self.client.get(
|
||||
reverse('student_progress', args=[six.text_type(self.course.id), self.user.id])
|
||||
)
|
||||
self.assertEqual(resp.status_code, expected_status_code)
|
||||
assert resp.status_code == expected_status_code
|
||||
return resp
|
||||
|
||||
|
||||
@@ -1247,7 +1229,7 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
resp = self.client.get(
|
||||
reverse('student_progress', args=[six.text_type(self.course.id), invalid_id])
|
||||
)
|
||||
self.assertEqual(resp.status_code, 404)
|
||||
assert resp.status_code == 404
|
||||
|
||||
# Assert that valid 'student_id' returns 200 status
|
||||
self._get_student_progress_page()
|
||||
@@ -1262,7 +1244,7 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
# Create a new course, a user which will not be enrolled in course, admin user for staff access
|
||||
course = CourseFactory.create(default_store=default_store)
|
||||
admin = AdminFactory.create()
|
||||
self.assertTrue(self.client.login(username=admin.username, password='test'))
|
||||
assert self.client.login(username=admin.username, password='test')
|
||||
|
||||
# Create and enable Credit course
|
||||
CreditCourse.objects.create(course_key=course.id, enabled=True)
|
||||
@@ -1326,7 +1308,7 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
CourseEnrollment.enroll(self.user, self.course.id, mode="verified")
|
||||
|
||||
# Check that the user is unverified
|
||||
self.assertFalse(IDVerificationService.user_is_verified(self.user))
|
||||
assert not IDVerificationService.user_is_verified(self.user)
|
||||
with patch('lms.djangoapps.grades.course_grade_factory.CourseGradeFactory.read') as mock_create:
|
||||
course_grade = mock_create.return_value
|
||||
course_grade.passed = True
|
||||
@@ -1495,10 +1477,7 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
cert_button_hidden = course_mode is CourseMode.AUDIT or \
|
||||
course_mode in CourseMode.VERIFIED_MODES and not user_verified
|
||||
|
||||
self.assertEqual(
|
||||
cert_button_hidden,
|
||||
'Request Certificate' not in resp.content.decode('utf-8')
|
||||
)
|
||||
assert cert_button_hidden == ('Request Certificate' not in resp.content.decode('utf-8'))
|
||||
|
||||
@patch.dict('django.conf.settings.FEATURES', {'CERTIFICATES_HTML_VIEW': True})
|
||||
def test_page_with_invalidated_certificate_with_html_view(self):
|
||||
@@ -1619,7 +1598,7 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
"""
|
||||
CourseDurationLimitConfig.objects.create(enabled=True, enabled_as_of=datetime(2018, 1, 1))
|
||||
user = UserFactory.create()
|
||||
self.assertTrue(self.client.login(username=user.username, password='test'))
|
||||
assert self.client.login(username=user.username, password='test')
|
||||
add_course_mode(self.course, mode_slug=CourseMode.AUDIT)
|
||||
add_course_mode(self.course)
|
||||
CourseEnrollmentFactory(user=user, course_id=self.course.id, mode=course_mode)
|
||||
@@ -1652,7 +1631,7 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
"""
|
||||
CourseDurationLimitConfig.objects.create(enabled=False)
|
||||
user = UserFactory.create()
|
||||
self.assertTrue(self.client.login(username=user.username, password='test'))
|
||||
assert self.client.login(username=user.username, password='test')
|
||||
CourseModeFactory.create(
|
||||
course_id=self.course.id,
|
||||
mode_slug=course_mode
|
||||
@@ -1671,7 +1650,7 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
in an ineligible mode.
|
||||
"""
|
||||
user = UserFactory.create()
|
||||
self.assertTrue(self.client.login(username=user.username, password='test'))
|
||||
assert self.client.login(username=user.username, password='test')
|
||||
CourseEnrollmentFactory(user=user, course_id=self.course.id, mode=course_mode)
|
||||
|
||||
with patch('lms.djangoapps.grades.course_grade_factory.CourseGradeFactory.read') as mock_create:
|
||||
@@ -1700,8 +1679,8 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
# Invalidate user certificate
|
||||
generated_certificate.invalidate()
|
||||
response = views.get_cert_data(self.user, self.course, CourseMode.HONOR, MagicMock(passed=True))
|
||||
self.assertEqual(response.cert_status, 'invalidated')
|
||||
self.assertEqual(response.title, 'Your certificate has been invalidated')
|
||||
assert response.cert_status == 'invalidated'
|
||||
assert response.title == 'Your certificate has been invalidated'
|
||||
|
||||
@override_settings(FEATURES=FEATURES_WITH_DISABLE_HONOR_CERTIFICATE)
|
||||
def test_downloadable_get_cert_data(self):
|
||||
@@ -1716,8 +1695,8 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
self.user, self.course, CourseMode.HONOR, MagicMock(passed=True)
|
||||
)
|
||||
|
||||
self.assertEqual(response.cert_status, 'downloadable')
|
||||
self.assertEqual(response.title, 'Your certificate is available')
|
||||
assert response.cert_status == 'downloadable'
|
||||
assert response.title == 'Your certificate is available'
|
||||
|
||||
def test_generating_get_cert_data(self):
|
||||
"""
|
||||
@@ -1730,8 +1709,8 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
return_value=self.mock_certificate_downloadable_status(is_generating=True)):
|
||||
response = views.get_cert_data(self.user, self.course, CourseMode.HONOR, MagicMock(passed=True))
|
||||
|
||||
self.assertEqual(response.cert_status, 'generating')
|
||||
self.assertEqual(response.title, "We're working on it...")
|
||||
assert response.cert_status == 'generating'
|
||||
assert response.title == "We're working on it..."
|
||||
|
||||
def test_unverified_get_cert_data(self):
|
||||
"""
|
||||
@@ -1744,8 +1723,8 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
return_value=self.mock_certificate_downloadable_status(is_unverified=True)):
|
||||
response = views.get_cert_data(self.user, self.course, CourseMode.HONOR, MagicMock(passed=True))
|
||||
|
||||
self.assertEqual(response.cert_status, 'unverified')
|
||||
self.assertEqual(response.title, "Certificate unavailable")
|
||||
assert response.cert_status == 'unverified'
|
||||
assert response.title == 'Certificate unavailable'
|
||||
|
||||
def test_request_get_cert_data(self):
|
||||
"""
|
||||
@@ -1758,8 +1737,8 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
return_value=self.mock_certificate_downloadable_status()):
|
||||
response = views.get_cert_data(self.user, self.course, CourseMode.HONOR, MagicMock(passed=True))
|
||||
|
||||
self.assertEqual(response.cert_status, 'requesting')
|
||||
self.assertEqual(response.title, "Congratulations, you qualified for a certificate!")
|
||||
assert response.cert_status == 'requesting'
|
||||
assert response.title == 'Congratulations, you qualified for a certificate!'
|
||||
|
||||
def test_earned_but_not_available_get_cert_data(self):
|
||||
"""
|
||||
@@ -1772,8 +1751,8 @@ class ProgressPageTests(ProgressPageBaseTests):
|
||||
return_value=self.mock_certificate_downloadable_status(earned_but_not_available=True)):
|
||||
response = views.get_cert_data(self.user, self.course, CourseMode.VERIFIED, MagicMock(passed=True))
|
||||
|
||||
self.assertEqual(response.cert_status, 'earned_but_not_available')
|
||||
self.assertEqual(response.title, "Your certificate will be available soon!")
|
||||
assert response.cert_status == 'earned_but_not_available'
|
||||
assert response.title == 'Your certificate will be available soon!'
|
||||
|
||||
def assert_invalidate_certificate(self, certificate):
|
||||
""" Dry method to mark certificate as invalid. And assert the response. """
|
||||
@@ -2128,13 +2107,13 @@ class VerifyCourseKeyDecoratorTests(TestCase):
|
||||
mocked_view = create_autospec(views.course_about)
|
||||
view_function = ensure_valid_course_key(mocked_view)
|
||||
view_function(self.request, course_id=self.valid_course_id)
|
||||
self.assertTrue(mocked_view.called)
|
||||
assert mocked_view.called
|
||||
|
||||
def test_decorator_with_invalid_course_id(self):
|
||||
mocked_view = create_autospec(views.course_about)
|
||||
view_function = ensure_valid_course_key(mocked_view)
|
||||
self.assertRaises(Http404, view_function, self.request, course_id=self.invalid_course_id)
|
||||
self.assertFalse(mocked_view.called)
|
||||
assert not mocked_view.called
|
||||
|
||||
|
||||
class GenerateUserCertTests(ModuleStoreTestCase):
|
||||
@@ -2155,7 +2134,7 @@ class GenerateUserCertTests(ModuleStoreTestCase):
|
||||
self_paced=True
|
||||
)
|
||||
self.enrollment = CourseEnrollment.enroll(self.student, self.course.id, mode='honor')
|
||||
self.assertTrue(self.client.login(username=self.student, password=TEST_PASSWORD))
|
||||
assert self.client.login(username=self.student, password=TEST_PASSWORD)
|
||||
self.url = reverse('generate_user_cert', kwargs={'course_id': six.text_type(self.course.id)})
|
||||
|
||||
def test_user_with_out_passing_grades(self):
|
||||
@@ -2182,7 +2161,7 @@ class GenerateUserCertTests(ModuleStoreTestCase):
|
||||
mock_send_to_queue.return_value = (0, "Successfully queued")
|
||||
|
||||
resp = self.client.post(self.url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
# Verify Google Analytics event fired after generating certificate
|
||||
mock_tracker.track.assert_called_once_with(
|
||||
@@ -2245,7 +2224,7 @@ class GenerateUserCertTests(ModuleStoreTestCase):
|
||||
def test_user_with_invalid_course_id(self):
|
||||
# If try to access a course with invalid key pattern then 404 will return
|
||||
resp = self.client.post('/courses/def/generate_user_cert')
|
||||
self.assertEqual(resp.status_code, 404)
|
||||
assert resp.status_code == 404
|
||||
|
||||
def test_user_without_login_return_error(self):
|
||||
# If user try to access without login should see a bad request status code with message
|
||||
@@ -2334,7 +2313,7 @@ class TestIndexView(ModuleStoreTestCase):
|
||||
CourseOverview.load_from_module_store(course.id)
|
||||
CourseEnrollmentFactory(user=user, course_id=course.id)
|
||||
|
||||
self.assertTrue(self.client.login(username=user.username, password='test'))
|
||||
assert self.client.login(username=user.username, password='test')
|
||||
response = self.client.get(
|
||||
reverse(
|
||||
'courseware_section',
|
||||
@@ -2362,7 +2341,7 @@ class TestIndexView(ModuleStoreTestCase):
|
||||
CourseOverview.load_from_module_store(course.id)
|
||||
CourseEnrollmentFactory(user=user, course_id=course.id)
|
||||
|
||||
self.assertTrue(self.client.login(username=user.username, password='test'))
|
||||
assert self.client.login(username=user.username, password='test')
|
||||
response = self.client.get(
|
||||
reverse(
|
||||
'courseware_section',
|
||||
@@ -2434,23 +2413,23 @@ class TestIndexView(ModuleStoreTestCase):
|
||||
unicode_content = response.content.decode('utf-8')
|
||||
if expected_course_content:
|
||||
if user_type in (CourseUserType.ANONYMOUS, CourseUserType.UNENROLLED):
|
||||
self.assertIn('data-save-position="false"', unicode_content)
|
||||
self.assertIn('data-show-completion="false"', unicode_content)
|
||||
self.assertIn('xblock-public_view-sequential', unicode_content)
|
||||
self.assertIn('xblock-public_view-vertical', unicode_content)
|
||||
self.assertIn('xblock-public_view-html', unicode_content)
|
||||
self.assertIn('xblock-public_view-video', unicode_content)
|
||||
assert 'data-save-position="false"' in unicode_content
|
||||
assert 'data-show-completion="false"' in unicode_content
|
||||
assert 'xblock-public_view-sequential' in unicode_content
|
||||
assert 'xblock-public_view-vertical' in unicode_content
|
||||
assert 'xblock-public_view-html' in unicode_content
|
||||
assert 'xblock-public_view-video' in unicode_content
|
||||
if user_type == CourseUserType.ANONYMOUS and course_visibility == COURSE_VISIBILITY_PRIVATE:
|
||||
self.assertIn('To see course content', unicode_content)
|
||||
assert 'To see course content' in unicode_content
|
||||
if user_type == CourseUserType.UNENROLLED and course_visibility == COURSE_VISIBILITY_PRIVATE:
|
||||
self.assertIn('You must be enrolled', unicode_content)
|
||||
assert 'You must be enrolled' in unicode_content
|
||||
else:
|
||||
self.assertIn('data-save-position="true"', unicode_content)
|
||||
self.assertIn('data-show-completion="true"', unicode_content)
|
||||
self.assertIn('xblock-student_view-sequential', unicode_content)
|
||||
self.assertIn('xblock-student_view-vertical', unicode_content)
|
||||
self.assertIn('xblock-student_view-html', unicode_content)
|
||||
self.assertIn('xblock-student_view-video', unicode_content)
|
||||
assert 'data-save-position="true"' in unicode_content
|
||||
assert 'data-show-completion="true"' in unicode_content
|
||||
assert 'xblock-student_view-sequential' in unicode_content
|
||||
assert 'xblock-student_view-vertical' in unicode_content
|
||||
assert 'xblock-student_view-html' in unicode_content
|
||||
assert 'xblock-student_view-video' in unicode_content
|
||||
|
||||
@patch('lms.djangoapps.courseware.views.views.CourseTabView.course_open_for_learner_enrollment')
|
||||
@patch('openedx.core.djangoapps.util.user_messages.PageLevelMessages.register_warning_message')
|
||||
@@ -2532,10 +2511,7 @@ class TestIndexView(ModuleStoreTestCase):
|
||||
patch_is_masters_only.return_value = is_masters_only
|
||||
course.invitation_only = invitation_only
|
||||
|
||||
self.assertEqual(
|
||||
views.CourseTabView.course_open_for_learner_enrollment(course),
|
||||
expected_should_show_enroll_button
|
||||
)
|
||||
assert views.CourseTabView.course_open_for_learner_enrollment(course) == expected_should_show_enroll_button
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -2615,7 +2591,7 @@ class TestIndexViewCompleteOnView(ModuleStoreTestCase, CompletionWaffleTestMixin
|
||||
def test_completion_service_disabled(self, default_store):
|
||||
|
||||
self.setup_course(default_store)
|
||||
self.assertTrue(self.client.login(username=self.user.username, password='test'))
|
||||
assert self.client.login(username=self.user.username, password='test')
|
||||
|
||||
response = self.client.get(self.section_1_url)
|
||||
self.assertNotContains(response, 'data-mark-completed-on-view-after-delay')
|
||||
@@ -2629,7 +2605,7 @@ class TestIndexViewCompleteOnView(ModuleStoreTestCase, CompletionWaffleTestMixin
|
||||
self.override_waffle_switch(True)
|
||||
|
||||
self.setup_course(default_store)
|
||||
self.assertTrue(self.client.login(username=self.user.username, password='test'))
|
||||
assert self.client.login(username=self.user.username, password='test')
|
||||
|
||||
response = self.client.get(self.section_1_url)
|
||||
self.assertContains(response, 'data-mark-completed-on-view-after-delay')
|
||||
@@ -2647,7 +2623,7 @@ class TestIndexViewCompleteOnView(ModuleStoreTestCase, CompletionWaffleTestMixin
|
||||
quote_slashes(six.text_type(self.html_1_1.scope_ids.usage_id)),
|
||||
'publish_completion',
|
||||
)
|
||||
self.assertEqual(json.loads(response.content.decode('utf-8')), {'result': "ok"})
|
||||
assert json.loads(response.content.decode('utf-8')) == {'result': 'ok'}
|
||||
|
||||
response = self.client.get(self.section_1_url)
|
||||
self.assertContains(response, 'data-mark-completed-on-view-after-delay')
|
||||
@@ -2665,7 +2641,7 @@ class TestIndexViewCompleteOnView(ModuleStoreTestCase, CompletionWaffleTestMixin
|
||||
quote_slashes(six.text_type(self.html_1_2.scope_ids.usage_id)),
|
||||
'publish_completion',
|
||||
)
|
||||
self.assertEqual(json.loads(response.content.decode('utf-8')), {'result': "ok"})
|
||||
assert json.loads(response.content.decode('utf-8')) == {'result': 'ok'}
|
||||
|
||||
response = self.client.get(self.section_1_url)
|
||||
self.assertNotContains(response, 'data-mark-completed-on-view-after-delay')
|
||||
@@ -2775,7 +2751,7 @@ class TestIndexViewWithGating(ModuleStoreTestCase, MilestonesTestCaseMixin):
|
||||
"""
|
||||
Test index view with a gated sequential raises Http404
|
||||
"""
|
||||
self.assertTrue(self.client.login(username=self.user.username, password='test'))
|
||||
assert self.client.login(username=self.user.username, password='test')
|
||||
response = self.client.get(
|
||||
reverse(
|
||||
'courseware_section',
|
||||
@@ -2786,7 +2762,7 @@ class TestIndexViewWithGating(ModuleStoreTestCase, MilestonesTestCaseMixin):
|
||||
}
|
||||
)
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
self.assertContains(response, "Content Locked")
|
||||
|
||||
|
||||
@@ -2816,7 +2792,7 @@ class TestIndexViewWithCourseDurationLimits(ModuleStoreTestCase):
|
||||
when course_duration_limits are enabled.
|
||||
"""
|
||||
CourseDurationLimitConfig.objects.create(enabled=True, enabled_as_of=datetime(2018, 1, 1))
|
||||
self.assertTrue(self.client.login(username=self.user.username, password='test'))
|
||||
assert self.client.login(username=self.user.username, password='test')
|
||||
add_course_mode(self.course, mode_slug=CourseMode.AUDIT)
|
||||
add_course_mode(self.course)
|
||||
response = self.client.get(
|
||||
@@ -2835,7 +2811,7 @@ class TestIndexViewWithCourseDurationLimits(ModuleStoreTestCase):
|
||||
# work. Instead we remove all whitespace to verify content is correct.
|
||||
bannerText_no_spaces = escape(bannerText).replace(' ', '')
|
||||
response_no_spaces = response.content.decode('utf-8').replace(' ', '')
|
||||
self.assertIn(bannerText_no_spaces, response_no_spaces)
|
||||
assert bannerText_no_spaces in response_no_spaces
|
||||
|
||||
def test_index_without_course_duration_limits(self):
|
||||
"""
|
||||
@@ -2843,7 +2819,7 @@ class TestIndexViewWithCourseDurationLimits(ModuleStoreTestCase):
|
||||
when course_duration_limits are disabled.
|
||||
"""
|
||||
CourseDurationLimitConfig.objects.create(enabled=False)
|
||||
self.assertTrue(self.client.login(username=self.user.username, password='test'))
|
||||
assert self.client.login(username=self.user.username, password='test')
|
||||
add_course_mode(self.course, upgrade_deadline_expired=False)
|
||||
response = self.client.get(
|
||||
reverse(
|
||||
@@ -2893,7 +2869,7 @@ class TestRenderXBlock(RenderXBlockTestMixin, ModuleStoreTestCase, CompletionWaf
|
||||
self.setup_user(admin=True, enroll=True, login=True)
|
||||
|
||||
response = self.get_response(usage_key=self.html_block.location)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
self.assertContains(response, 'data-enable-completion-on-view-service="false"')
|
||||
self.assertNotContains(response, 'data-mark-completed-on-view-after-delay')
|
||||
|
||||
@@ -2907,7 +2883,7 @@ class TestRenderXBlock(RenderXBlockTestMixin, ModuleStoreTestCase, CompletionWaf
|
||||
self.setup_user(admin=False, enroll=True, login=True)
|
||||
|
||||
response = self.get_response(usage_key=self.html_block.location)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
self.assertContains(response, 'data-enable-completion-on-view-service="true"')
|
||||
self.assertContains(response, 'data-mark-completed-on-view-after-delay')
|
||||
|
||||
@@ -2923,16 +2899,16 @@ class TestRenderXBlock(RenderXBlockTestMixin, ModuleStoreTestCase, CompletionWaf
|
||||
quote_slashes(six.text_type(self.html_block.location)),
|
||||
'publish_completion',
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(json.loads(response.content.decode('utf-8')), {'result': "ok"})
|
||||
assert response.status_code == 200
|
||||
assert json.loads(response.content.decode('utf-8')) == {'result': 'ok'}
|
||||
|
||||
response = self.get_response(usage_key=self.html_block.location)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
self.assertContains(response, 'data-enable-completion-on-view-service="false"')
|
||||
self.assertNotContains(response, 'data-mark-completed-on-view-after-delay')
|
||||
|
||||
response = self.get_response(usage_key=self.problem_block.location)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
self.assertContains(response, 'data-enable-completion-on-view-service="false"')
|
||||
self.assertNotContains(response, 'data-mark-completed-on-view-after-delay')
|
||||
|
||||
@@ -2974,14 +2950,11 @@ class TestRenderXBlock(RenderXBlockTestMixin, ModuleStoreTestCase, CompletionWaf
|
||||
seq_url = reverse('render_xblock', kwargs={'usage_key_string': str(self.sequence.location)})
|
||||
for block in [self.problem_block, self.vertical_block]:
|
||||
response = self.get_response(usage_key=block.location)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(response.get('Location'), seq_url)
|
||||
assert response.status_code == 302
|
||||
assert response.get('Location') == seq_url
|
||||
|
||||
# The Sequence itself 200s (or we risk infinite redirect loops).
|
||||
self.assertEqual(
|
||||
self.get_response(usage_key=self.sequence.location).status_code,
|
||||
200
|
||||
)
|
||||
assert self.get_response(usage_key=self.sequence.location).status_code == 200
|
||||
|
||||
|
||||
class TestRenderXBlockSelfPaced(TestRenderXBlock): # lint-amnesty, pylint: disable=test-inherits-tests
|
||||
@@ -3033,12 +3006,12 @@ class TestIndexViewCrawlerStudentStateWrites(SharedModuleStoreTestCase):
|
||||
with patch('lms.djangoapps.courseware.model_data.UserStateCache.set_many') as patched_state_client_set_many:
|
||||
# Simulate someone using Chrome
|
||||
self._load_courseware('Mozilla/5.0 AppleWebKit/537.36')
|
||||
self.assertTrue(patched_state_client_set_many.called)
|
||||
assert patched_state_client_set_many.called
|
||||
patched_state_client_set_many.reset_mock()
|
||||
|
||||
# Common crawler user agent
|
||||
self._load_courseware('edX-downloader/0.1')
|
||||
self.assertTrue(patched_state_client_set_many.called)
|
||||
assert patched_state_client_set_many.called
|
||||
|
||||
def test_writes_with_config(self):
|
||||
"""Test state writes (or lack thereof) based on config values."""
|
||||
@@ -3046,15 +3019,15 @@ class TestIndexViewCrawlerStudentStateWrites(SharedModuleStoreTestCase):
|
||||
with patch('lms.djangoapps.courseware.model_data.UserStateCache.set_many') as patched_state_client_set_many:
|
||||
# Exact matching of crawler user agent
|
||||
self._load_courseware('crawler_foo')
|
||||
self.assertFalse(patched_state_client_set_many.called)
|
||||
assert not patched_state_client_set_many.called
|
||||
|
||||
# Partial matching of crawler user agent
|
||||
self._load_courseware('edX-downloader/0.1')
|
||||
self.assertFalse(patched_state_client_set_many.called)
|
||||
assert not patched_state_client_set_many.called
|
||||
|
||||
# Simulate an actual browser hitting it (we should write)
|
||||
self._load_courseware('Mozilla/5.0 AppleWebKit/537.36')
|
||||
self.assertTrue(patched_state_client_set_many.called)
|
||||
assert patched_state_client_set_many.called
|
||||
|
||||
# Disabling the crawlers config should revert us to default behavior
|
||||
CrawlersConfig.objects.create(enabled=False)
|
||||
@@ -3073,7 +3046,7 @@ class TestIndexViewCrawlerStudentStateWrites(SharedModuleStoreTestCase):
|
||||
response = self.client.get(url, HTTP_USER_AGENT=user_agent)
|
||||
# Make sure we get back an actual 200, and aren't redirected because we
|
||||
# messed up the setup somehow (e.g. didn't enroll properly)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
class EnterpriseConsentTestCase(EnterpriseTestConsentRequired, ModuleStoreTestCase):
|
||||
@@ -3083,7 +3056,7 @@ class EnterpriseConsentTestCase(EnterpriseTestConsentRequired, ModuleStoreTestCa
|
||||
def setUp(self):
|
||||
super(EnterpriseConsentTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
|
||||
self.user = UserFactory.create()
|
||||
self.assertTrue(self.client.login(username=self.user.username, password='test'))
|
||||
assert self.client.login(username=self.user.username, password='test')
|
||||
self.course = CourseFactory.create()
|
||||
CourseOverview.load_from_module_store(self.course.id)
|
||||
CourseEnrollmentFactory(user=self.user, course_id=self.course.id)
|
||||
@@ -3121,7 +3094,7 @@ class AccessUtilsTestCase(ModuleStoreTestCase):
|
||||
start_date = datetime.now(UTC) + timedelta(days=start_date_modifier)
|
||||
course = CourseFactory.create(start=start_date)
|
||||
|
||||
self.assertEqual(bool(check_course_open_for_learner(staff_user, course)), expected_value)
|
||||
assert bool(check_course_open_for_learner(staff_user, course)) == expected_value
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -3160,22 +3133,22 @@ class DatesTabTestCase(ModuleStoreTestCase):
|
||||
def test_tab_redirects_if_not_logged_in(self):
|
||||
self.client.logout()
|
||||
response = self._get_response(self.course)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertIn('/login?next=/courses/', response.url)
|
||||
assert response.status_code == 302
|
||||
assert '/login?next=/courses/' in response.url
|
||||
|
||||
def test_tab_redirects_if_not_enrolled_and_not_staff(self):
|
||||
response = self._get_response(self.course)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
assert response.status_code == 302
|
||||
# Beginning of redirect URL
|
||||
self.assertIn('/courses/', response.url)
|
||||
assert '/courses/' in response.url
|
||||
# End of redirect URL
|
||||
self.assertIn('/course/', response.url)
|
||||
assert '/course/' in response.url
|
||||
|
||||
# Now check staff users can see
|
||||
self.user.is_staff = True
|
||||
self.user.save()
|
||||
response = self._get_response(self.course)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
# Enrolled users can also see
|
||||
self.client.logout()
|
||||
@@ -3183,7 +3156,7 @@ class DatesTabTestCase(ModuleStoreTestCase):
|
||||
CourseEnrollmentFactory(course_id=self.course.id, user=enrolled_user, mode=CourseMode.VERIFIED)
|
||||
self.client.login(username=enrolled_user.username, password=TEST_PASSWORD)
|
||||
response = self._get_response(self.course)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
assert response.status_code == 200
|
||||
|
||||
@override_experiment_waffle_flag(RELATIVE_DATES_FLAG, active=True)
|
||||
@patch('edx_django_utils.monitoring.set_custom_attribute')
|
||||
@@ -3330,46 +3303,46 @@ class TestShowCoursewareMFE(TestCase):
|
||||
with override_waffle_flag(REDIRECT_TO_COURSEWARE_MICROFRONTEND, active=True):
|
||||
# (preview=on, redirect=on)
|
||||
# Global and Course Staff can see the link.
|
||||
self.assertTrue(show_courseware_mfe_link(global_staff_user, True, new_course_key))
|
||||
self.assertTrue(show_courseware_mfe_link(global_staff_user, False, new_course_key))
|
||||
self.assertTrue(show_courseware_mfe_link(regular_user, True, new_course_key))
|
||||
assert show_courseware_mfe_link(global_staff_user, True, new_course_key)
|
||||
assert show_courseware_mfe_link(global_staff_user, False, new_course_key)
|
||||
assert show_courseware_mfe_link(regular_user, True, new_course_key)
|
||||
|
||||
# Regular users don't see the link.
|
||||
self.assertFalse(show_courseware_mfe_link(regular_user, False, new_course_key))
|
||||
assert not show_courseware_mfe_link(regular_user, False, new_course_key)
|
||||
with override_waffle_flag(REDIRECT_TO_COURSEWARE_MICROFRONTEND, active=False):
|
||||
# (preview=on, redirect=off)
|
||||
# Global and Course Staff can see the link.
|
||||
self.assertTrue(show_courseware_mfe_link(global_staff_user, True, new_course_key))
|
||||
self.assertTrue(show_courseware_mfe_link(global_staff_user, False, new_course_key))
|
||||
self.assertTrue(show_courseware_mfe_link(regular_user, True, new_course_key))
|
||||
assert show_courseware_mfe_link(global_staff_user, True, new_course_key)
|
||||
assert show_courseware_mfe_link(global_staff_user, False, new_course_key)
|
||||
assert show_courseware_mfe_link(regular_user, True, new_course_key)
|
||||
|
||||
# Regular users don't see the link.
|
||||
self.assertFalse(show_courseware_mfe_link(regular_user, False, new_course_key))
|
||||
assert not show_courseware_mfe_link(regular_user, False, new_course_key)
|
||||
|
||||
with override_waffle_flag(COURSEWARE_MICROFRONTEND_COURSE_TEAM_PREVIEW, False):
|
||||
with override_waffle_flag(REDIRECT_TO_COURSEWARE_MICROFRONTEND, active=True):
|
||||
# (preview=off, redirect=on)
|
||||
# Global staff see the link anyway
|
||||
self.assertTrue(show_courseware_mfe_link(global_staff_user, True, new_course_key))
|
||||
self.assertTrue(show_courseware_mfe_link(global_staff_user, False, new_course_key))
|
||||
assert show_courseware_mfe_link(global_staff_user, True, new_course_key)
|
||||
assert show_courseware_mfe_link(global_staff_user, False, new_course_key)
|
||||
|
||||
# If redirect is active for their students, course staff see the link even
|
||||
# if preview=off.
|
||||
self.assertTrue(show_courseware_mfe_link(regular_user, True, new_course_key))
|
||||
assert show_courseware_mfe_link(regular_user, True, new_course_key)
|
||||
|
||||
# Regular users don't see the link.
|
||||
self.assertFalse(show_courseware_mfe_link(regular_user, False, new_course_key))
|
||||
assert not show_courseware_mfe_link(regular_user, False, new_course_key)
|
||||
with override_waffle_flag(REDIRECT_TO_COURSEWARE_MICROFRONTEND, active=False):
|
||||
# (preview=off, redirect=off)
|
||||
# Global staff see the link anyway
|
||||
self.assertTrue(show_courseware_mfe_link(global_staff_user, True, new_course_key))
|
||||
self.assertTrue(show_courseware_mfe_link(global_staff_user, False, new_course_key))
|
||||
assert show_courseware_mfe_link(global_staff_user, True, new_course_key)
|
||||
assert show_courseware_mfe_link(global_staff_user, False, new_course_key)
|
||||
|
||||
# Course teams can NOT see the link because both rollout waffle flags are false.
|
||||
self.assertFalse(show_courseware_mfe_link(regular_user, True, new_course_key))
|
||||
assert not show_courseware_mfe_link(regular_user, True, new_course_key)
|
||||
|
||||
# Regular users don't see the link.
|
||||
self.assertFalse(show_courseware_mfe_link(regular_user, False, new_course_key))
|
||||
assert not show_courseware_mfe_link(regular_user, False, new_course_key)
|
||||
|
||||
@override_settings(LEARNING_MICROFRONTEND_URL='https://learningmfe.openedx.org')
|
||||
def test_url_generation(self):
|
||||
|
||||
@@ -86,12 +86,7 @@ class TestWordCloud(BaseTestXmodule):
|
||||
"""
|
||||
users_state = self._get_users_state()
|
||||
|
||||
self.assertEqual(
|
||||
''.join(set([ # lint-amnesty, pylint: disable=consider-using-set-comprehension
|
||||
content['status']
|
||||
for _, content in users_state.items()
|
||||
])),
|
||||
'success')
|
||||
assert ''.join({content['status'] for (_, content) in users_state.items()}) == 'success'
|
||||
|
||||
# correct initial data:
|
||||
correct_initial_data = {
|
||||
@@ -104,7 +99,7 @@ class TestWordCloud(BaseTestXmodule):
|
||||
}
|
||||
|
||||
for _, response_content in users_state.items():
|
||||
self.assertEqual(response_content, correct_initial_data)
|
||||
assert response_content == correct_initial_data
|
||||
|
||||
def test_post_words(self):
|
||||
"""Students can submit data succesfully.
|
||||
@@ -126,12 +121,7 @@ class TestWordCloud(BaseTestXmodule):
|
||||
|
||||
users_state = self._post_words(input_words)
|
||||
|
||||
self.assertEqual(
|
||||
''.join(set([ # lint-amnesty, pylint: disable=consider-using-set-comprehension
|
||||
content['status']
|
||||
for _, content in users_state.items()
|
||||
])),
|
||||
'success')
|
||||
assert ''.join({content['status'] for (_, content) in users_state.items()}) == 'success'
|
||||
|
||||
correct_state = {}
|
||||
for index, user in enumerate(self.users):
|
||||
@@ -174,23 +164,13 @@ class TestWordCloud(BaseTestXmodule):
|
||||
# 1.
|
||||
users_state = self._get_users_state()
|
||||
|
||||
self.assertEqual(
|
||||
''.join(set([ # lint-amnesty, pylint: disable=consider-using-set-comprehension
|
||||
content['status']
|
||||
for _, content in users_state.items()
|
||||
])),
|
||||
'success')
|
||||
assert ''.join({content['status'] for (_, content) in users_state.items()}) == 'success'
|
||||
|
||||
# 2.
|
||||
# Invcemental state per user.
|
||||
users_state_after_post = self._post_words(['word1', 'word2'])
|
||||
|
||||
self.assertEqual(
|
||||
''.join(set([ # lint-amnesty, pylint: disable=consider-using-set-comprehension
|
||||
content['status']
|
||||
for _, content in users_state_after_post.items()
|
||||
])),
|
||||
'success')
|
||||
assert ''.join({content['status'] for (_, content) in users_state_after_post.items()}) == 'success'
|
||||
|
||||
# Final state after all posts.
|
||||
users_state_before_fail = self._get_users_state()
|
||||
@@ -199,12 +179,7 @@ class TestWordCloud(BaseTestXmodule):
|
||||
users_state_after_post = self._post_words(
|
||||
['word1', 'word2', 'word3'])
|
||||
|
||||
self.assertEqual(
|
||||
''.join(set([ # lint-amnesty, pylint: disable=consider-using-set-comprehension
|
||||
content['status']
|
||||
for _, content in users_state_after_post.items()
|
||||
])),
|
||||
'fail')
|
||||
assert ''.join({content['status'] for (_, content) in users_state_after_post.items()}) == 'fail'
|
||||
|
||||
# 4.
|
||||
current_users_state = self._get_users_state()
|
||||
@@ -216,12 +191,7 @@ class TestWordCloud(BaseTestXmodule):
|
||||
|
||||
users_state = self._post_words(input_words)
|
||||
|
||||
self.assertEqual(
|
||||
''.join(set([ # lint-amnesty, pylint: disable=consider-using-set-comprehension
|
||||
content['status']
|
||||
for _, content in users_state.items()
|
||||
])),
|
||||
'success')
|
||||
assert ''.join({content['status'] for (_, content) in users_state.items()}) == 'success'
|
||||
|
||||
for user in self.users:
|
||||
self.assertListEqual(
|
||||
@@ -238,7 +208,7 @@ class TestWordCloud(BaseTestXmodule):
|
||||
}
|
||||
|
||||
status_codes = {response.status_code for response in responses.values()}
|
||||
self.assertEqual(status_codes.pop(), 200)
|
||||
assert status_codes.pop() == 200
|
||||
|
||||
for user in self.users:
|
||||
self.assertDictEqual(
|
||||
@@ -264,4 +234,4 @@ class TestWordCloud(BaseTestXmodule):
|
||||
'submitted': False, # default value,
|
||||
}
|
||||
|
||||
self.assertEqual(fragment.content, self.runtime.render_template('word_cloud.html', expected_context))
|
||||
assert fragment.content == self.runtime.render_template('word_cloud.html', expected_context)
|
||||
|
||||
@@ -45,7 +45,7 @@ class ActivateLoginTest(LoginEnrollmentTestCase):
|
||||
has 'is_from_log_out' attribute set to true.
|
||||
"""
|
||||
response = self.client.get(reverse('logout'))
|
||||
self.assertTrue(getattr(response.wsgi_request, 'is_from_logout', False))
|
||||
assert getattr(response.wsgi_request, 'is_from_logout', False)
|
||||
|
||||
|
||||
class PageLoaderTestCase(LoginEnrollmentTestCase):
|
||||
@@ -115,11 +115,11 @@ class PageLoaderTestCase(LoginEnrollmentTestCase):
|
||||
(response.status_code, descriptor.location))
|
||||
|
||||
if expect_redirect:
|
||||
self.assertEqual(response.redirect_chain[0][1], 302)
|
||||
assert response.redirect_chain[0][1] == 302
|
||||
|
||||
if check_content:
|
||||
self.assertNotContains(response, "this module is temporarily unavailable")
|
||||
self.assertNotIsInstance(descriptor, ErrorBlock)
|
||||
assert not isinstance(descriptor, ErrorBlock)
|
||||
|
||||
|
||||
class TestMongoCoursesLoad(ModuleStoreTestCase, PageLoaderTestCase):
|
||||
@@ -142,7 +142,7 @@ class TestMongoCoursesLoad(ModuleStoreTestCase, PageLoaderTestCase):
|
||||
""").strip()
|
||||
location = self.toy_course_key.make_usage_key('course', '2012_Fall')
|
||||
course = self.store.get_item(location)
|
||||
self.assertGreater(len(course.textbooks), 0)
|
||||
assert len(course.textbooks) > 0
|
||||
|
||||
|
||||
class TestDraftModuleStore(ModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
|
||||
@@ -174,5 +174,5 @@ class TestLmsFieldData(TestCase):
|
||||
base_student = mock.Mock()
|
||||
first_level = LmsFieldData(base_authored, base_student)
|
||||
second_level = LmsFieldData(first_level, base_student)
|
||||
self.assertEqual(second_level._authored_data, first_level._authored_data)
|
||||
self.assertNotIsInstance(second_level._authored_data, LmsFieldData)
|
||||
assert second_level._authored_data == first_level._authored_data
|
||||
assert not isinstance(second_level._authored_data, LmsFieldData)
|
||||
|
||||
Reference in New Issue
Block a user