test_access.py 8.28 KB
Newer Older
1 2 3 4 5
"""
Tests for wiki permissions
"""

from django.contrib.auth.models import Group
6
from nose.plugins.attrib import attr
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
from student.tests.factories import UserFactory
from xmodule.modulestore.tests.factories import CourseFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase

from courseware.tests.factories import InstructorFactory, StaffFactory

from wiki.models import URLPath
from course_wiki.views import get_or_create_root
from course_wiki.utils import user_is_article_course_staff, course_wiki_slug
from course_wiki import settings


class TestWikiAccessBase(ModuleStoreTestCase):
    """Base class for testing wiki access."""
    def setUp(self):
22
        super(TestWikiAccessBase, self).setUp()
23 24 25

        self.wiki = get_or_create_root()

26 27
        self.course_math101 = CourseFactory.create(org='org', number='math101', display_name='Course', metadata={'use_unique_wiki_id': 'false'})
        self.course_math101_staff = self.create_staff_for_course(self.course_math101)
28 29 30 31 32 33

        wiki_math101 = self.create_urlpath(self.wiki, course_wiki_slug(self.course_math101))
        wiki_math101_page = self.create_urlpath(wiki_math101, 'Child')
        wiki_math101_page_page = self.create_urlpath(wiki_math101_page, 'Grandchild')
        self.wiki_math101_pages = [wiki_math101, wiki_math101_page, wiki_math101_page_page]

34 35 36 37 38 39 40 41
        self.course_math101b = CourseFactory.create(org='org', number='math101b', display_name='Course', metadata={'use_unique_wiki_id': 'true'})
        self.course_math101b_staff = self.create_staff_for_course(self.course_math101b)

        wiki_math101b = self.create_urlpath(self.wiki, course_wiki_slug(self.course_math101b))
        wiki_math101b_page = self.create_urlpath(wiki_math101b, 'Child')
        wiki_math101b_page_page = self.create_urlpath(wiki_math101b_page, 'Grandchild')
        self.wiki_math101b_pages = [wiki_math101b, wiki_math101b_page, wiki_math101b_page_page]

42 43 44 45
    def create_urlpath(self, parent, slug):
        """Creates an article at /parent/slug and returns its URLPath"""
        return URLPath.create_article(parent, slug, title=slug)

46 47 48 49
    def create_staff_for_course(self, course):
        """Creates and returns users with instructor and staff access to course."""

        return [
50 51
            InstructorFactory(course_key=course.id),  # Creates instructor_org/number/run role name
            StaffFactory(course_key=course.id),  # Creates staff_org/number/run role name
52 53
        ]

54

55
@attr('shard_1')
56 57 58 59 60 61
class TestWikiAccess(TestWikiAccessBase):
    """Test wiki access for course staff."""
    def setUp(self):
        super(TestWikiAccess, self).setUp()

        self.course_310b = CourseFactory.create(org='org', number='310b', display_name='Course')
62 63 64
        self.course_310b_staff = self.create_staff_for_course(self.course_310b)
        self.course_310b2 = CourseFactory.create(org='org', number='310b_', display_name='Course')
        self.course_310b2_staff = self.create_staff_for_course(self.course_310b2)
65 66

        self.wiki_310b = self.create_urlpath(self.wiki, course_wiki_slug(self.course_310b))
67
        self.wiki_310b2 = self.create_urlpath(self.wiki, course_wiki_slug(self.course_310b2))
68 69

    def test_no_one_is_root_wiki_staff(self):
70
        all_course_staff = self.course_math101_staff + self.course_310b_staff + self.course_310b2_staff
71 72 73 74 75 76 77 78
        for course_staff in all_course_staff:
            self.assertFalse(user_is_article_course_staff(course_staff, self.wiki.article))

    def test_course_staff_is_course_wiki_staff(self):
        for page in self.wiki_math101_pages:
            for course_staff in self.course_math101_staff:
                self.assertTrue(user_is_article_course_staff(course_staff, page.article))

79 80 81 82
        for page in self.wiki_math101b_pages:
            for course_staff in self.course_math101b_staff:
                self.assertTrue(user_is_article_course_staff(course_staff, page.article))

83 84 85 86 87 88 89 90 91
    def test_settings(self):
        for page in self.wiki_math101_pages:
            for course_staff in self.course_math101_staff:
                self.assertTrue(settings.CAN_DELETE(page.article, course_staff))
                self.assertTrue(settings.CAN_MODERATE(page.article, course_staff))
                self.assertTrue(settings.CAN_CHANGE_PERMISSIONS(page.article, course_staff))
                self.assertTrue(settings.CAN_ASSIGN(page.article, course_staff))
                self.assertTrue(settings.CAN_ASSIGN_OWNER(page.article, course_staff))

92 93 94 95 96 97 98 99
        for page in self.wiki_math101b_pages:
            for course_staff in self.course_math101b_staff:
                self.assertTrue(settings.CAN_DELETE(page.article, course_staff))
                self.assertTrue(settings.CAN_MODERATE(page.article, course_staff))
                self.assertTrue(settings.CAN_CHANGE_PERMISSIONS(page.article, course_staff))
                self.assertTrue(settings.CAN_ASSIGN(page.article, course_staff))
                self.assertTrue(settings.CAN_ASSIGN_OWNER(page.article, course_staff))

100 101
    def test_other_course_staff_is_not_course_wiki_staff(self):
        for page in self.wiki_math101_pages:
102 103 104 105
            for course_staff in self.course_math101b_staff:
                self.assertFalse(user_is_article_course_staff(course_staff, page.article))

        for page in self.wiki_math101_pages:
106 107 108 109
            for course_staff in self.course_310b_staff:
                self.assertFalse(user_is_article_course_staff(course_staff, page.article))

        for course_staff in self.course_310b_staff:
110
            self.assertFalse(user_is_article_course_staff(course_staff, self.wiki_310b2.article))
111

112
        for course_staff in self.course_310b2_staff:
113 114 115
            self.assertFalse(user_is_article_course_staff(course_staff, self.wiki_310b.article))


116
@attr('shard_1')
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
class TestWikiAccessForStudent(TestWikiAccessBase):
    """Test access for students."""
    def setUp(self):
        super(TestWikiAccessForStudent, self).setUp()

        self.student = UserFactory.create()

    def test_student_is_not_root_wiki_staff(self):
        self.assertFalse(user_is_article_course_staff(self.student, self.wiki.article))

    def test_student_is_not_course_wiki_staff(self):
        for page in self.wiki_math101_pages:
            self.assertFalse(user_is_article_course_staff(self.student, page.article))


132
@attr('shard_1')
133 134 135 136 137 138
class TestWikiAccessForNumericalCourseNumber(TestWikiAccessBase):
    """Test staff has access if course number is numerical and wiki slug has an underscore appended."""
    def setUp(self):
        super(TestWikiAccessForNumericalCourseNumber, self).setUp()

        self.course_200 = CourseFactory.create(org='org', number='200', display_name='Course')
139
        self.course_200_staff = self.create_staff_for_course(self.course_200)
140 141 142 143 144 145

        wiki_200 = self.create_urlpath(self.wiki, course_wiki_slug(self.course_200))
        wiki_200_page = self.create_urlpath(wiki_200, 'Child')
        wiki_200_page_page = self.create_urlpath(wiki_200_page, 'Grandchild')
        self.wiki_200_pages = [wiki_200, wiki_200_page, wiki_200_page_page]

146
    def test_course_staff_is_course_wiki_staff_for_numerical_course_number(self):  # pylint: disable=invalid-name
147 148 149 150 151
        for page in self.wiki_200_pages:
            for course_staff in self.course_200_staff:
                self.assertTrue(user_is_article_course_staff(course_staff, page.article))


152
@attr('shard_1')
153 154 155 156 157 158 159
class TestWikiAccessForOldFormatCourseStaffGroups(TestWikiAccessBase):
    """Test staff has access if course group has old format."""
    def setUp(self):
        super(TestWikiAccessForOldFormatCourseStaffGroups, self).setUp()

        self.course_math101c = CourseFactory.create(org='org', number='math101c', display_name='Course')
        Group.objects.get_or_create(name='instructor_math101c')
160
        self.course_math101c_staff = self.create_staff_for_course(self.course_math101c)
161 162 163 164 165 166 167 168 169 170

        wiki_math101c = self.create_urlpath(self.wiki, course_wiki_slug(self.course_math101c))
        wiki_math101c_page = self.create_urlpath(wiki_math101c, 'Child')
        wiki_math101c_page_page = self.create_urlpath(wiki_math101c_page, 'Grandchild')
        self.wiki_math101c_pages = [wiki_math101c, wiki_math101c_page, wiki_math101c_page_page]

    def test_course_staff_is_course_wiki_staff(self):
        for page in self.wiki_math101c_pages:
            for course_staff in self.course_math101c_staff:
                self.assertTrue(user_is_article_course_staff(course_staff, page.article))