#12087: Django "TransactionTestCase" isn't
-------------------------------+--------------------------------------------
 Reporter:  brandon            |       Owner:  nobody    
   Status:  new                |   Milestone:            
Component:  Testing framework  |     Version:  1.1       
 Keywords:                     |       Stage:  Unreviewed
Has_patch:  0                  |  
-------------------------------+--------------------------------------------
 The Django TransactionTestCase fails to roll back the current database
 transaction at each test's conclusion, which can leave the current
 database connection in an unusable state and thus break test isolation.
 When Django is using PostgreSQL, and a test deliberately tries violating a
 database invariant (like inserting an illegal value, or a non-existent
 primary key) and receives a PostgreSQL runtime error, then all subsequent
 tests in that test class error out with the failure:

 {{{
 Traceback (most recent call last):
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/test/testcases.py", line 242, in
 __call__
     self._pre_setup()
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/test/testcases.py", line 217, in
 _pre_setup
     self._fixture_setup()
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/test/testcases.py", line 222, in
 _fixture_setup
     call_command('flush', verbosity=0, interactive=False)
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/core/management/__init__.py", line
 166, in call_command
     return klass.execute(*args, **defaults)
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/core/management/base.py", line 222,
 in execute
     output = self.handle(*args, **options)
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/core/management/base.py", line 351,
 in handle
     return self.handle_noargs(**options)
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/core/management/commands/flush.py",
 line 31, in handle_noargs
     sql_list = sql_flush(self.style, only_django=True)
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/core/management/sql.py", line 128,
 in sql_flush
     tables =
 connection.introspection.django_table_names(only_existing=True)
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/db/backends/__init__.py", line 510,
 in django_table_names
     tables = [t for t in tables if self.table_name_converter(t) in
 self.table_names()]
   File "/home/brandon/django/v/lib/python2.6/site-
 packages/Django-1.1.1-py2.6.egg/django/db/backends/__init__.py", line 491,
 in table_names
     return self.get_table_list(cursor)
   File "/home/brandon/django/v/lib/python2.6/site-
 
packages/Django-1.1.1-py2.6.egg/django/db/backends/postgresql/introspection.py",
 line 30, in get_table_list
     AND pg_catalog.pg_table_is_visible(c.oid)""")
 InternalError: current transaction is aborted, commands ignored until end
 of transaction block
 }}}

 The correction for this is very simple: the _fixture_teardown() method in
 django.test.testcases.TransactionTestCase needs its code changed from a
 do-nothing "pass" statement to something more effective:

 {{{
     def _fixture_teardown(self):
         transaction.rollback()
 }}}

 With this small change, test isolation is correctly achieved, and the rest
 of the test cases in the TransactionTestCase class can succeed and fail on
 their own rather than all dying with the error shown above.

-- 
Ticket URL: <http://code.djangoproject.com/ticket/12087>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to