tests.py 6.0 KB

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