Commit 003e24e3 by Chris Dodge

add all illegal characters

parent d6ba142e
......@@ -33,6 +33,9 @@ from edx_proctoring. models import (
log = logging.getLogger(__name__)
SOFTWARE_SECURE_INVALID_CHARS = '[]<>#:|?/\'"*\\'
class SoftwareSecureBackendProvider(ProctoringBackendProvider):
"""
Implementation of the ProctoringBackendProvider for Software Secure's
......@@ -355,8 +358,10 @@ class SoftwareSecureBackendProvider(ProctoringBackendProvider):
now = datetime.datetime.utcnow()
start_time_str = now.strftime("%a, %d %b %Y %H:%M:%S GMT")
end_time_str = (now + datetime.timedelta(minutes=time_limit_mins)).strftime("%a, %d %b %Y %H:%M:%S GMT")
# note, SoftwareSecure does not appear to allow colons in the exam names
exam_name = exam['exam_name'].replace(':', '-')
# remove all illegal characters from the exam name
exam_name = exam['exam_name']
for character in SOFTWARE_SECURE_INVALID_CHARS:
exam_name = exam_name.replace(character, '_')
return {
"examCode": attempt_code,
"organization": self.organization,
......
......@@ -41,9 +41,12 @@ from edx_proctoring.models import (
ProctoredExamStudentAttemptHistory,
ProctoredExamStudentAllowance
)
from edx_proctoring.backends.tests.test_review_payload import TEST_REVIEW_PAYLOAD
from edx_proctoring.backends.tests.test_review_payload import (
TEST_REVIEW_PAYLOAD
)
from edx_proctoring.tests.test_services import MockCreditService
from edx_proctoring.backends.software_secure import SOFTWARE_SECURE_INVALID_CHARS
@all_requests
......@@ -216,14 +219,6 @@ class SoftwareSecureTests(TestCase):
Create an unstarted proctoring attempt with no review policy associated with it.
"""
exam_id = create_exam(
course_id='foo/bar/baz',
content_id='content',
exam_name='Sample Exam with : Colon',
time_limit_mins=10,
is_proctored=True
)
def assert_get_payload_mock_no_policy(exam, context):
"""
Add a mock shim so we can assert that the _get_payload has been called with the right
......@@ -240,26 +235,36 @@ class SoftwareSecureTests(TestCase):
# the check that if a colon was passed in for the exam name, then the colon was changed to
# a dash. This is because SoftwareSecure cannot handle a colon in the exam name
if ':' in exam['exam_name']:
self.assertIn('-', result['examName'])
self.assertNotIn(':', result['examName'])
for illegal_char in SOFTWARE_SECURE_INVALID_CHARS:
self.assertNotIn(illegal_char, result['examName'])
self.assertIn('_', result['examName'])
return result
with HTTMock(mock_response_content):
# patch the _get_payload method on the backend provider
# so that we can assert that we are called with the review policy
# undefined and that we use the system default
with patch.object(get_backend_provider(), '_get_payload', assert_get_payload_mock_no_policy): # pylint: disable=protected-access
attempt_id = create_exam_attempt(
exam_id,
self.user.id,
taking_as_proctored=True
)
self.assertGreater(attempt_id, 0)
for illegal_char in SOFTWARE_SECURE_INVALID_CHARS:
exam_id = create_exam(
course_id='foo/bar/baz',
content_id='content with {}'.format(illegal_char),
exam_name='Sample Exam with {} character'.format(illegal_char),
time_limit_mins=10,
is_proctored=True
)
# make sure we recorded that there is no review policy
attempt = get_exam_attempt_by_id(attempt_id)
self.assertIsNone(attempt['review_policy_id'])
with HTTMock(mock_response_content):
# patch the _get_payload method on the backend provider
# so that we can assert that we are called with the review policy
# undefined and that we use the system default
with patch.object(get_backend_provider(), '_get_payload', assert_get_payload_mock_no_policy): # pylint: disable=protected-access
attempt_id = create_exam_attempt(
exam_id,
self.user.id,
taking_as_proctored=True
)
self.assertGreater(attempt_id, 0)
# make sure we recorded that there is no review policy
attempt = get_exam_attempt_by_id(attempt_id)
self.assertIsNone(attempt['review_policy_id'])
def test_single_name_attempt(self):
"""
......
......@@ -34,7 +34,7 @@ def load_requirements(*requirements_paths):
setup(
name='edx-proctoring',
version='0.10.18',
version='0.10.19',
description='Proctoring subsystem for Open edX',
long_description=open('README.md').read(),
author='edX',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment