From 7e95d7a93088675f984d1079e4e3c3ddc1723b0f Mon Sep 17 00:00:00 2001 From: Claude Paroz <claude@2xlibre.net> Date: Fri, 24 May 2013 20:45:03 +0200 Subject: [PATCH] Fixed a regression in router initialization Regression was introduced in 6a6bb168b. Thanks Bas Peschier for the report. --- django/db/utils.py | 5 +++-- tests/multiple_database/tests.py | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/django/db/utils.py b/django/db/utils.py index 6ba6bf346c..99804ee8fa 100644 --- a/django/db/utils.py +++ b/django/db/utils.py @@ -224,13 +224,14 @@ class ConnectionRouter(object): def routers(self): if self._routers is None: self._routers = settings.DATABASE_ROUTERS + routers = [] for r in self._routers: if isinstance(r, six.string_types): router = import_by_path(r)() else: router = r - self._routers.append(router) - return self._routers + routers.append(router) + return routers def _router_func(action): def _route_db(self, model, **hints): diff --git a/tests/multiple_database/tests.py b/tests/multiple_database/tests.py index 2bff7b3b66..e72fb6a4f9 100644 --- a/tests/multiple_database/tests.py +++ b/tests/multiple_database/tests.py @@ -5,11 +5,13 @@ import pickle from operator import attrgetter import warnings +from django.conf import settings from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.core import management from django.db import connections, router, DEFAULT_DB_ALIAS from django.db.models import signals +from django.db.utils import ConnectionRouter from django.test import TestCase from django.test.utils import override_settings from django.utils.six import StringIO @@ -918,6 +920,7 @@ class QueryTestCase(TestCase): published=datetime.date(2009, 5, 4), extra_arg=True) + class TestRouter(object): # A test router. The behavior is vaguely master/slave, but the # databases aren't assumed to propagate changes. @@ -972,6 +975,30 @@ class WriteRouter(object): def db_for_write(self, model, **hints): return 'writer' + +class ConnectionRouterTestCase(TestCase): + @override_settings(DATABASE_ROUTERS=[ + 'multiple_database.tests.TestRouter', + 'multiple_database.tests.WriteRouter']) + def test_router_init_default(self): + router = ConnectionRouter() + self.assertListEqual([r.__class__.__name__ for r in router.routers], + ['TestRouter', 'WriteRouter']) + + def test_router_init_arg(self): + router = ConnectionRouter([ + 'multiple_database.tests.TestRouter', + 'multiple_database.tests.WriteRouter' + ]) + self.assertListEqual([r.__class__.__name__ for r in router.routers], + ['TestRouter', 'WriteRouter']) + + # Init with instances instead of strings + router = ConnectionRouter([TestRouter(), WriteRouter()]) + self.assertListEqual([r.__class__.__name__ for r in router.routers], + ['TestRouter', 'WriteRouter']) + + class RouterTestCase(TestCase): multi_db = True