134 lines
4.4 KiB
Python
134 lines
4.4 KiB
Python
"""
|
|
Tests for course certificate tasks.
|
|
"""
|
|
|
|
|
|
from unittest import mock
|
|
from unittest.mock import call, patch
|
|
|
|
import ddt
|
|
from django.test import TestCase
|
|
from opaque_keys.edx.keys import CourseKey
|
|
|
|
from common.djangoapps.student.tests.factories import UserFactory
|
|
from lms.djangoapps.certificates.tasks import generate_certificate
|
|
from lms.djangoapps.verify_student.models import IDVerificationAttempt
|
|
|
|
|
|
@ddt.ddt
|
|
class GenerateUserCertificateTest(TestCase):
|
|
"""
|
|
Tests for course certificate tasks
|
|
"""
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
self.user = UserFactory()
|
|
|
|
@patch('lms.djangoapps.certificates.tasks.generate_user_certificates')
|
|
@patch('lms.djangoapps.certificates.tasks.User.objects.get')
|
|
def test_generate_user_certs(self, user_get_mock, generate_user_certs_mock):
|
|
course_key = 'course-v1:edX+CS101+2017_T2'
|
|
kwargs = {
|
|
'student': 'student-id',
|
|
'course_key': course_key,
|
|
'otherarg': 'c',
|
|
'otherotherarg': 'd'
|
|
}
|
|
generate_certificate.apply_async(kwargs=kwargs).get()
|
|
|
|
expected_student = user_get_mock.return_value
|
|
generate_user_certs_mock.assert_called_with(
|
|
student=expected_student,
|
|
course_key=CourseKey.from_string(course_key),
|
|
otherarg='c',
|
|
otherotherarg='d'
|
|
)
|
|
user_get_mock.assert_called_once_with(id='student-id')
|
|
|
|
@ddt.data('student', 'course_key')
|
|
def test_missing_args(self, missing_arg):
|
|
kwargs = {'student': 'a', 'course_key': 'b', 'otherarg': 'c'}
|
|
del kwargs[missing_arg]
|
|
|
|
with patch('lms.djangoapps.certificates.tasks.User.objects.get'):
|
|
with self.assertRaisesRegex(KeyError, missing_arg):
|
|
generate_certificate.apply_async(kwargs=kwargs).get()
|
|
|
|
@patch('lms.djangoapps.certificates.tasks.generate_user_certificates')
|
|
@patch('lms.djangoapps.verify_student.services.IDVerificationService.user_status')
|
|
def test_retry_until_verification_status_updates(self, user_status_mock, generate_user_certs_mock):
|
|
course_key = 'course-v1:edX+CS101+2017_T2'
|
|
student = UserFactory()
|
|
|
|
kwargs = {
|
|
'student': student.id,
|
|
'course_key': course_key,
|
|
'expected_verification_status': IDVerificationAttempt.STATUS.approved
|
|
}
|
|
|
|
user_status_mock.side_effect = [
|
|
{'status': 'pending', 'error': '', 'should_display': True},
|
|
{'status': 'approved', 'error': '', 'should_display': True}
|
|
]
|
|
|
|
generate_certificate.apply_async(kwargs=kwargs).get()
|
|
|
|
user_status_mock.assert_has_calls([
|
|
call(student),
|
|
call(student)
|
|
])
|
|
|
|
generate_user_certs_mock.assert_called_once_with(
|
|
student=student,
|
|
course_key=CourseKey.from_string(course_key)
|
|
)
|
|
|
|
def test_generation(self):
|
|
"""
|
|
Verify the task handles V2 certificate generation
|
|
"""
|
|
course_key = 'course-v1:edX+DemoX+Demo_Course'
|
|
|
|
with mock.patch(
|
|
'lms.djangoapps.certificates.tasks.generate_course_certificate',
|
|
return_value=None
|
|
) as mock_generate_cert:
|
|
kwargs = {
|
|
'student': self.user.id,
|
|
'course_key': course_key,
|
|
'v2_certificate': True
|
|
}
|
|
|
|
generate_certificate.apply_async(kwargs=kwargs)
|
|
mock_generate_cert.assert_called_with(
|
|
user=self.user,
|
|
course_key=CourseKey.from_string(course_key),
|
|
generation_mode='batch'
|
|
)
|
|
|
|
def test_generation_mode(self):
|
|
"""
|
|
Verify the task handles V2 certificate generation with a generation mode
|
|
"""
|
|
course_key = 'course-v1:edX+DemoX+Demo_Course'
|
|
gen_mode = 'self'
|
|
|
|
with mock.patch(
|
|
'lms.djangoapps.certificates.tasks.generate_course_certificate',
|
|
return_value=None
|
|
) as mock_generate_cert:
|
|
kwargs = {
|
|
'student': self.user.id,
|
|
'course_key': course_key,
|
|
'v2_certificate': True,
|
|
'generation_mode': gen_mode
|
|
}
|
|
|
|
generate_certificate.apply_async(kwargs=kwargs)
|
|
mock_generate_cert.assert_called_with(
|
|
user=self.user,
|
|
course_key=CourseKey.from_string(course_key),
|
|
generation_mode=gen_mode
|
|
)
|