1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
import warnings
from django.test import SimpleTestCase
from django.utils.deprecation import (
DeprecationInstanceCheck, RemovedInNextVersionWarning, RenameMethodsBase,
)
class RenameManagerMethods(RenameMethodsBase):
renamed_methods = (
('old', 'new', DeprecationWarning),
)
class RenameMethodsTests(SimpleTestCase):
"""
Tests the `RenameMethodsBase` type introduced to rename `get_query_set`
to `get_queryset` across the code base following #15363.
"""
def test_class_definition_warnings(self):
"""
Ensure a warning is raised upon class definition to suggest renaming
the faulty method.
"""
msg = '`Manager.old` method should be renamed `new`.'
with self.assertWarnsMessage(DeprecationWarning, msg):
class Manager(metaclass=RenameManagerMethods):
def old(self):
pass
def test_get_new_defined(self):
"""
Ensure `old` complains and not `new` when only `new` is defined.
"""
class Manager(metaclass=RenameManagerMethods):
def new(self):
pass
manager = Manager()
with warnings.catch_warnings(record=True) as recorded:
warnings.simplefilter('always')
manager.new()
self.assertEqual(len(recorded), 0)
msg = '`Manager.old` is deprecated, use `new` instead.'
with self.assertWarnsMessage(DeprecationWarning, msg):
manager.old()
def test_get_old_defined(self):
"""
Ensure `old` complains when only `old` is defined.
"""
msg = '`Manager.old` method should be renamed `new`.'
with self.assertWarnsMessage(DeprecationWarning, msg):
class Manager(metaclass=RenameManagerMethods):
def old(self):
pass
manager = Manager()
with warnings.catch_warnings(record=True) as recorded:
warnings.simplefilter('always')
manager.new()
self.assertEqual(len(recorded), 0)
msg = '`Manager.old` is deprecated, use `new` instead.'
with self.assertWarnsMessage(DeprecationWarning, msg):
manager.old()
def test_deprecated_subclass_renamed(self):
"""
Ensure the correct warnings are raised when a class that didn't rename
`old` subclass one that did.
"""
class Renamed(metaclass=RenameManagerMethods):
def new(self):
pass
msg = '`Deprecated.old` method should be renamed `new`.'
with self.assertWarnsMessage(DeprecationWarning, msg):
class Deprecated(Renamed):
def old(self):
super().old()
deprecated = Deprecated()
msg = '`Renamed.old` is deprecated, use `new` instead.'
with self.assertWarnsMessage(DeprecationWarning, msg):
deprecated.new()
msg = '`Deprecated.old` is deprecated, use `new` instead.'
with self.assertWarnsMessage(DeprecationWarning, msg):
deprecated.old()
def test_renamed_subclass_deprecated(self):
"""
Ensure the correct warnings are raised when a class that renamed
`old` subclass one that didn't.
"""
msg = '`Deprecated.old` method should be renamed `new`.'
with self.assertWarnsMessage(DeprecationWarning, msg):
class Deprecated(metaclass=RenameManagerMethods):
def old(self):
pass
class Renamed(Deprecated):
def new(self):
super().new()
renamed = Renamed()
with warnings.catch_warnings(record=True) as recorded:
warnings.simplefilter('always')
renamed.new()
self.assertEqual(len(recorded), 0)
msg = '`Renamed.old` is deprecated, use `new` instead.'
with self.assertWarnsMessage(DeprecationWarning, msg):
renamed.old()
def test_deprecated_subclass_renamed_and_mixins(self):
"""
Ensure the correct warnings are raised when a subclass inherit from a
class that renamed `old` and mixins that may or may not have renamed
`new`.
"""
class Renamed(metaclass=RenameManagerMethods):
def new(self):
pass
class RenamedMixin:
def new(self):
super().new()
class DeprecatedMixin:
def old(self):
super().old()
msg = '`DeprecatedMixin.old` method should be renamed `new`.'
with self.assertWarnsMessage(DeprecationWarning, msg):
class Deprecated(DeprecatedMixin, RenamedMixin, Renamed):
pass
deprecated = Deprecated()
msg = '`RenamedMixin.old` is deprecated, use `new` instead.'
with self.assertWarnsMessage(DeprecationWarning, msg):
deprecated.new()
msg = '`DeprecatedMixin.old` is deprecated, use `new` instead.'
with self.assertWarnsMessage(DeprecationWarning, msg):
deprecated.old()
class DeprecationInstanceCheckTest(SimpleTestCase):
def test_warning(self):
class Manager(metaclass=DeprecationInstanceCheck):
alternative = 'fake.path.Foo'
deprecation_warning = RemovedInNextVersionWarning
msg = '`Manager` is deprecated, use `fake.path.Foo` instead.'
with self.assertWarnsMessage(RemovedInNextVersionWarning, msg):
isinstance(object, Manager)
|