test_authz.py 9.15 KB
Newer Older
1 2 3 4 5 6
"""
Tests authz.py
"""
import mock

from django.test import TestCase
7
from django.contrib.auth.models import User, AnonymousUser
8
from django.core.exceptions import PermissionDenied
9

10 11
from student.roles import CourseInstructorRole, CourseStaffRole, CourseCreatorRole
from student.tests.factories import AdminFactory
12
from student.auth import user_has_role, add_users, remove_users
13
from opaque_keys.edx.locations import SlashSeparatedCourseKey
14

cahrens committed
15

16 17 18 19
class CreatorGroupTest(TestCase):
    """
    Tests for the course creator group.
    """
cahrens committed
20

21 22
    def setUp(self):
        """ Test case setup """
23
        super(CreatorGroupTest, self).setUp()
24
        self.user = User.objects.create_user('testuser', 'test+courses@edx.org', 'foo')
25 26
        self.admin = User.objects.create_user('Mark', 'admin+courses@edx.org', 'foo')
        self.admin.is_staff = True
27 28 29

    def test_creator_group_not_enabled(self):
        """
30
        Tests that CourseCreatorRole().has_user always returns True if ENABLE_CREATOR_GROUP
31 32
        and DISABLE_COURSE_CREATION are both not turned on.
        """
33
        self.assertTrue(user_has_role(self.user, CourseCreatorRole()))
34 35 36

    def test_creator_group_enabled_but_empty(self):
        """ Tests creator group feature on, but group empty. """
37
        with mock.patch.dict('django.conf.settings.FEATURES', {"ENABLE_CREATOR_GROUP": True}):
38
            self.assertFalse(user_has_role(self.user, CourseCreatorRole()))
39

40
            # Make user staff. This will cause CourseCreatorRole().has_user to return True.
41
            self.user.is_staff = True
42
            self.assertTrue(user_has_role(self.user, CourseCreatorRole()))
43 44 45

    def test_creator_group_enabled_nonempty(self):
        """ Tests creator group feature on, user added. """
46
        with mock.patch.dict('django.conf.settings.FEATURES', {"ENABLE_CREATOR_GROUP": True}):
47
            add_users(self.admin, CourseCreatorRole(), self.user)
48
            self.assertTrue(user_has_role(self.user, CourseCreatorRole()))
49 50 51

            # check that a user who has not been added to the group still returns false
            user_not_added = User.objects.create_user('testuser2', 'test+courses2@edx.org', 'foo2')
52
            self.assertFalse(user_has_role(user_not_added, CourseCreatorRole()))
53

54 55
            # remove first user from the group and verify that CourseCreatorRole().has_user now returns false
            remove_users(self.admin, CourseCreatorRole(), self.user)
56
            self.assertFalse(user_has_role(self.user, CourseCreatorRole()))
57 58 59

    def test_course_creation_disabled(self):
        """ Tests that the COURSE_CREATION_DISABLED flag overrides course creator group settings. """
60
        with mock.patch.dict('django.conf.settings.FEATURES',
cahrens committed
61
                             {'DISABLE_COURSE_CREATION': True, "ENABLE_CREATOR_GROUP": True}):
62
            # Add user to creator group.
63
            add_users(self.admin, CourseCreatorRole(), self.user)
64 65

            # DISABLE_COURSE_CREATION overrides (user is not marked as staff).
66
            self.assertFalse(user_has_role(self.user, CourseCreatorRole()))
67

68
            # Mark as staff. Now CourseCreatorRole().has_user returns true.
69
            self.user.is_staff = True
70
            self.assertTrue(user_has_role(self.user, CourseCreatorRole()))
71 72 73

            # Remove user from creator group. CourseCreatorRole().has_user still returns true because is_staff=True
            remove_users(self.admin, CourseCreatorRole(), self.user)
74
            self.assertTrue(user_has_role(self.user, CourseCreatorRole()))
75 76 77 78 79

    def test_add_user_not_authenticated(self):
        """
        Tests that adding to creator group fails if user is not authenticated
        """
80 81 82 83
        with mock.patch.dict(
            'django.conf.settings.FEATURES',
            {'DISABLE_COURSE_CREATION': False, "ENABLE_CREATOR_GROUP": True}
        ):
84 85 86
            anonymous_user = AnonymousUser()
            role = CourseCreatorRole()
            add_users(self.admin, role, anonymous_user)
87
            self.assertFalse(user_has_role(anonymous_user, role))
88

89 90 91 92
    def test_add_user_not_active(self):
        """
        Tests that adding to creator group fails if user is not active
        """
93 94 95 96
        with mock.patch.dict(
            'django.conf.settings.FEATURES',
            {'DISABLE_COURSE_CREATION': False, "ENABLE_CREATOR_GROUP": True}
        ):
97 98
            self.user.is_active = False
            add_users(self.admin, CourseCreatorRole(), self.user)
99
            self.assertFalse(user_has_role(self.user, CourseCreatorRole()))
100

101 102 103
    def test_add_user_to_group_requires_staff_access(self):
        with self.assertRaises(PermissionDenied):
            self.admin.is_staff = False
104
            add_users(self.admin, CourseCreatorRole(), self.user)
105 106

        with self.assertRaises(PermissionDenied):
107
            add_users(self.user, CourseCreatorRole(), self.user)
108 109 110 111

    def test_add_user_to_group_requires_active(self):
        with self.assertRaises(PermissionDenied):
            self.admin.is_active = False
112
            add_users(self.admin, CourseCreatorRole(), self.user)
113 114 115

    def test_add_user_to_group_requires_authenticated(self):
        with self.assertRaises(PermissionDenied):
116
            self.admin.is_authenticated = mock.Mock(return_value=False)
117
            add_users(self.admin, CourseCreatorRole(), self.user)
118 119 120 121

    def test_remove_user_from_group_requires_staff_access(self):
        with self.assertRaises(PermissionDenied):
            self.admin.is_staff = False
122
            remove_users(self.admin, CourseCreatorRole(), self.user)
123 124 125 126

    def test_remove_user_from_group_requires_active(self):
        with self.assertRaises(PermissionDenied):
            self.admin.is_active = False
127
            remove_users(self.admin, CourseCreatorRole(), self.user)
128 129 130

    def test_remove_user_from_group_requires_authenticated(self):
        with self.assertRaises(PermissionDenied):
131
            self.admin.is_authenticated = mock.Mock(return_value=False)
132
            remove_users(self.admin, CourseCreatorRole(), self.user)
133

134 135 136 137 138 139 140 141

class CourseGroupTest(TestCase):
    """
    Tests for instructor and staff groups for a particular course.
    """

    def setUp(self):
        """ Test case setup """
142
        super(CourseGroupTest, self).setUp()
143
        self.global_admin = AdminFactory()
144 145
        self.creator = User.objects.create_user('testcreator', 'testcreator+courses@edx.org', 'foo')
        self.staff = User.objects.create_user('teststaff', 'teststaff+courses@edx.org', 'foo')
146
        self.course_key = SlashSeparatedCourseKey('mitX', '101', 'test')
147 148 149 150 151 152

    def test_add_user_to_course_group(self):
        """
        Tests adding user to course group (happy path).
        """
        # Create groups for a new course (and assign instructor role to the creator).
153
        self.assertFalse(user_has_role(self.creator, CourseInstructorRole(self.course_key)))
154 155
        add_users(self.global_admin, CourseInstructorRole(self.course_key), self.creator)
        add_users(self.global_admin, CourseStaffRole(self.course_key), self.creator)
156
        self.assertTrue(user_has_role(self.creator, CourseInstructorRole(self.course_key)))
157 158

        # Add another user to the staff role.
159
        self.assertFalse(user_has_role(self.staff, CourseStaffRole(self.course_key)))
160
        add_users(self.creator, CourseStaffRole(self.course_key), self.staff)
161
        self.assertTrue(user_has_role(self.staff, CourseStaffRole(self.course_key)))
162 163 164 165 166

    def test_add_user_to_course_group_permission_denied(self):
        """
        Verifies PermissionDenied if caller of add_user_to_course_group is not instructor role.
        """
167 168
        add_users(self.global_admin, CourseInstructorRole(self.course_key), self.creator)
        add_users(self.global_admin, CourseStaffRole(self.course_key), self.creator)
169
        with self.assertRaises(PermissionDenied):
170
            add_users(self.staff, CourseStaffRole(self.course_key), self.staff)
171

172
    def test_remove_user_from_course_group(self):
173 174 175
        """
        Tests removing user from course group (happy path).
        """
176 177
        add_users(self.global_admin, CourseInstructorRole(self.course_key), self.creator)
        add_users(self.global_admin, CourseStaffRole(self.course_key), self.creator)
178

179
        add_users(self.creator, CourseStaffRole(self.course_key), self.staff)
180
        self.assertTrue(user_has_role(self.staff, CourseStaffRole(self.course_key)))
181

182
        remove_users(self.creator, CourseStaffRole(self.course_key), self.staff)
183
        self.assertFalse(user_has_role(self.staff, CourseStaffRole(self.course_key)))
184

185
        remove_users(self.creator, CourseInstructorRole(self.course_key), self.creator)
186
        self.assertFalse(user_has_role(self.creator, CourseInstructorRole(self.course_key)))
187 188 189 190 191

    def test_remove_user_from_course_group_permission_denied(self):
        """
        Verifies PermissionDenied if caller of remove_user_from_course_group is not instructor role.
        """
192
        add_users(self.global_admin, CourseInstructorRole(self.course_key), self.creator)
193
        another_staff = User.objects.create_user('another', 'teststaff+anothercourses@edx.org', 'foo')
194
        add_users(self.global_admin, CourseStaffRole(self.course_key), self.creator, self.staff, another_staff)
195
        with self.assertRaises(PermissionDenied):
196
            remove_users(self.staff, CourseStaffRole(self.course_key), another_staff)