|
3 | 3 |
|
4 | 4 | import datetime |
5 | 5 | from unittest import skipUnless |
6 | | -from unittest.mock import patch |
| 6 | +from unittest.mock import patch, Mock |
7 | 7 | from urllib.parse import urlencode |
8 | 8 | from uuid import uuid4 |
9 | 9 |
|
|
35 | 35 | GeneratedCertificateFactory, |
36 | 36 | LinkedInAddToProfileConfigurationFactory |
37 | 37 | ) |
| 38 | +from lms.djangoapps.certificates.views.webview import _get_user_certificate |
38 | 39 | from lms.djangoapps.certificates.utils import get_certificate_url |
39 | 40 | from openedx.core.djangoapps.dark_lang.models import DarkLangConfig |
40 | 41 | from openedx.core.djangoapps.site_configuration.tests.test_util import ( |
|
46 | 47 | from openedx.core.lib.courses import course_image_url |
47 | 48 | from openedx.core.lib.tests.assertions.events import assert_event_matches |
48 | 49 | from openedx.features.name_affirmation_api.utils import get_name_affirmation_service |
49 | | -from xmodule.data import CertificatesDisplayBehaviors # lint-amnesty, pylint: disable=wrong-import-order |
50 | | -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order |
51 | | -from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=wrong-import-order |
| 50 | +from xmodule.data import CertificatesDisplayBehaviors |
| 51 | +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase |
| 52 | +from xmodule.modulestore.tests.factories import CourseFactory |
52 | 53 |
|
53 | 54 | FEATURES_WITH_CERTS_ENABLED = settings.FEATURES.copy() |
54 | 55 | FEATURES_WITH_CERTS_ENABLED['CERTIFICATES_HTML_VIEW'] = True |
@@ -1707,6 +1708,115 @@ def test_verified_certificate_description(self, enable_cert_idv_requirement): |
1707 | 1708 | self.assertNotContains(response, 'identity of the learner has been checked and is valid') |
1708 | 1709 | self.assertContains(response, 'IDV disabled') |
1709 | 1710 |
|
| 1711 | + @patch("lms.djangoapps.certificates.views.webview.datetime") |
| 1712 | + def test_get_user_certificate_preview_instructor_paced_early_no_info(self, mock_datetime): |
| 1713 | + """ |
| 1714 | + A test to verify that the _get_user_certificate utility function returns the expected date for an instructor |
| 1715 | + paced course with a display behavior of 'EARLY_NO_INFO' when the certificate is being previewed. |
| 1716 | + """ |
| 1717 | + expected_date = datetime.date(2024, 5, 2) |
| 1718 | + mock_datetime.now.return_value.date.return_value = expected_date |
| 1719 | + |
| 1720 | + mock_request = Mock() |
| 1721 | + mock_request.user.has_perm.return_value = True |
| 1722 | + |
| 1723 | + self.course.certificates_display_behavior = CertificatesDisplayBehaviors.EARLY_NO_INFO |
| 1724 | + self.course.certificate_available_date = None |
| 1725 | + self.course.self_paced = False |
| 1726 | + |
| 1727 | + cert = _get_user_certificate(mock_request, self.user, self.course.id, self.course, preview_mode='verified') |
| 1728 | + assert cert.modified_date == expected_date |
| 1729 | + |
| 1730 | + def test_get_user_certificate_preview_instructor_paced_end(self): |
| 1731 | + """ |
| 1732 | + A test to verify that the _get_user_certificate utility function returns the expected date for an instructor |
| 1733 | + paced course with a display behavior of 'END' when the certificate is being previewed. |
| 1734 | + """ |
| 1735 | + course_run_end_date = datetime.datetime(2024, 8, 19, 0, 0, 0) |
| 1736 | + |
| 1737 | + mock_request = Mock() |
| 1738 | + mock_request.user.has_perm.return_value = True |
| 1739 | + |
| 1740 | + self.course.certificates_display_behavior = CertificatesDisplayBehaviors.END |
| 1741 | + self.course.certificate_available_date = None |
| 1742 | + self.course.self_paced = False |
| 1743 | + self.course.end = course_run_end_date |
| 1744 | + |
| 1745 | + cert = _get_user_certificate(mock_request, self.user, self.course.id, self.course, preview_mode='verified') |
| 1746 | + assert cert.modified_date == course_run_end_date |
| 1747 | + |
| 1748 | + def test_get_user_certificate_preview_instructor_paced_end_with_date(self): |
| 1749 | + """ |
| 1750 | + A test to verify that the _get_user_certificate utility function returns the expected date for an instructor |
| 1751 | + paced course with a display behavior of 'END_WITH_DATE' when the certificate is being previewed. |
| 1752 | + """ |
| 1753 | + course_run_certificate_available_date = datetime.datetime(2024, 3, 14, 0, 0, 0) |
| 1754 | + |
| 1755 | + mock_request = Mock() |
| 1756 | + mock_request.user.has_perm.return_value = True |
| 1757 | + |
| 1758 | + self.course.certificates_display_behavior = CertificatesDisplayBehaviors.END_WITH_DATE |
| 1759 | + self.course.certificate_available_date = course_run_certificate_available_date |
| 1760 | + self.course.self_paced = False |
| 1761 | + |
| 1762 | + cert = _get_user_certificate(mock_request, self.user, self.course.id, self.course, preview_mode='verified') |
| 1763 | + assert cert.modified_date == course_run_certificate_available_date |
| 1764 | + |
| 1765 | + @patch("lms.djangoapps.certificates.views.webview.datetime") |
| 1766 | + def test_get_user_certificate_preview_self_paced(self, mock_datetime): |
| 1767 | + """ |
| 1768 | + A test to verify that the _get_user_certificate utility function returns the expected date for a self paced |
| 1769 | + course when the certificate is being previewed. |
| 1770 | + """ |
| 1771 | + expected_date = datetime.date(2024, 3, 10) |
| 1772 | + mock_datetime.now.return_value.date.return_value = expected_date |
| 1773 | + |
| 1774 | + mock_request = Mock() |
| 1775 | + mock_request.user.has_perm.return_value = True |
| 1776 | + |
| 1777 | + self.course.certificates_display_behavior = CertificatesDisplayBehaviors.EARLY_NO_INFO |
| 1778 | + self.course.certificate_available_date = None |
| 1779 | + self.course.self_paced = True |
| 1780 | + |
| 1781 | + cert = _get_user_certificate(mock_request, self.user, self.course.id, self.course, preview_mode='verified') |
| 1782 | + assert cert.modified_date == expected_date |
| 1783 | + |
| 1784 | + def test_get_user_certificate(self): |
| 1785 | + """ |
| 1786 | + A test to verify that the _get_user_certificate utility function returns the correct certificate when requested. |
| 1787 | + """ |
| 1788 | + mock_request = Mock() |
| 1789 | + |
| 1790 | + cert = _get_user_certificate(mock_request, self.user, self.course.id, self.course) |
| 1791 | + assert cert.course_id == self.course.id |
| 1792 | + assert cert.user == self.user |
| 1793 | + assert cert.status == CertificateStatuses.downloadable |
| 1794 | + |
| 1795 | + def test_get_user_certificate_no_eligible_cert(self): |
| 1796 | + """ |
| 1797 | + A test to verify the behavior of the _get_user_certificate utility function when there is no eligible |
| 1798 | + certificate to retrieve. |
| 1799 | + """ |
| 1800 | + self.cert.status = CertificateStatuses.unavailable |
| 1801 | + self.cert.save() |
| 1802 | + |
| 1803 | + mock_request = Mock() |
| 1804 | + |
| 1805 | + cert = _get_user_certificate(mock_request, self.user, self.course.id, self.course) |
| 1806 | + assert cert is None |
| 1807 | + |
| 1808 | + def test_get_user_certificate_no_cert(self): |
| 1809 | + """ |
| 1810 | + A test to verify the behavior of the _get_user_certificate utility function when there is no certificate to |
| 1811 | + retrieve. |
| 1812 | + """ |
| 1813 | + GeneratedCertificate.objects.all().delete() |
| 1814 | + |
| 1815 | + mock_request = Mock() |
| 1816 | + |
| 1817 | + cert = _get_user_certificate(mock_request, self.user, self.course.id, self.course) |
| 1818 | + assert cert is None |
| 1819 | + |
1710 | 1820 |
|
1711 | 1821 | class CertificateEventTests(CommonCertificatesTestCase, EventTrackingTestCase): |
1712 | 1822 | """ |
|
0 commit comments