1
0
mirror of https://github.com/django/django.git synced 2025-07-04 09:49:12 +00:00

[1.2.X] Fixed #15029 -- Moved to database backends the ability to decide if two DATABASES items are different when creating temporary databases for tests.

Backport of [15392] from trunk

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15395 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Ramiro Morales 2011-02-02 15:33:37 +00:00
parent 837a2e2773
commit 0b8b9fbe30
4 changed files with 52 additions and 30 deletions

View File

@ -468,3 +468,17 @@ class BaseDatabaseCreation(object):
def sql_table_creation_suffix(self): def sql_table_creation_suffix(self):
"SQL to append to the end of the test table creation statements" "SQL to append to the end of the test table creation statements"
return '' return ''
def test_db_signature(self):
"""
Returns a tuple with elements of self.connection.settings_dict (a
DATABASES setting value) that uniquely identify a database
accordingly to the RDBMS particularities.
"""
settings_dict = self.connection.settings_dict
return (
settings_dict['HOST'],
settings_dict['PORT'],
settings_dict['ENGINE'],
settings_dict['NAME']
)

View File

@ -114,6 +114,16 @@ class DatabaseCreation(BaseDatabaseCreation):
return self.connection.settings_dict['NAME'] return self.connection.settings_dict['NAME']
def test_db_signature(self):
settings_dict = self.connection.settings_dict
return (
settings_dict['HOST'],
settings_dict['PORT'],
settings_dict['ENGINE'],
settings_dict['NAME'],
settings_dict['TEST_USER'],
)
def _destroy_test_db(self, test_database_name, verbosity=1): def _destroy_test_db(self, test_database_name, verbosity=1):
""" """
Destroy a test database, prompting the user for confirmation if the Destroy a test database, prompting the user for confirmation if the

View File

@ -240,7 +240,7 @@ def dependency_ordered(test_databases, dependencies):
deferred = [] deferred = []
while test_databases: while test_databases:
signature, aliases = test_databases.pop() signature, (db_name, aliases) = test_databases.pop()
dependencies_satisfied = True dependencies_satisfied = True
for alias in aliases: for alias in aliases:
if alias in dependencies: if alias in dependencies:
@ -254,10 +254,10 @@ def dependency_ordered(test_databases, dependencies):
resolved_databases.add(alias) resolved_databases.add(alias)
if dependencies_satisfied: if dependencies_satisfied:
ordered_test_databases.append((signature, aliases)) ordered_test_databases.append((signature, (db_name, aliases)))
changed = True changed = True
else: else:
deferred.append((signature, aliases)) deferred.append((signature, (db_name, aliases)))
if not changed: if not changed:
raise ImproperlyConfigured("Circular dependency in TEST_DEPENDENCIES") raise ImproperlyConfigured("Circular dependency in TEST_DEPENDENCIES")
@ -309,26 +309,25 @@ class DjangoTestSuiteRunner(object):
# the alias. # the alias.
mirrored_aliases[alias] = connection.settings_dict['TEST_MIRROR'] mirrored_aliases[alias] = connection.settings_dict['TEST_MIRROR']
else: else:
# Store the (engine, name) pair. If we have two aliases # Store a tuple with DB parameters that uniquely identify it.
# with the same pair, we only need to create the test database # If we have two aliases with the same values for that tuple,
# once. # we only need to create the test database once.
test_databases.setdefault(( item = test_databases.setdefault(
connection.settings_dict['HOST'], connection.creation.test_db_signature(),
connection.settings_dict['PORT'], (connection.settings_dict['NAME'], [])
connection.settings_dict['ENGINE'], )
connection.settings_dict['NAME'], item[1].append(alias)
), []).append(alias)
if 'TEST_DEPENDENCIES' in connection.settings_dict: if 'TEST_DEPENDENCIES' in connection.settings_dict:
dependencies[alias] = connection.settings_dict['TEST_DEPENDENCIES'] dependencies[alias] = connection.settings_dict['TEST_DEPENDENCIES']
else: else:
if alias != 'default': if alias != DEFAULT_DB_ALIAS:
dependencies[alias] = connection.settings_dict.get('TEST_DEPENDENCIES', ['default']) dependencies[alias] = connection.settings_dict.get('TEST_DEPENDENCIES', [DEFAULT_DB_ALIAS])
# Second pass -- actually create the databases. # Second pass -- actually create the databases.
old_names = [] old_names = []
mirrors = [] mirrors = []
for (host, port, engine, db_name), aliases in dependency_ordered(test_databases.items(), dependencies): for signature, (db_name, aliases) in dependency_ordered(test_databases.items(), dependencies):
# Actually create the database for the first connection # Actually create the database for the first connection
connection = connections[aliases[0]] connection = connections[aliases[0]]
old_names.append((connection, db_name, True)) old_names.append((connection, db_name, True))

View File

@ -3,7 +3,6 @@ Tests for django test runner
""" """
import StringIO import StringIO
import unittest import unittest
import django
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.test import simple from django.test import simple
@ -33,9 +32,9 @@ class DependencyOrderingTests(unittest.TestCase):
def test_simple_dependencies(self): def test_simple_dependencies(self):
raw = [ raw = [
('s1', ['alpha']), ('s1', ('s1_db', ['alpha'])),
('s2', ['bravo']), ('s2', ('s2_db', ['bravo'])),
('s3', ['charlie']), ('s3', ('s3_db', ['charlie'])),
] ]
dependencies = { dependencies = {
'alpha': ['charlie'], 'alpha': ['charlie'],
@ -43,7 +42,7 @@ class DependencyOrderingTests(unittest.TestCase):
} }
ordered = simple.dependency_ordered(raw, dependencies=dependencies) ordered = simple.dependency_ordered(raw, dependencies=dependencies)
ordered_sigs = [sig for sig,aliases in ordered] ordered_sigs = [sig for sig,value in ordered]
self.assertTrue('s1' in ordered_sigs) self.assertTrue('s1' in ordered_sigs)
self.assertTrue('s2' in ordered_sigs) self.assertTrue('s2' in ordered_sigs)
@ -53,9 +52,9 @@ class DependencyOrderingTests(unittest.TestCase):
def test_chained_dependencies(self): def test_chained_dependencies(self):
raw = [ raw = [
('s1', ['alpha']), ('s1', ('s1_db', ['alpha'])),
('s2', ['bravo']), ('s2', ('s2_db', ['bravo'])),
('s3', ['charlie']), ('s3', ('s3_db', ['charlie'])),
] ]
dependencies = { dependencies = {
'alpha': ['bravo'], 'alpha': ['bravo'],
@ -63,7 +62,7 @@ class DependencyOrderingTests(unittest.TestCase):
} }
ordered = simple.dependency_ordered(raw, dependencies=dependencies) ordered = simple.dependency_ordered(raw, dependencies=dependencies)
ordered_sigs = [sig for sig,aliases in ordered] ordered_sigs = [sig for sig,value in ordered]
self.assertTrue('s1' in ordered_sigs) self.assertTrue('s1' in ordered_sigs)
self.assertTrue('s2' in ordered_sigs) self.assertTrue('s2' in ordered_sigs)
@ -78,10 +77,10 @@ class DependencyOrderingTests(unittest.TestCase):
def test_multiple_dependencies(self): def test_multiple_dependencies(self):
raw = [ raw = [
('s1', ['alpha']), ('s1', ('s1_db', ['alpha'])),
('s2', ['bravo']), ('s2', ('s2_db', ['bravo'])),
('s3', ['charlie']), ('s3', ('s3_db', ['charlie'])),
('s4', ['delta']), ('s4', ('s4_db', ['delta'])),
] ]
dependencies = { dependencies = {
'alpha': ['bravo','delta'], 'alpha': ['bravo','delta'],
@ -108,8 +107,8 @@ class DependencyOrderingTests(unittest.TestCase):
def test_circular_dependencies(self): def test_circular_dependencies(self):
raw = [ raw = [
('s1', ['alpha']), ('s1', ('s1_db', ['alpha'])),
('s2', ['bravo']), ('s2', ('s2_db', ['bravo'])),
] ]
dependencies = { dependencies = {
'bravo': ['alpha'], 'bravo': ['alpha'],