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

Miles Steele committed
5
from nose.tools import raises
6
from nose.plugins.attrib import attr
Miles Steele committed
7 8
from student.tests.factories import UserFactory
from xmodule.modulestore.tests.factories import CourseFactory
9
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
Miles Steele committed
10

11
from student.roles import CourseBetaTesterRole, CourseStaffRole, CourseCcxCoachRole
Miles Steele committed
12 13

from django_comment_common.models import (Role,
14
                                          FORUM_ROLE_MODERATOR)
15
from lms.djangoapps.instructor.access import (allow_access, revoke_access, list_with_level, update_forum_role)
Miles Steele committed
16 17


18
@attr(shard=1)
19
class TestInstructorAccessList(SharedModuleStoreTestCase):
20
    """ Test access listings. """
21 22 23 24 25
    @classmethod
    def setUpClass(cls):
        super(TestInstructorAccessList, cls).setUpClass()
        cls.course = CourseFactory.create()

Miles Steele committed
26
    def setUp(self):
27
        super(TestInstructorAccessList, self).setUp()
28 29 30 31 32 33
        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
34

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

39 40 41
    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
42 43


44
@attr(shard=1)
45
class TestInstructorAccessAllow(SharedModuleStoreTestCase):
46
    """ Test access allow. """
47 48 49 50 51
    @classmethod
    def setUpClass(cls):
        super(TestInstructorAccessAllow, cls).setUpClass()
        cls.course = CourseFactory.create()

52
    def setUp(self):
53 54
        super(TestInstructorAccessAllow, self).setUp()

55
        self.course = CourseFactory.create()
Miles Steele committed
56

57
    def test_allow(self):
Miles Steele committed
58
        user = UserFactory()
59
        allow_access(self.course, user, 'staff')
60
        self.assertTrue(CourseStaffRole(self.course.id).has_user(user))
Miles Steele committed
61

62 63 64 65
    def test_allow_twice(self):
        user = UserFactory()
        allow_access(self.course, user, 'staff')
        allow_access(self.course, user, 'staff')
66
        self.assertTrue(CourseStaffRole(self.course.id).has_user(user))
67

68 69 70 71 72
    def test_allow_ccx_coach(self):
        user = UserFactory()
        allow_access(self.course, user, 'ccx_coach')
        self.assertTrue(CourseCcxCoachRole(self.course.id).has_user(user))

73 74 75 76
    def test_allow_beta(self):
        """ Test allow beta against list beta. """
        user = UserFactory()
        allow_access(self.course, user, 'beta')
77
        self.assertTrue(CourseBetaTesterRole(self.course.id).has_user(user))
Miles Steele committed
78

79 80
    @raises(ValueError)
    def test_allow_badlevel(self):
Miles Steele committed
81
        user = UserFactory()
82
        allow_access(self.course, user, 'robot-not-a-level')
Miles Steele committed
83

84 85 86 87
    @raises(Exception)
    def test_allow_noneuser(self):
        user = None
        allow_access(self.course, user, 'staff')
Miles Steele committed
88

Will Daly committed
89

90
@attr(shard=1)
91
class TestInstructorAccessRevoke(SharedModuleStoreTestCase):
92
    """ Test access revoke. """
93 94 95 96 97
    @classmethod
    def setUpClass(cls):
        super(TestInstructorAccessRevoke, cls).setUpClass()
        cls.course = CourseFactory.create()

Miles Steele committed
98
    def setUp(self):
99
        super(TestInstructorAccessRevoke, self).setUp()
100 101 102 103 104 105
        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
106

107 108 109
    def test_revoke(self):
        user = self.staff[0]
        revoke_access(self.course, user, 'staff')
110
        self.assertFalse(CourseStaffRole(self.course.id).has_user(user))
111 112 113 114

    def test_revoke_twice(self):
        user = self.staff[0]
        revoke_access(self.course, user, 'staff')
115
        self.assertFalse(CourseStaffRole(self.course.id).has_user(user))
116 117 118 119

    def test_revoke_beta(self):
        user = self.beta_testers[0]
        revoke_access(self.course, user, 'beta')
120
        self.assertFalse(CourseBetaTesterRole(self.course.id).has_user(user))
Miles Steele committed
121

122 123 124 125
    @raises(ValueError)
    def test_revoke_badrolename(self):
        user = UserFactory()
        revoke_access(self.course, user, 'robot-not-a-level')
Miles Steele committed
126 127


128
@attr(shard=1)
129
class TestInstructorAccessForum(SharedModuleStoreTestCase):
130 131 132
    """
    Test forum access control.
    """
133 134 135 136 137
    @classmethod
    def setUpClass(cls):
        super(TestInstructorAccessForum, cls).setUpClass()
        cls.course = CourseFactory.create()

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

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

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

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

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

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

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

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

    @raises(ValueError)
188 189
    def test_bad_mode(self):
        user = UserFactory()
190
        update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'robot-not-a-mode')