From 69b96f824d2de0904f03e457c564f22fb8ed57e4 Mon Sep 17 00:00:00 2001 From: Ramiro Morales Date: Tue, 13 Mar 2012 17:52:48 +0000 Subject: [PATCH] Fixed #16329 -- Fixed detection of transaction-handling capabilities when all test databases are sqlite3, in-memory. Thanks canassa for the report and agriffis (#17762) and lrekucki (in #17758) for their contribution to the fix. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17702 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/backends/sqlite3/creation.py | 15 +++++++++ tests/regressiontests/test_runner/tests.py | 36 ++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/django/db/backends/sqlite3/creation.py b/django/db/backends/sqlite3/creation.py index cd393561d1..5f55e3927c 100644 --- a/django/db/backends/sqlite3/creation.py +++ b/django/db/backends/sqlite3/creation.py @@ -72,3 +72,18 @@ class DatabaseCreation(BaseDatabaseCreation): def set_autocommit(self): self.connection.connection.isolation_level = None + + def test_db_signature(self): + """ + Returns a tuple that uniquely identifies a test database. + + This takes into account the special cases of ":memory:" and "" for + SQLite since the databases will be distinct despite having the same + TEST_NAME. See http://www.sqlite.org/inmemorydb.html + """ + settings_dict = self.connection.settings_dict + test_dbname = self._get_test_db_name() + sig = [self.connection.settings_dict['NAME']] + if test_dbname == ':memory:': + sig.append(self.connection.alias) + return tuple(sig) diff --git a/tests/regressiontests/test_runner/tests.py b/tests/regressiontests/test_runner/tests.py index bd3e40c13b..12a28f9fcb 100644 --- a/tests/regressiontests/test_runner/tests.py +++ b/tests/regressiontests/test_runner/tests.py @@ -11,6 +11,7 @@ from django.core.exceptions import ImproperlyConfigured from django.core.management import call_command from django.test import simple from django.test.simple import DjangoTestSuiteRunner, get_tests +from django.test.testcases import connections_support_transactions from django.test.utils import get_warnings_state, restore_warnings_state from django.utils import unittest from django.utils.importlib import import_module @@ -262,3 +263,38 @@ class ModulesTestsPackages(unittest.TestCase): "Test for #12658 - Tests with ImportError's shouldn't fail silently" module = import_module(TEST_APP_ERROR) self.assertRaises(ImportError, get_tests, module) + + +class Sqlite3InMemoryTestDbs(unittest.TestCase): + def test_transaction_support(self): + """Ticket #16329: sqlite3 in-memory test databases""" + from django import db + old_db_connections = db.connections + for option in ('NAME', 'TEST_NAME'): + try: + db.connections = db.ConnectionHandler({ + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + option: ':memory:', + }, + 'other': { + 'ENGINE': 'django.db.backends.sqlite3', + option: ':memory:', + }, + }) + other = db.connections['other'] + self.assertEqual(other.features.supports_transactions, None) + DjangoTestSuiteRunner(verbosity=0).setup_databases() + # Transaction support should be properly initialised for the 'other' DB + self.assertNotEqual( + other.features.supports_transactions, + None, + "DATABASES setting '%s' option set to sqlite3's ':memory:' value causes problems with transaction support detection." % option + ) + # And all the DBs should report that they support transactions + self.assertTrue( + connections_support_transactions(), + "DATABASES setting '%s' option set to sqlite3's ':memory:' value causes problems with transaction support detection." % option + ) + finally: + db.connections = old_db_connections