summaryrefslogtreecommitdiff
path: root/tests/apps
diff options
context:
space:
mode:
authorLoic Bistuer <loic.bistuer@gmail.com>2014-10-22 23:16:32 +0700
committerLoic Bistuer <loic.bistuer@gmail.com>2014-10-23 00:55:02 +0700
commit8c4ca16c65174db63471f12b005f5423b61de073 (patch)
tree1274cd724c9ea742fc6ad61477b67e11a6ba57e7 /tests/apps
parent4bf86d25e576dc68c38b3b7470900f8a681cd5e5 (diff)
downloaddjango-8c4ca16c65174db63471f12b005f5423b61de073.tar.gz
Fixed #23621 -- Warn for duplicate models when a module is reloaded.
Previously a RuntimeError was raised every time two models clashed in the app registry. This prevented reloading a module in a REPL; while it's not recommended to do so, we decided not to forbid this use-case by turning the error into a warning. Thanks @dfunckt and Sergey Pashinin for the initial patches.
Diffstat (limited to 'tests/apps')
-rw-r--r--tests/apps/tests.py36
1 files changed, 36 insertions, 0 deletions
diff --git a/tests/apps/tests.py b/tests/apps/tests.py
index 513ed32039..7246cd57d6 100644
--- a/tests/apps/tests.py
+++ b/tests/apps/tests.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
import os
import sys
from unittest import skipUnless
+import warnings
from django.apps import apps, AppConfig
from django.apps.registry import Apps
@@ -208,6 +209,41 @@ class AppsTests(TestCase):
apps.get_model("apps", "SouthPonies")
self.assertEqual(new_apps.get_model("apps", "SouthPonies"), temp_model)
+ def test_model_clash(self):
+ """
+ Test for behavior when two models clash in the app registry.
+ """
+ new_apps = Apps(["apps"])
+ meta_contents = {
+ 'app_label': "apps",
+ 'apps': new_apps,
+ }
+
+ body = {}
+ body['Meta'] = type(str("Meta"), tuple(), meta_contents)
+ body['__module__'] = TotallyNormal.__module__
+ type(str("SouthPonies"), (models.Model,), body)
+
+ # When __name__ and __module__ match we assume the module
+ # was reloaded and issue a warning. This use-case is
+ # useful for REPL. Refs #23621.
+ body = {}
+ body['Meta'] = type(str("Meta"), tuple(), meta_contents)
+ body['__module__'] = TotallyNormal.__module__
+ with warnings.catch_warnings(record=True) as w:
+ type(str("SouthPonies"), (models.Model,), body)
+ self.assertEqual(len(w), 1)
+ self.assertTrue(issubclass(w[-1].category, RuntimeWarning))
+ self.assertEqual(str(w[-1].message), "Model 'southponies.apps' was already registered.")
+
+ # If it doesn't appear to be a reloaded module then we expect
+ # a RuntimeError.
+ body = {}
+ body['Meta'] = type(str("Meta"), tuple(), meta_contents)
+ body['__module__'] = TotallyNormal.__module__ + '.whatever'
+ with six.assertRaisesRegex(self, RuntimeError,
+ "Conflicting 'southponies' models in application 'apps':.*"):
+ type(str("SouthPonies"), (models.Model,), body)
class Stub(object):
def __init__(self, **kwargs):