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

5
from nose.plugins.attrib import attr
6 7 8 9 10
from nose.tools import raises

from django_comment_common.models import FORUM_ROLE_MODERATOR, Role
from lms.djangoapps.instructor.access import allow_access, list_with_level, revoke_access, update_forum_role
from student.roles import CourseBetaTesterRole, CourseCcxCoachRole, CourseStaffRole
Miles Steele committed
11
from student.tests.factories import UserFactory
12
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
13
from xmodule.modulestore.tests.factories import CourseFactory
Miles Steele committed
14 15


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

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

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

37 38 39
    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
40 41


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

50
    def setUp(self):
51 52
        super(TestInstructorAccessAllow, self).setUp()

53
        self.course = CourseFactory.create()
Miles Steele committed
54

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

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

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

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

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

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

Will Daly committed
87

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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