From b61ea56789a5825bd2961a335cb82f65e09f1614 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Sat, 7 Sep 2019 11:57:46 +0200 Subject: [PATCH] Refs #28478 -- Removed support for TestCase's allow_database_queries and multi_db per deprecation timeline. --- django/test/testcases.py | 55 +---------------- docs/releases/1.9.txt | 5 +- docs/releases/2.2.txt | 4 +- docs/releases/3.1.txt | 3 + docs/topics/testing/tools.txt | 24 -------- tests/test_utils/test_deprecated_features.py | 64 -------------------- 6 files changed, 9 insertions(+), 146 deletions(-) delete mode 100644 tests/test_utils/test_deprecated_features.py diff --git a/django/test/testcases.py b/django/test/testcases.py index dea7fedbcc..1a7414b91d 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -4,7 +4,6 @@ import posixpath import sys import threading import unittest -import warnings from collections import Counter from contextlib import contextmanager from copy import copy @@ -38,7 +37,6 @@ from django.test.utils import ( override_settings, ) from django.utils.decorators import classproperty -from django.utils.deprecation import RemovedInDjango31Warning from django.views.static import serve __all__ = ('TestCase', 'TransactionTestCase', @@ -144,25 +142,6 @@ class _DatabaseFailure: raise AssertionError(self.message) -class _SimpleTestCaseDatabasesDescriptor: - """Descriptor for SimpleTestCase.allow_database_queries deprecation.""" - def __get__(self, instance, cls=None): - try: - allow_database_queries = cls.allow_database_queries - except AttributeError: - pass - else: - msg = ( - '`SimpleTestCase.allow_database_queries` is deprecated. ' - 'Restrict the databases available during the execution of ' - '%s.%s with the `databases` attribute instead.' - ) % (cls.__module__, cls.__qualname__) - warnings.warn(msg, RemovedInDjango31Warning) - if allow_database_queries: - return {DEFAULT_DB_ALIAS} - return set() - - class SimpleTestCase(unittest.TestCase): # The class we'll use for the test client self.client. @@ -171,7 +150,7 @@ class SimpleTestCase(unittest.TestCase): _overridden_settings = None _modified_settings = None - databases = _SimpleTestCaseDatabasesDescriptor() + databases = set() _disallowed_database_msg = ( 'Database %(operation)s to %(alias)r are not allowed in SimpleTestCase ' 'subclasses. Either subclass TestCase or TransactionTestCase to ensure ' @@ -870,26 +849,6 @@ class SimpleTestCase(unittest.TestCase): self.fail(self._formatMessage(msg, standardMsg)) -class _TransactionTestCaseDatabasesDescriptor: - """Descriptor for TransactionTestCase.multi_db deprecation.""" - msg = ( - '`TransactionTestCase.multi_db` is deprecated. Databases available ' - 'during this test can be defined using %s.%s.databases.' - ) - - def __get__(self, instance, cls=None): - try: - multi_db = cls.multi_db - except AttributeError: - pass - else: - msg = self.msg % (cls.__module__, cls.__qualname__) - warnings.warn(msg, RemovedInDjango31Warning) - if multi_db: - return set(connections) - return {DEFAULT_DB_ALIAS} - - class TransactionTestCase(SimpleTestCase): # Subclasses can ask for resetting of auto increment sequence before each @@ -902,7 +861,7 @@ class TransactionTestCase(SimpleTestCase): # Subclasses can define fixtures which will be automatically installed. fixtures = None - databases = _TransactionTestCaseDatabasesDescriptor() + databases = {DEFAULT_DB_ALIAS} _disallowed_database_msg = ( 'Database %(operation)s to %(alias)r are not allowed in this test. ' 'Add %(alias)r to %(test)s.databases to ensure proper test isolation ' @@ -1075,14 +1034,6 @@ def connections_support_transactions(aliases=None): return all(conn.features.supports_transactions for conn in conns) -class _TestCaseDatabasesDescriptor(_TransactionTestCaseDatabasesDescriptor): - """Descriptor for TestCase.multi_db deprecation.""" - msg = ( - '`TestCase.multi_db` is deprecated. Databases available during this ' - 'test can be defined using %s.%s.databases.' - ) - - class TestCase(TransactionTestCase): """ Similar to TransactionTestCase, but use `transaction.atomic()` to achieve @@ -1096,8 +1047,6 @@ class TestCase(TransactionTestCase): On database backends with no transaction support, TestCase behaves as TransactionTestCase. """ - databases = _TestCaseDatabasesDescriptor() - @classmethod def _enter_atomics(cls): """Open atomic blocks for multiple databases.""" diff --git a/docs/releases/1.9.txt b/docs/releases/1.9.txt index ce39f4fa3e..2fdf361af1 100644 --- a/docs/releases/1.9.txt +++ b/docs/releases/1.9.txt @@ -1091,9 +1091,8 @@ Miscellaneous * In order to enforce test isolation, database queries are not allowed by default in :class:`~django.test.SimpleTestCase` tests anymore. You - can disable this behavior by setting the - :attr:`~django.test.SimpleTestCase.allow_database_queries` class attribute - to ``True`` on your test class. + can disable this behavior by setting the ``allow_database_queries`` class + attribute to ``True`` on your test class. * ``ResolverMatch.app_name`` was changed to contain the full namespace path in the case of nested namespaces. For consistency with diff --git a/docs/releases/2.2.txt b/docs/releases/2.2.txt index 2639aa886a..3fb1f134fb 100644 --- a/docs/releases/2.2.txt +++ b/docs/releases/2.2.txt @@ -508,8 +508,8 @@ Miscellaneous first positional argument, if it accepts it. Support for overrides that don't accept it will be removed in Django 3.1. -* The :attr:`.SimpleTestCase.allow_database_queries`, - :attr:`.TransactionTestCase.multi_db`, and :attr:`.TestCase.multi_db` +* The ``SimpleTestCase.allow_database_queries``, + ``TransactionTestCase.multi_db``, and ``TestCase.multi_db`` attributes are deprecated in favor of :attr:`.SimpleTestCase.databases`, :attr:`.TransactionTestCase.databases`, and :attr:`.TestCase.databases`. These new attributes allow databases dependencies to be declared in order to diff --git a/docs/releases/3.1.txt b/docs/releases/3.1.txt index d90a784fd9..3f7e7f261b 100644 --- a/docs/releases/3.1.txt +++ b/docs/releases/3.1.txt @@ -240,3 +240,6 @@ to remove usage of these features. * The ``FILE_CHARSET`` setting is removed. * ``django.contrib.staticfiles.storage.CachedStaticFilesStorage`` is removed. + +* Support for ``SimpleTestCase.allow_database_queries`` and + ``TransactionTestCase.multi_db`` is removed. diff --git a/docs/topics/testing/tools.txt b/docs/topics/testing/tools.txt index bc88e2defa..41652cbee1 100644 --- a/docs/topics/testing/tools.txt +++ b/docs/topics/testing/tools.txt @@ -747,14 +747,6 @@ If your tests make any database queries, use subclasses setting the ``databases`` class attribute to ``'__all__'`` on your test class. -.. attribute:: SimpleTestCase.allow_database_queries - - .. deprecated:: 2.2 - - This attribute is deprecated in favor of :attr:`databases`. The previous - behavior of ``allow_database_queries = True`` can be achieved by setting - ``databases = '__all__'``. - .. warning:: ``SimpleTestCase`` and its subclasses (e.g. ``TestCase``, ...) rely on @@ -1180,14 +1172,6 @@ only loaded into the ``default`` database. Queries against databases not in ``databases`` will give assertion errors to prevent state leaking between tests. -.. attribute:: TransactionTestCase.multi_db - -.. deprecated:: 2.2 - -This attribute is deprecated in favor of :attr:`~TransactionTestCase.databases`. -The previous behavior of ``multi_db = True`` can be achieved by setting -``databases = '__all__'``. - .. attribute:: TestCase.databases By default, only the ``default`` database will be wrapped in a transaction @@ -1210,14 +1194,6 @@ This test will only allow queries against the ``other`` database. Just like for ``'__all__'`` constant can be used to specify that the test should allow queries to all databases. -.. attribute:: TestCase.multi_db - -.. deprecated:: 2.2 - -This attribute is deprecated in favor of :attr:`~TestCase.databases`. The -previous behavior of ``multi_db = True`` can be achieved by setting -``databases = '__all__'``. - .. _overriding-settings: Overriding settings diff --git a/tests/test_utils/test_deprecated_features.py b/tests/test_utils/test_deprecated_features.py deleted file mode 100644 index fbed5e14c5..0000000000 --- a/tests/test_utils/test_deprecated_features.py +++ /dev/null @@ -1,64 +0,0 @@ -from django.db import connections -from django.db.utils import DEFAULT_DB_ALIAS -from django.test import SimpleTestCase, TestCase, TransactionTestCase -from django.utils.deprecation import RemovedInDjango31Warning - - -class AllowDatabaseQueriesDeprecationTests(SimpleTestCase): - def test_enabled(self): - class AllowedDatabaseQueries(SimpleTestCase): - allow_database_queries = True - message = ( - '`SimpleTestCase.allow_database_queries` is deprecated. Restrict ' - 'the databases available during the execution of ' - 'test_utils.test_deprecated_features.AllowDatabaseQueriesDeprecationTests.' - 'test_enabled..AllowedDatabaseQueries with the ' - '`databases` attribute instead.' - ) - with self.assertWarnsMessage(RemovedInDjango31Warning, message): - self.assertEqual(AllowedDatabaseQueries.databases, {'default'}) - - def test_explicitly_disabled(self): - class AllowedDatabaseQueries(SimpleTestCase): - allow_database_queries = False - message = ( - '`SimpleTestCase.allow_database_queries` is deprecated. Restrict ' - 'the databases available during the execution of ' - 'test_utils.test_deprecated_features.AllowDatabaseQueriesDeprecationTests.' - 'test_explicitly_disabled..AllowedDatabaseQueries with ' - 'the `databases` attribute instead.' - ) - with self.assertWarnsMessage(RemovedInDjango31Warning, message): - self.assertEqual(AllowedDatabaseQueries.databases, set()) - - -class MultiDbDeprecationTests(SimpleTestCase): - def test_transaction_test_case(self): - class MultiDbTestCase(TransactionTestCase): - multi_db = True - message = ( - '`TransactionTestCase.multi_db` is deprecated. Databases ' - 'available during this test can be defined using ' - 'test_utils.test_deprecated_features.MultiDbDeprecationTests.' - 'test_transaction_test_case..MultiDbTestCase.databases.' - ) - with self.assertWarnsMessage(RemovedInDjango31Warning, message): - self.assertEqual(MultiDbTestCase.databases, set(connections)) - MultiDbTestCase.multi_db = False - with self.assertWarnsMessage(RemovedInDjango31Warning, message): - self.assertEqual(MultiDbTestCase.databases, {DEFAULT_DB_ALIAS}) - - def test_test_case(self): - class MultiDbTestCase(TestCase): - multi_db = True - message = ( - '`TestCase.multi_db` is deprecated. Databases available during ' - 'this test can be defined using ' - 'test_utils.test_deprecated_features.MultiDbDeprecationTests.' - 'test_test_case..MultiDbTestCase.databases.' - ) - with self.assertWarnsMessage(RemovedInDjango31Warning, message): - self.assertEqual(MultiDbTestCase.databases, set(connections)) - MultiDbTestCase.multi_db = False - with self.assertWarnsMessage(RemovedInDjango31Warning, message): - self.assertEqual(MultiDbTestCase.databases, {DEFAULT_DB_ALIAS})