diff --git a/common/djangoapps/student/tests/test_certificates.py b/common/djangoapps/student/tests/test_certificates.py index af4a6db8f1..313f9b54f7 100644 --- a/common/djangoapps/student/tests/test_certificates.py +++ b/common/djangoapps/student/tests/test_certificates.py @@ -2,6 +2,7 @@ import unittest import ddt +import mock from django.conf import settings from django.core.urlresolvers import reverse @@ -15,9 +16,18 @@ from certificates.tests.factories import GeneratedCertificateFactory # pylint: from certificates.api import get_certificate_url # pylint: disable=import-error from course_modes.models import CourseMode +from student.models import LinkedInAddToProfileConfiguration + # pylint: disable=no-member +def _fake_is_request_in_microsite(): + """ + Mocked version of microsite helper method to always return true + """ + return True + + @ddt.ddt @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') class CertificateDisplayTest(ModuleStoreTestCase): @@ -98,6 +108,60 @@ class CertificateDisplayTest(ModuleStoreTestCase): self.assertContains(response, u'View Test_Certificate') self.assertContains(response, test_url) + def test_post_to_linkedin_invisibility(self): + """ + Verifies that the post certificate to linked button + does not appear by default (when config is not set) + """ + self._create_certificate('honor') + + # until we set up the configuration, the LinkedIn action + # button should not be visible + self._check_linkedin_visibility(False) + + def test_post_to_linkedin_visibility(self): + """ + Verifies that the post certificate to linked button appears + as expected + """ + self._create_certificate('honor') + + config = LinkedInAddToProfileConfiguration( + company_identifier='0_mC_o2MizqdtZEmkVXjH4eYwMj4DnkCWrZP_D9', + enabled=True + ) + config.save() + + # now we should see it + self._check_linkedin_visibility(True) + + @mock.patch("microsite_configuration.microsite.is_request_in_microsite", _fake_is_request_in_microsite) + def test_post_to_linkedin_microsite(self): + """ + Verifies behavior for microsites which disables the post to LinkedIn + feature (for now) + """ + self._create_certificate('honor') + + config = LinkedInAddToProfileConfiguration( + company_identifier='0_mC_o2MizqdtZEmkVXjH4eYwMj4DnkCWrZP_D9', + enabled=True + ) + config.save() + + # now we should not see it because we are in a microsite + self._check_linkedin_visibility(False) + + def _check_linkedin_visibility(self, is_visible): + """ + Performs assertions on the Dashboard + """ + response = self.client.get(reverse('dashboard')) + if is_visible: + self.assertContains(response, u'Add Certificate to LinkedIn Profile') + else: + self.assertNotContains(response, u'Add Certificate to LinkedIn Profile') + def _create_certificate(self, enrollment_mode): """Simulate that the user has a generated certificate. """ CourseEnrollmentFactory.create(user=self.user, course_id=self.course.id, mode=enrollment_mode) diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 15776e69dd..dcf9aacab6 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -363,7 +363,10 @@ def _cert_info(user, course_overview, cert_status, course_mode): # pylint: disa # Clicking this button sends the user to LinkedIn where they # can add the certificate information to their profile. linkedin_config = LinkedInAddToProfileConfiguration.current() - if linkedin_config.enabled: + + # posting certificates to LinkedIn is not currently + # supported in microsites/White Labels + if linkedin_config.enabled and not microsite.is_request_in_microsite(): status_dict['linked_in_url'] = linkedin_config.add_to_profile_url( course_overview.id, course_overview.display_name, diff --git a/lms/djangoapps/certificates/tests/test_webview_views.py b/lms/djangoapps/certificates/tests/test_webview_views.py index 44dc9223ea..18727eb04e 100644 --- a/lms/djangoapps/certificates/tests/test_webview_views.py +++ b/lms/djangoapps/certificates/tests/test_webview_views.py @@ -3,6 +3,7 @@ import json import ddt +import mock from uuid import uuid4 from nose.plugins.attrib import attr from mock import patch @@ -49,6 +50,13 @@ FEATURES_WITH_CUSTOM_CERTS_ENABLED = { FEATURES_WITH_CUSTOM_CERTS_ENABLED.update(FEATURES_WITH_CERTS_ENABLED) +def _fake_is_request_in_microsite(): + """ + Mocked version of microsite helper method to always return true + """ + return True + + @attr('shard_1') @ddt.ddt class CertificatesViewsTests(ModuleStoreTestCase, EventTrackingTestCase): @@ -161,7 +169,23 @@ class CertificatesViewsTests(ModuleStoreTestCase, EventTrackingTestCase): course_id=unicode(self.course.id) ) response = self.client.get(test_url) - self.assertTrue(urllib.quote_plus(self.request.build_absolute_uri(test_url)) in response.content) + self.assertIn(urllib.quote_plus(self.request.build_absolute_uri(test_url)), response.content) + + @override_settings(FEATURES=FEATURES_WITH_CERTS_ENABLED) + @mock.patch("microsite_configuration.microsite.is_request_in_microsite", _fake_is_request_in_microsite) + def test_linkedin_share_microsites(self): + """ + Test: LinkedIn share URL should not be visible when called from within a microsite (for now) + """ + self._add_course_certificates(count=1, signatory_count=1, is_active=True) + test_url = get_certificate_url( + user_id=self.user.id, + course_id=unicode(self.course.id) + ) + response = self.client.get(test_url) + + # the URL should not be present + self.assertNotIn(urllib.quote_plus(self.request.build_absolute_uri(test_url)), response.content) @override_settings(FEATURES=FEATURES_WITH_CERTS_ENABLED) def test_rendering_course_organization_data(self): diff --git a/lms/djangoapps/certificates/views/webview.py b/lms/djangoapps/certificates/views/webview.py index e075e1378a..11465db16b 100644 --- a/lms/djangoapps/certificates/views/webview.py +++ b/lms/djangoapps/certificates/views/webview.py @@ -430,7 +430,10 @@ def render_html_view(request, user_id, course_id): # Clicking this button sends the user to LinkedIn where they # can add the certificate information to their profile. linkedin_config = LinkedInAddToProfileConfiguration.current() - if linkedin_config.enabled: + + # posting certificates to LinkedIn is not currently + # supported in microsites/White Labels + if linkedin_config.enabled and not microsite.is_request_in_microsite(): context['linked_in_url'] = linkedin_config.add_to_profile_url( course.id, course.display_name,