1- from django .core .signing import Signer
1+ from django .core .exceptions import SuspiciousOperation
22from django .forms .models import modelform_factory
33from django .forms .widgets import HiddenInput , TextInput
4+ from django .utils .encoding import smart_str
45from django .utils .unittest .case import TestCase
5- from concurrency .forms import ConcurrentForm
6+ from concurrency .forms import ConcurrentForm , VersionField , VersionFieldSigner
67from concurrency .tests import TestModel0 , TestIssue3Model
78
89
10+ class DummySigner ():
11+ def sign (self , value ):
12+ return smart_str (value )
13+
14+ def unsign (self , signed_value ):
15+ return smart_str (signed_value )
16+
917class ConcurrentFormTest (TestCase ):
1018 def test_version (self ):
1119 Form = modelform_factory (TestModel0 , ConcurrentForm )
1220 form = Form ()
1321 self .assertIsInstance (form .fields ['version' ].widget , HiddenInput )
1422
23+ def test_signer (self ):
24+ obj , __ = TestIssue3Model .objects .get_or_create (username = 'aaa' )
25+ Form = modelform_factory (TestIssue3Model , type ('xxx' ,(ConcurrentForm ,), {'revision' : VersionField (signer = DummySigner ())}))
26+ data = {'id' : 1 ,
27+ 'revision' : obj .revision }
28+ form = Form (data , instance = obj )
29+ self .assertTrue (form .is_valid (), form .non_field_errors ())
30+
31+ def test_signer (self ):
32+ Form = modelform_factory (TestIssue3Model , ConcurrentForm )
33+ form = Form ({})
34+ self .assertTrue (form .is_valid (), form .non_field_errors ())
35+
36+ def test_tamperig (self ):
37+ obj , __ = TestIssue3Model .objects .get_or_create (username = 'aaa' )
38+ Form = modelform_factory (TestIssue3Model , ConcurrentForm )
39+ data = {'username' : 'aaa' ,
40+ 'last_name' : None ,
41+ 'date_field' : None ,
42+ 'char_field' : None ,
43+ 'version' : u'abc' ,
44+ 'id' : 1 ,
45+ 'revision' : obj .revision }
46+ form = Form (data , instance = obj )
47+ self .assertRaises (SuspiciousOperation , form .is_valid )
48+
1549 def test_custom_name (self ):
1650 Form = modelform_factory (TestIssue3Model , ConcurrentForm )
1751 form = Form ()
@@ -28,7 +62,7 @@ def test_save(self):
2862 'char_field' : None ,
2963 'version' : u'abc' ,
3064 'id' : 1 ,
31- 'revision' : Signer ().sign (obj .revision )}
65+ 'revision' : VersionFieldSigner ().sign (obj .revision )}
3266 form = Form (data , instance = obj )
3367 obj_copy .save () # save
3468 self .assertFalse (form .is_valid ())
@@ -43,7 +77,7 @@ def test_is_valid(self):
4377 'char_field' : None ,
4478 'version' : u'abc' ,
4579 'id' : 1 ,
46- 'revision' : Signer ().sign (obj .revision )}
80+ 'revision' : VersionFieldSigner ().sign (obj .revision )}
4781 form = Form (data , instance = obj )
4882 obj .save () # save again simulate concurrent editing
4983 self .assertRaises (ValueError , form .save )
0 commit comments