test_access.py 6.13 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 9 10
from student.tests.factories import UserFactory
from xmodule.modulestore.tests.factories import CourseFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase

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

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


21
@attr('shard_1')
22 23
class TestInstructorAccessList(ModuleStoreTestCase):
    """ Test access listings. """
Miles Steele committed
24
    def setUp(self):
25 26
        super(TestInstructorAccessList, self).setUp()

Miles Steele committed
27 28
        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
@attr('shard_1')
46 47 48
class TestInstructorAccessAllow(ModuleStoreTestCase):
    """ Test access allow. """
    def setUp(self):
49 50
        super(TestInstructorAccessAllow, self).setUp()

51
        self.course = CourseFactory.create()
Miles Steele committed
52

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

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

    def test_allow_beta(self):
        """ Test allow beta against list beta. """
        user = UserFactory()
        allow_access(self.course, user, 'beta')
68
        self.assertTrue(CourseBetaTesterRole(self.course.id).has_user(user))
Miles Steele committed
69

70 71
    @raises(ValueError)
    def test_allow_badlevel(self):
Miles Steele committed
72
        user = UserFactory()
73
        allow_access(self.course, user, 'robot-not-a-level')
Miles Steele committed
74

75 76 77 78
    @raises(Exception)
    def test_allow_noneuser(self):
        user = None
        allow_access(self.course, user, 'staff')
Miles Steele committed
79

Will Daly committed
80

81
@attr('shard_1')
82 83
class TestInstructorAccessRevoke(ModuleStoreTestCase):
    """ Test access revoke. """
Miles Steele committed
84
    def setUp(self):
85 86
        super(TestInstructorAccessRevoke, self).setUp()

Miles Steele committed
87 88
        self.course = CourseFactory.create()

89 90 91 92 93 94
        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
95

96 97 98
    def test_revoke(self):
        user = self.staff[0]
        revoke_access(self.course, user, 'staff')
99
        self.assertFalse(CourseStaffRole(self.course.id).has_user(user))
100 101 102 103

    def test_revoke_twice(self):
        user = self.staff[0]
        revoke_access(self.course, user, 'staff')
104
        self.assertFalse(CourseStaffRole(self.course.id).has_user(user))
105 106 107 108

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

111 112 113 114
    @raises(ValueError)
    def test_revoke_badrolename(self):
        user = UserFactory()
        revoke_access(self.course, user, 'robot-not-a-level')
Miles Steele committed
115 116


117
@attr('shard_1')
118
class TestInstructorAccessForum(ModuleStoreTestCase):
119 120 121
    """
    Test forum access control.
    """
Miles Steele committed
122
    def setUp(self):
123 124
        super(TestInstructorAccessForum, self).setUp()

Miles Steele committed
125 126
        self.course = CourseFactory.create()

127 128 129 130 131
        self.mod_role = Role.objects.create(
            course_id=self.course.id,
            name=FORUM_ROLE_MODERATOR
        )
        self.moderators = [UserFactory.create() for _ in xrange(4)]
132 133
        for user in self.moderators:
            self.mod_role.users.add(user)
Miles Steele committed
134

135
    def test_allow(self):
Miles Steele committed
136
        user = UserFactory.create()
137
        update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow')
Miles Steele committed
138 139
        self.assertIn(user, self.mod_role.users.all())

140
    def test_allow_twice(self):
Miles Steele committed
141
        user = UserFactory.create()
142
        update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow')
143
        self.assertIn(user, self.mod_role.users.all())
144
        update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow')
Miles Steele committed
145 146 147
        self.assertIn(user, self.mod_role.users.all())

    @raises(Role.DoesNotExist)
148
    def test_allow_badrole(self):
Miles Steele committed
149
        user = UserFactory.create()
150
        update_forum_role(self.course.id, user, 'robot-not-a-real-role', 'allow')
Miles Steele committed
151

152 153
    def test_revoke(self):
        user = self.moderators[0]
154
        update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
Miles Steele committed
155 156
        self.assertNotIn(user, self.mod_role.users.all())

157 158
    def test_revoke_twice(self):
        user = self.moderators[0]
159
        update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
160
        self.assertNotIn(user, self.mod_role.users.all())
161
        update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
Miles Steele committed
162 163
        self.assertNotIn(user, self.mod_role.users.all())

164 165
    def test_revoke_notallowed(self):
        user = UserFactory()
166
        update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
167
        self.assertNotIn(user, self.mod_role.users.all())
Miles Steele committed
168 169

    @raises(Role.DoesNotExist)
170 171
    def test_revoke_badrole(self):
        user = self.moderators[0]
172
        update_forum_role(self.course.id, user, 'robot-not-a-real-role', 'allow')
Miles Steele committed
173 174

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