src/cm/tests/test_security.py
author raph
Fri, 09 Jul 2010 10:05:29 +0200
changeset 287 fc5ed157ebfe
parent 0 40c8f766c9b8
child 590 e103299bccc0
child 606 52f3e090eed9
permissions -rw-r--r--
add api: basic auth / unit tests / online doc (based on django-piston)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
from django.test import TestCase
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
from django.test.client import Client
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
from django.core import management
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
from cm.models import *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
from cm.security import *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
from cm.tests.test_comment_positioning import create_comment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
class FalseRequest(object):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
    def __init__(self, user):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
        self.user = user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
class SecurityTest(TestCase):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
    fixtures = ['roles_generic','test_content']
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
    def test_access_rights(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
        # anon user sees no text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
        request = FalseRequest(None)                
287
fc5ed157ebfe add api: basic auth / unit tests / online doc (based on django-piston)
raph
parents: 0
diff changeset
    20
        self.assertEqual(get_texts_with_perm(request, 'can_view_text').count(), 2)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
        # user 1 sees all texts
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
        user1 = UserProfile.objects.get(id=1).user        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
        request = FalseRequest(user1)       
287
fc5ed157ebfe add api: basic auth / unit tests / online doc (based on django-piston)
raph
parents: 0
diff changeset
    25
        self.assertEqual(get_texts_with_perm(request, 'can_view_text').count(), 5)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
        
287
fc5ed157ebfe add api: basic auth / unit tests / online doc (based on django-piston)
raph
parents: 0
diff changeset
    27
        # user 2 sees only 4 texts
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
        user2 = UserProfile.objects.get(id=2).user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
        request = FalseRequest(user2)        
287
fc5ed157ebfe add api: basic auth / unit tests / online doc (based on django-piston)
raph
parents: 0
diff changeset
    30
        self.assertEqual(get_texts_with_perm(request, 'can_view_text').count(), 4)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
287
fc5ed157ebfe add api: basic auth / unit tests / online doc (based on django-piston)
raph
parents: 0
diff changeset
    32
        # user 4 manages only 2 texts (global manager but commentator on text 4
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
        user4 = UserProfile.objects.get(id=4).user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
        request = FalseRequest(user4)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
        self.assertEqual(get_texts_with_perm(request, 'can_manage_text').count(), 2)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
    def test_moderation_tricks_a_priori(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
        # text a priori moderated
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
        # a new comment is unapproved -> owner can edit -> gets approved -> owner cannot edit it (unless moderator)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
        user2 = UserProfile.objects.get(id=2).user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
        user3 = UserProfile.objects.get(id=3).user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
        text2 = Text.objects.get(id=2)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
        # user 3 is Commentator on text 2 (a priori mod)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
        # user 2 is Editor on text 2 (a priori mod)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
        c2 = create_comment(user=user2)        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
        self.assertTrue(has_own_perm(FalseRequest(user2), "can_edit_comment" + "_own", text2, c2),'can edit own comment')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
        c3 = create_comment(user=user3)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
        self.assertTrue(has_own_perm(FalseRequest(user3), "can_edit_comment" + "_own", text2, c3),'can edit own comment')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
        c2.state = 'approved'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
        c2.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
        c3.state = 'approved'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
        c3.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
        self.assertFalse(has_own_perm(FalseRequest(user3), "can_edit_comment" + "_own", text2, c3),'CANNOT edit own comment (there is a reply)')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
        self.assertTrue(has_own_perm(FalseRequest(user2), "can_edit_comment" + "_own", text2, c2),"CAN edit own comment (is moderator)")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
        self.assertTrue(has_perm(FalseRequest(user2), "can_edit_comment", text2),"CAN edit other comment (is moderator)")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
    def test_moderation_tricks_a_posteriori(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
        # text a posteriori moderated
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
        # a new comment is approved -> owner can edit -> get a reply -> owner cannot edit it (unless moderator)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
        user2 = UserProfile.objects.get(id=2).user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
        user3 = UserProfile.objects.get(id=3).user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
        text2 = Text.objects.get(id=2)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
        text2.last_text_version.mod_posteriori = True
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
        text2.last_text_version.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
        # user 3 is Commentator on text 2 (a priori mod)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
        # user 2 is Editor on text 2 (a priori mod)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
        c3 = create_comment(user=user3, state='approved')        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
        self.assertTrue(has_own_perm(FalseRequest(user3), "can_edit_comment" + "_own", text2, c3),'CAN edit own comment (there is NO reply)')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
        # create a reply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
        c2 = create_comment(user=user3, reply_to=c3, state='approved')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
        self.assertFalse(has_own_perm(FalseRequest(user3), "can_edit_comment" + "_own", text2, c3),'CANNOT edit own comment (there is a reply)')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
        self.assertTrue(has_perm(FalseRequest(user2), "can_edit_comment", text2),"CAN edit other's comment (moderator)")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80