test_access.py 7.07 KB
Newer Older
1 2 3 4
"""
Test instructor.access
"""

Miles Steele committed
5
from nose.tools import raises
6
from django.contrib.auth.models import Group
Miles Steele committed
7 8 9 10 11
from student.tests.factories import UserFactory
from xmodule.modulestore.tests.factories import CourseFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase

from django.test.utils import override_settings
12
from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE
Miles Steele committed
13

Miles Steele committed
14
from courseware.access import get_access_group_name
Miles Steele committed
15
from django_comment_common.models import (Role,
16 17 18 19 20
                                          FORUM_ROLE_MODERATOR)
from instructor.access import (allow_access,
                               revoke_access,
                               list_with_level,
                               update_forum_role_membership)
Miles Steele committed
21 22


23
@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE)
24 25
class TestInstructorAccessList(ModuleStoreTestCase):
    """ Test access listings. """
Miles Steele committed
26 27 28
    def setUp(self):
        self.course = CourseFactory.create()

29 30 31 32 33 34
        self.instructors = [UserFactory.create() for _ in xrange(4)]
        for user in self.instructors:
            allow_access(self.course, user, 'instructor')
        self.beta_testers = [UserFactory.create() for _ in xrange(4)]
        for user in self.beta_testers:
            allow_access(self.course, user, 'beta')
Miles Steele committed
35

36 37 38
    def test_list_instructors(self):
        instructors = list_with_level(self.course, 'instructor')
        self.assertEqual(set(instructors), set(self.instructors))
Miles Steele committed
39

40 41 42
    def test_list_beta(self):
        beta_testers = list_with_level(self.course, 'beta')
        self.assertEqual(set(beta_testers), set(self.beta_testers))
Miles Steele committed
43 44


45
@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE)
46 47 48 49
class TestInstructorAccessAllow(ModuleStoreTestCase):
    """ Test access allow. """
    def setUp(self):
        self.course = CourseFactory.create()
Miles Steele committed
50

51
    def test_allow(self):
Miles Steele committed
52
        user = UserFactory()
53 54 55 56 57
        allow_access(self.course, user, 'staff')
        group = Group.objects.get(
            name=get_access_group_name(self.course, 'staff')
        )
        self.assertIn(user, group.user_set.all())
Miles Steele committed
58

59 60 61 62 63 64 65 66 67 68 69 70 71 72
    def test_allow_twice(self):
        user = UserFactory()
        allow_access(self.course, user, 'staff')
        allow_access(self.course, user, 'staff')
        group = Group.objects.get(
            name=get_access_group_name(self.course, 'staff')
        )
        self.assertIn(user, group.user_set.all())

    def test_allow_beta(self):
        """ Test allow beta against list beta. """
        user = UserFactory()
        allow_access(self.course, user, 'beta')
        self.assertIn(user, list_with_level(self.course, 'beta'))
Miles Steele committed
73

74 75
    @raises(ValueError)
    def test_allow_badlevel(self):
Miles Steele committed
76
        user = UserFactory()
77 78 79
        allow_access(self.course, user, 'robot-not-a-level')
        group = Group.objects.get(name=get_access_group_name(self.course, 'robot-not-a-level'))
        self.assertIn(user, group.user_set.all())
Miles Steele committed
80

81 82 83 84 85 86
    @raises(Exception)
    def test_allow_noneuser(self):
        user = None
        allow_access(self.course, user, 'staff')
        group = Group.objects.get(name=get_access_group_name(self.course, 'staff'))
        self.assertIn(user, group.user_set.all())
Miles Steele committed
87

Will Daly committed
88

89
@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE)
90 91
class TestInstructorAccessRevoke(ModuleStoreTestCase):
    """ Test access revoke. """
Miles Steele committed
92 93 94
    def setUp(self):
        self.course = CourseFactory.create()

95 96 97 98 99 100
        self.staff = [UserFactory.create() for _ in xrange(4)]
        for user in self.staff:
            allow_access(self.course, user, 'staff')
        self.beta_testers = [UserFactory.create() for _ in xrange(4)]
        for user in self.beta_testers:
            allow_access(self.course, user, 'beta')
Miles Steele committed
101

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
    def test_revoke(self):
        user = self.staff[0]
        revoke_access(self.course, user, 'staff')
        group = Group.objects.get(
            name=get_access_group_name(self.course, 'staff')
        )
        self.assertNotIn(user, group.user_set.all())

    def test_revoke_twice(self):
        user = self.staff[0]
        revoke_access(self.course, user, 'staff')
        group = Group.objects.get(
            name=get_access_group_name(self.course, 'staff')
        )
        self.assertNotIn(user, group.user_set.all())

    def test_revoke_beta(self):
        user = self.beta_testers[0]
        revoke_access(self.course, user, 'beta')
        self.assertNotIn(user, list_with_level(self.course, 'beta'))
Miles Steele committed
122

123 124 125 126 127 128 129 130
    @raises(ValueError)
    def test_revoke_badrolename(self):
        user = UserFactory()
        revoke_access(self.course, user, 'robot-not-a-level')
        group = Group.objects.get(
            name=get_access_group_name(self.course, 'robot-not-a-level')
        )
        self.assertNotIn(user, group.user_set.all())
Miles Steele committed
131 132


133
@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE)
134
class TestInstructorAccessForum(ModuleStoreTestCase):
135 136 137
    """
    Test forum access control.
    """
Miles Steele committed
138 139 140
    def setUp(self):
        self.course = CourseFactory.create()

141 142 143 144 145
        self.mod_role = Role.objects.create(
            course_id=self.course.id,
            name=FORUM_ROLE_MODERATOR
        )
        self.moderators = [UserFactory.create() for _ in xrange(4)]
146 147
        for user in self.moderators:
            self.mod_role.users.add(user)
Miles Steele committed
148

149
    def test_allow(self):
Miles Steele committed
150 151 152 153
        user = UserFactory.create()
        update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow')
        self.assertIn(user, self.mod_role.users.all())

154
    def test_allow_twice(self):
Miles Steele committed
155 156
        user = UserFactory.create()
        update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow')
157
        self.assertIn(user, self.mod_role.users.all())
Miles Steele committed
158 159 160 161
        update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow')
        self.assertIn(user, self.mod_role.users.all())

    @raises(Role.DoesNotExist)
162
    def test_allow_badrole(self):
Miles Steele committed
163
        user = UserFactory.create()
164
        update_forum_role_membership(self.course.id, user, 'robot-not-a-real-role', 'allow')
Miles Steele committed
165

166 167
    def test_revoke(self):
        user = self.moderators[0]
Miles Steele committed
168 169 170
        update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
        self.assertNotIn(user, self.mod_role.users.all())

171 172
    def test_revoke_twice(self):
        user = self.moderators[0]
Miles Steele committed
173
        update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
174
        self.assertNotIn(user, self.mod_role.users.all())
Miles Steele committed
175 176 177
        update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
        self.assertNotIn(user, self.mod_role.users.all())

178 179 180 181
    def test_revoke_notallowed(self):
        user = UserFactory()
        update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
        self.assertNotIn(user, self.mod_role.users.all())
Miles Steele committed
182 183

    @raises(Role.DoesNotExist)
184 185 186
    def test_revoke_badrole(self):
        user = self.moderators[0]
        update_forum_role_membership(self.course.id, user, 'robot-not-a-real-role', 'allow')
Miles Steele committed
187 188

    @raises(ValueError)
189 190
    def test_bad_mode(self):
        user = UserFactory()
Miles Steele committed
191
        update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'robot-not-a-mode')