1
0
mirror of https://github.com/django/django.git synced 2024-12-22 09:05:43 +00:00

Fixed #35666 -- Documented stacklevel usage and testing, and adjusted test suite accordingly.

Over the years we've had multiple instances of hit and misses when
emitting warnings: either setting the wrong stacklevel or not setting
it at all.

This work adds assertions for the existing warnings that were declaring
the correct stacklevel, but were lacking tests for it.
This commit is contained in:
Simon Charette 2024-08-09 13:03:24 -04:00 committed by nessita
parent 39abd56a7f
commit 57307bbc7d
16 changed files with 84 additions and 39 deletions

View File

@ -209,9 +209,10 @@ You should also add a test for the deprecation warning::
def test_foo_deprecation_warning(self): def test_foo_deprecation_warning(self):
msg = "Expected deprecation message" msg = "Expected deprecation message"
with self.assertWarnsMessage(RemovedInDjangoXXWarning, msg): with self.assertWarnsMessage(RemovedInDjangoXXWarning, msg) as ctx:
# invoke deprecated behavior # invoke deprecated behavior
... ...
self.assertEqual(ctx.filename, __file__)
It's important to include a ``RemovedInDjangoXXWarning`` comment above code It's important to include a ``RemovedInDjangoXXWarning`` comment above code
which has no warning reference, but will need to be changed or removed when the which has no warning reference, but will need to be changed or removed when the
@ -233,6 +234,7 @@ deprecation ends. For example::
warnings.warn( warnings.warn(
"foo() is deprecated.", "foo() is deprecated.",
category=RemovedInDjangoXXWarning, category=RemovedInDjangoXXWarning,
stacklevel=2,
) )
old_private_helper() old_private_helper()
... ...

View File

@ -240,7 +240,7 @@ class LogEntryTests(TestCase):
def test_log_action(self): def test_log_action(self):
msg = "LogEntryManager.log_action() is deprecated. Use log_actions() instead." msg = "LogEntryManager.log_action() is deprecated. Use log_actions() instead."
content_type_val = ContentType.objects.get_for_model(Article).pk content_type_val = ContentType.objects.get_for_model(Article).pk
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
log_entry = LogEntry.objects.log_action( log_entry = LogEntry.objects.log_action(
self.user.pk, self.user.pk,
content_type_val, content_type_val,
@ -250,6 +250,7 @@ class LogEntryTests(TestCase):
change_message="Changed something else", change_message="Changed something else",
) )
self.assertEqual(log_entry, LogEntry.objects.latest("id")) self.assertEqual(log_entry, LogEntry.objects.latest("id"))
self.assertEqual(ctx.filename, __file__)
def test_log_actions(self): def test_log_actions(self):
queryset = Article.objects.all().order_by("-id") queryset = Article.objects.all().order_by("-id")
@ -297,9 +298,12 @@ class LogEntryTests(TestCase):
msg = ( msg = (
"The usage of log_action() is deprecated. Implement log_actions() instead." "The usage of log_action() is deprecated. Implement log_actions() instead."
) )
with self.assertNumQueries(3): with (
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): self.assertNumQueries(3),
LogEntry.objects2.log_actions(self.user.pk, queryset, DELETION) self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx,
):
LogEntry.objects2.log_actions(self.user.pk, queryset, DELETION)
self.assertEqual(ctx.filename, __file__)
log_values = ( log_values = (
LogEntry.objects.filter(action_flag=DELETION) LogEntry.objects.filter(action_flag=DELETION)
.order_by("id") .order_by("id")

View File

@ -412,15 +412,19 @@ class CheckConstraintTests(TestCase):
def test_check_deprecation(self): def test_check_deprecation(self):
msg = "CheckConstraint.check is deprecated in favor of `.condition`." msg = "CheckConstraint.check is deprecated in favor of `.condition`."
condition = models.Q(foo="bar") condition = models.Q(foo="bar")
with self.assertWarnsRegex(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
constraint = models.CheckConstraint(name="constraint", check=condition) constraint = models.CheckConstraint(name="constraint", check=condition)
with self.assertWarnsRegex(RemovedInDjango60Warning, msg): self.assertEqual(ctx.filename, __file__)
with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
self.assertIs(constraint.check, condition) self.assertIs(constraint.check, condition)
self.assertEqual(ctx.filename, __file__)
other_condition = models.Q(something="else") other_condition = models.Q(something="else")
with self.assertWarnsRegex(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
constraint.check = other_condition constraint.check = other_condition
with self.assertWarnsRegex(RemovedInDjango60Warning, msg): self.assertEqual(ctx.filename, __file__)
with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
self.assertIs(constraint.check, other_condition) self.assertIs(constraint.check, other_condition)
self.assertEqual(ctx.filename, __file__)
def test_database_default(self): def test_database_default(self):
models.CheckConstraint( models.CheckConstraint(

View File

@ -98,8 +98,9 @@ class GetPrefetchQuerySetDeprecation(TestCase):
"get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() " "get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() "
"instead." "instead."
) )
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
questions[0].answer_set.get_prefetch_queryset(questions) questions[0].answer_set.get_prefetch_queryset(questions)
self.assertEqual(ctx.filename, __file__)
def test_generic_foreign_key_warning(self): def test_generic_foreign_key_warning(self):
answers = Answer.objects.all() answers = Answer.objects.all()
@ -107,8 +108,9 @@ class GetPrefetchQuerySetDeprecation(TestCase):
"get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() " "get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() "
"instead." "instead."
) )
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
Answer.question.get_prefetch_queryset(answers) Answer.question.get_prefetch_queryset(answers)
self.assertEqual(ctx.filename, __file__)
class GetPrefetchQuerySetsTests(TestCase): class GetPrefetchQuerySetsTests(TestCase):

View File

@ -20,12 +20,14 @@ class RenameMethodsTests(SimpleTestCase):
the faulty method. the faulty method.
""" """
msg = "`Manager.old` method should be renamed `new`." msg = "`Manager.old` method should be renamed `new`."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
class Manager(metaclass=RenameManagerMethods): class Manager(metaclass=RenameManagerMethods):
def old(self): def old(self):
pass pass
self.assertEqual(ctx.filename, __file__)
def test_get_new_defined(self): def test_get_new_defined(self):
""" """
Ensure `old` complains and not `new` when only `new` is defined. Ensure `old` complains and not `new` when only `new` is defined.
@ -43,20 +45,23 @@ class RenameMethodsTests(SimpleTestCase):
self.assertEqual(len(recorded), 0) self.assertEqual(len(recorded), 0)
msg = "`Manager.old` is deprecated, use `new` instead." msg = "`Manager.old` is deprecated, use `new` instead."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
manager.old() manager.old()
self.assertEqual(ctx.filename, __file__)
def test_get_old_defined(self): def test_get_old_defined(self):
""" """
Ensure `old` complains when only `old` is defined. Ensure `old` complains when only `old` is defined.
""" """
msg = "`Manager.old` method should be renamed `new`." msg = "`Manager.old` method should be renamed `new`."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
class Manager(metaclass=RenameManagerMethods): class Manager(metaclass=RenameManagerMethods):
def old(self): def old(self):
pass pass
self.assertEqual(ctx.filename, __file__)
manager = Manager() manager = Manager()
with warnings.catch_warnings(record=True) as recorded: with warnings.catch_warnings(record=True) as recorded:
@ -65,8 +70,9 @@ class RenameMethodsTests(SimpleTestCase):
self.assertEqual(len(recorded), 0) self.assertEqual(len(recorded), 0)
msg = "`Manager.old` is deprecated, use `new` instead." msg = "`Manager.old` is deprecated, use `new` instead."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
manager.old() manager.old()
self.assertEqual(ctx.filename, __file__)
def test_deprecated_subclass_renamed(self): def test_deprecated_subclass_renamed(self):
""" """
@ -79,21 +85,25 @@ class RenameMethodsTests(SimpleTestCase):
pass pass
msg = "`Deprecated.old` method should be renamed `new`." msg = "`Deprecated.old` method should be renamed `new`."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
class Deprecated(Renamed): class Deprecated(Renamed):
def old(self): def old(self):
super().old() super().old()
self.assertEqual(ctx.filename, __file__)
deprecated = Deprecated() deprecated = Deprecated()
msg = "`Renamed.old` is deprecated, use `new` instead." msg = "`Renamed.old` is deprecated, use `new` instead."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
deprecated.new() deprecated.new()
self.assertEqual(ctx.filename, __file__)
msg = "`Deprecated.old` is deprecated, use `new` instead." msg = "`Deprecated.old` is deprecated, use `new` instead."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
deprecated.old() deprecated.old()
self.assertEqual(ctx.filename, __file__)
def test_renamed_subclass_deprecated(self): def test_renamed_subclass_deprecated(self):
""" """
@ -101,12 +111,14 @@ class RenameMethodsTests(SimpleTestCase):
`old` subclass one that didn't. `old` subclass one that didn't.
""" """
msg = "`Deprecated.old` method should be renamed `new`." msg = "`Deprecated.old` method should be renamed `new`."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
class Deprecated(metaclass=RenameManagerMethods): class Deprecated(metaclass=RenameManagerMethods):
def old(self): def old(self):
pass pass
self.assertEqual(ctx.filename, __file__)
class Renamed(Deprecated): class Renamed(Deprecated):
def new(self): def new(self):
super().new() super().new()
@ -119,8 +131,9 @@ class RenameMethodsTests(SimpleTestCase):
self.assertEqual(len(recorded), 0) self.assertEqual(len(recorded), 0)
msg = "`Renamed.old` is deprecated, use `new` instead." msg = "`Renamed.old` is deprecated, use `new` instead."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
renamed.old() renamed.old()
self.assertEqual(ctx.filename, __file__)
def test_deprecated_subclass_renamed_and_mixins(self): def test_deprecated_subclass_renamed_and_mixins(self):
""" """
@ -142,20 +155,24 @@ class RenameMethodsTests(SimpleTestCase):
super().old() super().old()
msg = "`DeprecatedMixin.old` method should be renamed `new`." msg = "`DeprecatedMixin.old` method should be renamed `new`."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
class Deprecated(DeprecatedMixin, RenamedMixin, Renamed): class Deprecated(DeprecatedMixin, RenamedMixin, Renamed):
pass pass
self.assertEqual(ctx.filename, __file__)
deprecated = Deprecated() deprecated = Deprecated()
msg = "`RenamedMixin.old` is deprecated, use `new` instead." msg = "`RenamedMixin.old` is deprecated, use `new` instead."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
deprecated.new() deprecated.new()
self.assertEqual(ctx.filename, __file__)
msg = "`DeprecatedMixin.old` is deprecated, use `new` instead." msg = "`DeprecatedMixin.old` is deprecated, use `new` instead."
with self.assertWarnsMessage(DeprecationWarning, msg): with self.assertWarnsMessage(DeprecationWarning, msg) as ctx:
deprecated.old() deprecated.old()
self.assertEqual(ctx.filename, __file__)
def test_removedafternextversionwarning_pending(self): def test_removedafternextversionwarning_pending(self):
self.assertTrue( self.assertTrue(

View File

@ -163,9 +163,10 @@ class URLFieldAssumeSchemeDeprecationTest(FormFieldAssertionsMixin, SimpleTestCa
"or set the FORMS_URLFIELD_ASSUME_HTTPS transitional setting to True to " "or set the FORMS_URLFIELD_ASSUME_HTTPS transitional setting to True to "
"opt into using 'https' as the new default scheme." "opt into using 'https' as the new default scheme."
) )
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
f = URLField() f = URLField()
self.assertEqual(f.clean("example.com"), "http://example.com") self.assertEqual(f.clean("example.com"), "http://example.com")
self.assertEqual(ctx.filename, __file__)
@ignore_warnings(category=RemovedInDjango60Warning) @ignore_warnings(category=RemovedInDjango60Warning)
def test_urlfield_forms_urlfield_assume_https(self): def test_urlfield_forms_urlfield_assume_https(self):

View File

@ -972,6 +972,7 @@ class DeprecationTests(SimpleTestCase):
def test_coord_setter_deprecation(self): def test_coord_setter_deprecation(self):
geom = OGRGeometry("POINT (1 2)") geom = OGRGeometry("POINT (1 2)")
msg = "coord_dim setter is deprecated. Use set_3d() instead." msg = "coord_dim setter is deprecated. Use set_3d() instead."
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
geom.coord_dim = 3 geom.coord_dim = 3
self.assertEqual(geom.coord_dim, 3) self.assertEqual(geom.coord_dim, 3)
self.assertEqual(ctx.filename, __file__)

View File

@ -207,16 +207,18 @@ class GeoLite2Test(SimpleTestCase):
def test_coords_deprecation_warning(self): def test_coords_deprecation_warning(self):
g = GeoIP2() g = GeoIP2()
msg = "GeoIP2.coords() is deprecated. Use GeoIP2.lon_lat() instead." msg = "GeoIP2.coords() is deprecated. Use GeoIP2.lon_lat() instead."
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
e1, e2 = g.coords(self.ipv4_str) e1, e2 = g.coords(self.ipv4_str)
self.assertIsInstance(e1, float) self.assertIsInstance(e1, float)
self.assertIsInstance(e2, float) self.assertIsInstance(e2, float)
self.assertEqual(ctx.filename, __file__)
def test_open_deprecation_warning(self): def test_open_deprecation_warning(self):
msg = "GeoIP2.open() is deprecated. Use GeoIP2() instead." msg = "GeoIP2.open() is deprecated. Use GeoIP2() instead."
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
g = GeoIP2.open(settings.GEOIP_PATH, GeoIP2.MODE_AUTO) g = GeoIP2.open(settings.GEOIP_PATH, GeoIP2.MODE_AUTO)
self.assertTrue(g._reader) self.assertTrue(g._reader)
self.assertEqual(ctx.filename, __file__)
@skipUnless(HAS_GEOIP2, "GeoIP2 is required.") @skipUnless(HAS_GEOIP2, "GeoIP2 is required.")

View File

@ -583,8 +583,9 @@ class ManyToManyTests(TestCase):
"get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() " "get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() "
"instead." "instead."
) )
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
self.a1.publications.get_prefetch_queryset(articles) self.a1.publications.get_prefetch_queryset(articles)
self.assertEqual(ctx.filename, __file__)
def test_get_prefetch_querysets_invalid_querysets_length(self): def test_get_prefetch_querysets_invalid_querysets_length(self):
articles = Article.objects.all() articles = Article.objects.all()

View File

@ -894,8 +894,9 @@ class ManyToOneTests(TestCase):
"get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() " "get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() "
"instead." "instead."
) )
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
City.country.get_prefetch_queryset(cities) City.country.get_prefetch_queryset(cities)
self.assertEqual(ctx.filename, __file__)
def test_get_prefetch_queryset_reverse_warning(self): def test_get_prefetch_queryset_reverse_warning(self):
usa = Country.objects.create(name="United States") usa = Country.objects.create(name="United States")
@ -905,8 +906,9 @@ class ManyToOneTests(TestCase):
"get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() " "get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() "
"instead." "instead."
) )
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
usa.cities.get_prefetch_queryset(countries) usa.cities.get_prefetch_queryset(countries)
self.assertEqual(ctx.filename, __file__)
def test_get_prefetch_querysets_invalid_querysets_length(self): def test_get_prefetch_querysets_invalid_querysets_length(self):
City.objects.create(name="Chicago") City.objects.create(name="Chicago")

View File

@ -328,5 +328,6 @@ class ChoicesMetaDeprecationTests(SimpleTestCase):
from django.db.models import enums from django.db.models import enums
msg = "ChoicesMeta is deprecated in favor of ChoicesType." msg = "ChoicesMeta is deprecated in favor of ChoicesType."
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
enums.ChoicesMeta enums.ChoicesMeta
self.assertEqual(ctx.filename, __file__)

View File

@ -928,8 +928,9 @@ class ModelAdminTests(TestCase):
mock_request.user = User.objects.create(username="bill") mock_request.user = User.objects.create(username="bill")
content_type = get_content_type_for_model(self.band) content_type = get_content_type_for_model(self.band)
msg = "ModelAdmin.log_deletion() is deprecated. Use log_deletions() instead." msg = "ModelAdmin.log_deletion() is deprecated. Use log_deletions() instead."
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
created = ma.log_deletion(mock_request, self.band, str(self.band)) created = ma.log_deletion(mock_request, self.band, str(self.band))
self.assertEqual(ctx.filename, __file__)
fetched = LogEntry.objects.filter(action_flag=DELETION).latest("id") fetched = LogEntry.objects.filter(action_flag=DELETION).latest("id")
self.assertEqual(created, fetched) self.assertEqual(created, fetched)
self.assertEqual(fetched.action_flag, DELETION) self.assertEqual(fetched.action_flag, DELETION)
@ -966,8 +967,9 @@ class ModelAdminTests(TestCase):
"instead." "instead."
) )
with self.assertNumQueries(3): with self.assertNumQueries(3):
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
ima.log_deletions(mock_request, queryset) ima.log_deletions(mock_request, queryset)
self.assertEqual(ctx.filename, __file__)
logs = ( logs = (
LogEntry.objects.filter(action_flag=DELETION) LogEntry.objects.filter(action_flag=DELETION)
.order_by("id") .order_by("id")

View File

@ -612,8 +612,9 @@ class OneToOneTests(TestCase):
"get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() " "get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() "
"instead." "instead."
) )
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
Place.bar.get_prefetch_queryset(places) Place.bar.get_prefetch_queryset(places)
self.assertEqual(ctx.filename, __file__)
def test_get_prefetch_querysets_invalid_querysets_length(self): def test_get_prefetch_querysets_invalid_querysets_length(self):
places = Place.objects.all() places = Place.objects.all()

View File

@ -2022,13 +2022,15 @@ class DeprecationTests(TestCase):
"get_current_querysets() instead." "get_current_querysets() instead."
) )
authors = Author.objects.all() authors = Author.objects.all()
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
self.assertEqual( self.assertEqual(
Prefetch("authors", authors).get_current_queryset(1), Prefetch("authors", authors).get_current_queryset(1),
authors, authors,
) )
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): self.assertEqual(ctx.filename, __file__)
with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
self.assertIsNone(Prefetch("authors").get_current_queryset(1)) self.assertIsNone(Prefetch("authors").get_current_queryset(1))
self.assertEqual(ctx.filename, __file__)
@ignore_warnings(category=RemovedInDjango60Warning) @ignore_warnings(category=RemovedInDjango60Warning)
def test_prefetch_one_level_fallback(self): def test_prefetch_one_level_fallback(self):

View File

@ -212,10 +212,11 @@ class SimplifiedURLTests(SimpleTestCase):
"converters is deprecated and will be removed in Django 6.0." "converters is deprecated and will be removed in Django 6.0."
) )
try: try:
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
register_converter(IntConverter, "int") register_converter(IntConverter, "int")
finally: finally:
REGISTERED_CONVERTERS.pop("int", None) REGISTERED_CONVERTERS.pop("int", None)
self.assertEqual(ctx.filename, __file__)
def test_warning_override_converter(self): def test_warning_override_converter(self):
# RemovedInDjango60Warning: when the deprecation ends, replace with # RemovedInDjango60Warning: when the deprecation ends, replace with
@ -226,11 +227,12 @@ class SimplifiedURLTests(SimpleTestCase):
"registered converters is deprecated and will be removed in Django 6.0." "registered converters is deprecated and will be removed in Django 6.0."
) )
try: try:
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
register_converter(Base64Converter, "base64") register_converter(Base64Converter, "base64")
register_converter(Base64Converter, "base64") register_converter(Base64Converter, "base64")
finally: finally:
REGISTERED_CONVERTERS.pop("base64", None) REGISTERED_CONVERTERS.pop("base64", None)
self.assertEqual(ctx.filename, __file__)
def test_invalid_view(self): def test_invalid_view(self):
msg = "view must be a callable or a list/tuple in the case of include()." msg = "view must be a callable or a list/tuple in the case of include()."

View File

@ -11,5 +11,6 @@ class TestIterCompat(SimpleTestCase):
"django.utils.itercompat.is_iterable() is deprecated. " "django.utils.itercompat.is_iterable() is deprecated. "
"Use isinstance(..., collections.abc.Iterable) instead." "Use isinstance(..., collections.abc.Iterable) instead."
) )
with self.assertWarnsMessage(RemovedInDjango60Warning, msg): with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
is_iterable([]) is_iterable([])
self.assertEqual(ctx.filename, __file__)