1+ import re
12from django .contrib import admin
23import os
34
@@ -35,11 +36,11 @@ class TestModel1Admin(admin.ModelAdmin):
3536 widgets = {'version' : VersionWidget ()})
3637
3738
38- class TestDjangoAdmin (TestCase ):
39+ class DjangoAdminTestCase (TestCase ):
3940 urls = 'concurrency.tests.urls'
4041
4142 def setUp (self ):
42- super (TestDjangoAdmin , self ).setUp ()
43+ super (DjangoAdminTestCase , self ).setUp ()
4344 self .sett = self .settings (INSTALLED_APPS = INSTALLED_APPS ,
4445 MIDDLEWARE_CLASSES = global_settings .MIDDLEWARE_CLASSES ,
4546 AUTHENTICATION_BACKENDS = global_settings .AUTHENTICATION_BACKENDS ,
@@ -48,8 +49,7 @@ def setUp(self):
4849 SOUTH_TESTS_MIGRATE = False ,
4950 TEMPLATE_DIRS = (os .path .join (os .path .dirname (__file__ ), 'templates' ),),
5051 # TEMPLATE_LOADERS = ('django.template.loaders.filesystem.Loader',)
51-
52- )
52+ )
5353 self .sett .enable ()
5454 django .core .management ._commands = None # reset commands cache
5555 django .core .management .call_command ('syncdb' , verbosity = 0 )
@@ -63,11 +63,13 @@ def setUp(self):
6363 self .target1 , __ = TestModel1 .objects .get_or_create (username = 'bbb' )
6464
6565 def tearDown (self ):
66- super (TestDjangoAdmin , self ).tearDown ()
66+ super (DjangoAdminTestCase , self ).tearDown ()
6767 self .sett .disable ()
6868 admin .site .unregister (TestModel0 )
6969 admin .site .unregister (TestModel1 )
7070
71+ class TestDjangoAdmin (DjangoAdminTestCase ):
72+
7173 def test_creation (self ):
7274 url = reverse ('admin:concurrency_testmodel0_add' )
7375 data = {'username' : u'new_username' ,
@@ -125,15 +127,19 @@ def test_conflict(self):
125127 url = reverse ('admin:concurrency_testmodel1_change' , args = [self .target1 .pk ])
126128 response = self .client .get (url )
127129 self .assertIn ('original' , response .context , response )
128-
130+ # form = response.context['adminform'].form
131+ rex = re .compile ('name="version" value="(\d*):(.[^"]*)"' )
132+ m = rex .search (str (response ), re .M + re .I )
133+ assert m .group (1 ) == str (response .context ['original' ].version )
129134 data = {'username' : u'new_username' ,
130135 'last_name' : None ,
131- 'version' : response .context ['adminform' ].form ['version' ].value (),
136+ 'version' : VersionFieldSigner ().sign (m .group (1 )),
137+ # 'version': response.context['adminform'].form['version'].value(),
132138 'char_field' : None ,
133139 '_continue' : 1 ,
134140 'date_field' : '2010-09-01' }
135141
136- self .target1 .save () # conflict here
142+ self .target1 .save () # create conflict here
137143
138144 response = self .client .post (url , data , follow = True )
139145 self .assertIn ('original' , response .context , response )
@@ -142,3 +148,25 @@ def test_conflict(self):
142148 self .assertIn ('Record Modified' ,
143149 str (response .context ['adminform' ].form .errors ),
144150 response .context ['adminform' ].form .errors )
151+
152+ def test_sanity_signer (self ):
153+ url = reverse ('admin:concurrency_testmodel1_change' , args = [self .target1 .pk ])
154+ response = self .client .get (url )
155+ self .assertIn ('original' , response .context , response )
156+ rex = re .compile ('name="version" value="(\d*):(.[^"]*)"' )
157+
158+ m1 = rex .search (str (response ), re .M + re .I )
159+ assert m1 .group (1 ) == str (response .context ['original' ].version )
160+ data = {'username' : u'new_username' ,
161+ 'last_name' : None ,
162+ 'version' : VersionFieldSigner ().sign (m1 .group (1 )),
163+ 'char_field' : None ,
164+ '_continue' : 1 ,
165+ 'date_field' : 'esss2010-09-01' }
166+
167+ response = self .client .post (url , data , follow = True )
168+ self .assertIn ('original' , response .context , response )
169+ self .assertTrue (response .context ['adminform' ].form .errors ,
170+ response .context ['adminform' ].form .errors )
171+ m2 = rex .search (str (response ), re .M + re .I )
172+ self .assertEqual (m1 .groups (), m2 .groups ())
0 commit comments