summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRamiro Morales <cramm0@gmail.com>2012-03-13 17:52:48 +0000
committerRamiro Morales <cramm0@gmail.com>2012-03-13 17:52:48 +0000
commit69b96f824d2de0904f03e457c564f22fb8ed57e4 (patch)
tree8590f7f121da261f69eb5ce4b4a1456d7bb0dd09
parentf5afa22abd13d69ecc2fca628ed47bb945f7c431 (diff)
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
-rw-r--r--django/db/backends/sqlite3/creation.py15
-rw-r--r--tests/regressiontests/test_runner/tests.py36
2 files changed, 51 insertions, 0 deletions
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