From 9fb1d9ecf2aaf4e7cdfd11fa95682abeb96b416e Mon Sep 17 00:00:00 2001 From: Sarina Canelake Date: Thu, 17 Oct 2013 14:39:20 -0400 Subject: [PATCH] Remove 'Email Settings' link on student dashboard for unauth courses --- .../student/tests/test_bulk_email_settings.py | 134 ++++++++++++++++++ lms/djangoapps/instructor/tests/test_email.py | 3 +- .../instructor/tests/test_legacy_email.py | 70 +-------- lms/templates/dashboard.html | 4 +- 4 files changed, 144 insertions(+), 67 deletions(-) create mode 100644 common/djangoapps/student/tests/test_bulk_email_settings.py diff --git a/common/djangoapps/student/tests/test_bulk_email_settings.py b/common/djangoapps/student/tests/test_bulk_email_settings.py new file mode 100644 index 0000000000..98fddeaddd --- /dev/null +++ b/common/djangoapps/student/tests/test_bulk_email_settings.py @@ -0,0 +1,134 @@ +""" +Unit tests for email feature flag in student dashboard. Additionally tests +that bulk email is always disabled for non-Mongo backed courses, regardless +of email feature flag, and that the view is conditionally available when +Course Auth is turned on. +""" + +from django.test.utils import override_settings +from django.conf import settings +from django.core.urlresolvers import reverse, NoReverseMatch +from unittest.case import SkipTest + +from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE +from student.tests.factories import UserFactory, CourseEnrollmentFactory +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.factories import CourseFactory +from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE + +from bulk_email.models import CourseAuthorization + +from mock import patch + + +@override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE) +class TestStudentDashboardEmailView(ModuleStoreTestCase): + """ + Check for email view displayed with flag + """ + def setUp(self): + self.course = CourseFactory.create() + + # Create student account + student = UserFactory.create() + CourseEnrollmentFactory.create(user=student, course_id=self.course.id) + self.client.login(username=student.username, password="test") + + try: + # URL for dashboard + self.url = reverse('dashboard') + except NoReverseMatch: + raise SkipTest("Skip this test if url cannot be found (ie running from CMS tests)") + # URL for email settings modal + self.email_modal_link = ( + ('Email Settings').format( + self.course.org, + self.course.number, + self.course.display_name.replace(' ', '_') + ) + ) + + def tearDown(self): + """ + Undo all patches. + """ + patch.stopall() + + @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': False}) + def test_email_flag_true(self): + # Assert that the URL for the email view is in the response + response = self.client.get(self.url) + self.assertTrue(self.email_modal_link in response.content) + + @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': False}) + def test_email_flag_false(self): + # Assert that the URL for the email view is not in the response + response = self.client.get(self.url) + self.assertFalse(self.email_modal_link in response.content) + + @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': True}) + def test_email_unauthorized(self): + # Assert that instructor email is not enabled for this course + self.assertFalse(CourseAuthorization.instructor_email_enabled(self.course.id)) + # Assert that the URL for the email view is not in the response + # if this course isn't authorized + response = self.client.get(self.url) + self.assertFalse(self.email_modal_link in response.content) + + @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': True}) + def test_email_authorized(self): + # Authorize the course to use email + cauth = CourseAuthorization(course_id=self.course.id, email_enabled=True) + cauth.save() + # Assert that instructor email is enabled for this course + self.assertTrue(CourseAuthorization.instructor_email_enabled(self.course.id)) + # Assert that the URL for the email view is not in the response + # if this course isn't authorized + response = self.client.get(self.url) + self.assertTrue(self.email_modal_link in response.content) + + +@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE) +class TestStudentDashboardEmailViewXMLBacked(ModuleStoreTestCase): + """ + Check for email view on student dashboard, with XML backed course. + """ + def setUp(self): + self.course_name = 'edX/toy/2012_Fall' + + # Create student account + student = UserFactory.create() + CourseEnrollmentFactory.create(user=student, course_id=self.course_name) + self.client.login(username=student.username, password="test") + + try: + # URL for dashboard + self.url = reverse('dashboard') + except NoReverseMatch: + raise SkipTest("Skip this test if url cannot be found (ie running from CMS tests)") + + # URL for email settings modal + self.email_modal_link = ( + ('Email Settings').format( + 'edX', + 'toy', + '2012_Fall' + ) + ) + + @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': False}) + def test_email_flag_true_xml_store(self): + # The flag is enabled, and since REQUIRE_COURSE_EMAIL_AUTH is False, all courses should + # be authorized to use email. But the course is not Mongo-backed (should not work) + response = self.client.get(self.url) + self.assertFalse(self.email_modal_link in response.content) + + @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': False, 'REQUIRE_COURSE_EMAIL_AUTH': False}) + def test_email_flag_false_xml_store(self): + # Email disabled, shouldn't see link. + response = self.client.get(self.url) + self.assertFalse(self.email_modal_link in response.content) diff --git a/lms/djangoapps/instructor/tests/test_email.py b/lms/djangoapps/instructor/tests/test_email.py index 2085ac1384..f3b4194228 100644 --- a/lms/djangoapps/instructor/tests/test_email.py +++ b/lms/djangoapps/instructor/tests/test_email.py @@ -1,7 +1,8 @@ """ Unit tests for email feature flag in new instructor dashboard. Additionally tests that bulk email is always disabled for -non-Mongo backed courses, regardless of email feature flag. +non-Mongo backed courses, regardless of email feature flag, and +that the view is conditionally available when Course Auth is turned on. """ from django.test.utils import override_settings diff --git a/lms/djangoapps/instructor/tests/test_legacy_email.py b/lms/djangoapps/instructor/tests/test_legacy_email.py index fed6c0e1b0..25a70e4f8a 100644 --- a/lms/djangoapps/instructor/tests/test_legacy_email.py +++ b/lms/djangoapps/instructor/tests/test_legacy_email.py @@ -1,16 +1,15 @@ """ -Unit tests for email feature flag in legacy instructor dashboard -and student dashboard. Additionally tests that bulk email -is always disabled for non-Mongo backed courses, regardless -of email feature flag. +Unit tests for email feature flag in legacy instructor dashboard. +Additionally tests that bulk email is always disabled for non-Mongo +backed courses, regardless of email feature flag, and that the +view is conditionally available when Course Auth is turned on. """ - from django.test.utils import override_settings from django.conf import settings from django.core.urlresolvers import reverse from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE -from student.tests.factories import AdminFactory, UserFactory, CourseEnrollmentFactory +from student.tests.factories import AdminFactory from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore import XML_MODULESTORE_TYPE @@ -109,62 +108,3 @@ class TestInstructorDashboardEmailView(ModuleStoreTestCase): # Assert that the URL for the email view is not in the response response = self.client.get(self.url) self.assertFalse(self.email_link in response.content) - - -@override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE) -class TestStudentDashboardEmailView(ModuleStoreTestCase): - """ - Check for email view displayed with flag - """ - def setUp(self): - self.course = CourseFactory.create() - - # Create student account - student = UserFactory.create() - CourseEnrollmentFactory.create(user=student, course_id=self.course.id) - self.client.login(username=student.username, password="test") - - # URL for dashboard - self.url = reverse('dashboard') - # URL for email settings modal - self.email_modal_link = (('Email Settings') - .format(self.course.org, - self.course.number, - self.course.display_name.replace(' ', '_'))) - - def tearDown(self): - """ - Undo all patches. - """ - patch.stopall() - - @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True}) - def test_email_flag_true(self): - # Assert that the URL for the email view is in the response - response = self.client.get(self.url) - self.assertTrue(self.email_modal_link in response.content) - - @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': False}) - def test_email_flag_false(self): - # Assert that the URL for the email view is not in the response - response = self.client.get(self.url) - self.assertFalse(self.email_modal_link in response.content) - - @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True}) - def test_email_flag_true_xml_store(self): - # If the enable email setting is enabled, but this is an XML backed course, - # the email view shouldn't be available on the instructor dashboard. - - # The course factory uses a MongoModuleStore backing, so patch the - # `get_modulestore_type` method to pretend to be XML-backed. - # This is OK; we're simply testing that the `is_mongo_modulestore_type` flag - # in `instructor/views/legacy.py` is doing the correct thing. - - with patch('xmodule.modulestore.mongo.base.MongoModuleStore.get_modulestore_type') as mock_modulestore: - mock_modulestore.return_value = XML_MODULESTORE_TYPE - - # Assert that the URL for the email view is not in the response - response = self.client.get(self.url) - self.assertFalse(self.email_modal_link in response.content) diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index f7e92ccce2..a68d8a75b5 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -9,6 +9,8 @@ from xmodule.modulestore import MONGO_MODULESTORE_TYPE from xmodule.modulestore.django import modulestore + from bulk_email.models import CourseAuthorization + import waffle %> <%inherit file="main.html" /> @@ -326,7 +328,7 @@ ${_('Unregister')} - % if settings.MITX_FEATURES['ENABLE_INSTRUCTOR_EMAIL'] and modulestore().get_modulestore_type(course.id) == MONGO_MODULESTORE_TYPE: + % if settings.MITX_FEATURES['ENABLE_INSTRUCTOR_EMAIL'] and modulestore().get_modulestore_type(course.id) == MONGO_MODULESTORE_TYPE and CourseAuthorization.instructor_email_enabled(course.id): ${_('Email Settings')} % endif