diff options
| author | Jannis Leidel | 2013-03-02 14:09:30 +0100 | 
|---|---|---|
| committer | Jannis Leidel | 2013-03-02 14:09:30 +0100 | 
| commit | 0844c8b24527486d43f8ab18241ce0b7f900129b (patch) | |
| tree | d9db1cd777ee7b122665b5358c0b1d24d30f93a7 | |
| parent | 42d7dde77e1c2daffaa5fa5bd16184f52c413c20 (diff) | |
| parent | 54f4f3a7361ae711641b511df5a4c8962ad623a4 (diff) | |
| download | django-debug-toolbar-0844c8b24527486d43f8ab18241ce0b7f900129b.tar.bz2 | |
Merge branch 'issue_230' of git://github.com/akaariai/django-debug-toolbar into akaariai-issue_230
Conflicts:
	debug_toolbar/utils/tracking/db.py
| -rw-r--r-- | debug_toolbar/utils/tracking/db.py | 20 | ||||
| -rw-r--r-- | runtests.py | 5 | ||||
| -rw-r--r-- | test_pgsql.py | 28 | ||||
| -rw-r--r-- | tests/tests.py | 15 | 
4 files changed, 64 insertions, 4 deletions
| diff --git a/debug_toolbar/utils/tracking/db.py b/debug_toolbar/utils/tracking/db.py index b675227..0ff3359 100644 --- a/debug_toolbar/utils/tracking/db.py +++ b/debug_toolbar/utils/tracking/db.py @@ -102,6 +102,14 @@ class NormalCursorWrapper(object):          try:              return self.cursor.execute(sql, params)          finally: +            # FIXME: Sometimes connections which are not in the connections +            # dict are used (for example in test database destroying). +            # The code below (at least get_transaction_id(alias) needs to have +            # the connection in the connections dict. It would be good to +            # not have this requirement at all, but for now lets just skip +            # these connections. +            if self.db.alias not in connections: +                return              stop = datetime.now()              duration = ms_from_timedelta(stop - start)              enable_stacktraces = getattr(settings, @@ -131,7 +139,7 @@ class NormalCursorWrapper(object):              del cur_frame              alias = getattr(self.db, 'alias', 'default') -            conn = connections[alias].connection +            conn = self.db.connection              # HACK: avoid imports              if conn:                  engine = conn.__class__.__module__.split('.', 1)[0] @@ -158,11 +166,17 @@ class NormalCursorWrapper(object):              }              if engine == 'psycopg2': -                from psycopg2.extensions import TRANSACTION_STATUS_INERROR +                # If an erroneous query was ran on the connection, it might +                # be in a state where checking isolation_level raises an +                # exception. +                try: +                    iso_level = conn.isolation_level +                except conn.InternalError: +                    iso_level = 'unknown'                  params.update({                      'trans_id': self.logger.get_transaction_id(alias),                      'trans_status': conn.get_transaction_status(), -                    'iso_level': conn.isolation_level if not conn.get_transaction_status() == TRANSACTION_STATUS_INERROR else "", +                    'iso_level': iso_level,                      'encoding': conn.encoding,                  }) diff --git a/runtests.py b/runtests.py index 3432f8b..ed49824 100644 --- a/runtests.py +++ b/runtests.py @@ -1,11 +1,14 @@  #!/usr/bin/env python  import sys +import os  from os.path import dirname, abspath  from optparse import OptionParser  from django.conf import settings, global_settings -if not settings.configured: +# For convenience configure settings if they are not pre-configured or if we +# haven't been provided settings to use by environment variable. +if not settings.configured and not os.environ.get('DJANGO_SETTINGS_MODULE'):      settings.configure(          DATABASES={              'default': { diff --git a/test_pgsql.py b/test_pgsql.py new file mode 100644 index 0000000..28c0178 --- /dev/null +++ b/test_pgsql.py @@ -0,0 +1,28 @@ +from django.conf import global_settings +DATABASES={ +    'default': { +        'ENGINE': 'django.db.backends.postgresql_psycopg2', +        # Edit the below settings before use... +        'USER': '', +        'NAME': '', +        'HOST': '', +        'PASSWORD': '', +    } +} +INSTALLED_APPS=[ +    'django.contrib.auth', +    'django.contrib.admin', +    'django.contrib.contenttypes', +    'django.contrib.sessions', +    'django.contrib.sites', + +    'debug_toolbar', + +    'tests', +] +MIDDLEWARE_CLASSES=global_settings.MIDDLEWARE_CLASSES + ( +    'debug_toolbar.middleware.DebugToolbarMiddleware', +) +ROOT_URLCONF='' +DEBUG=False +SITE_ID=1 diff --git a/tests/tests.py b/tests/tests.py index ea2938d..a3618bf 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -2,9 +2,11 @@ import thread  from django.conf import settings  from django.contrib.auth.models import User +from django.db import connection  from django.http import HttpResponse  from django.test import TestCase, RequestFactory  from django.template import Template, Context +from django.utils import unittest  from debug_toolbar.middleware import DebugToolbarMiddleware  from debug_toolbar.panels.sql import SQLDebugPanel @@ -214,6 +216,19 @@ class SQLPanelTestCase(BaseTestCase):          # ensure the stacktrace is populated          self.assertTrue(len(query[1]['stacktrace']) > 0) +    @unittest.skipUnless(connection.vendor=='postgresql', +                         'Test valid only on PostgreSQL') +    def test_erroneous_query(self): +        """ +        Test that an error in the query isn't swallowed by the middleware. +        """ +        from django.db import connection +        from django.db.utils import DatabaseError +        try: +            connection.cursor().execute("erroneous query") +        except DatabaseError as e: +            self.assertTrue('erroneous query' in str(e)) +      def test_disable_stacktraces(self):          panel = self.toolbar.get_panel(SQLDebugPanel)          self.assertEquals(len(panel._queries), 0) | 
