summaryrefslogtreecommitdiff
path: root/tests
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-26 00:12:17 +0700
commit7fa6781f818deea61cef4c13b139fa9586a6ca7a (patch)
treee1b1909276317b6a5ff968f1bcaa96d2ed0a3e38 /tests
parent7227ec8eccde8ea28addad6c276276cb1d2a6efe (diff)
[1.7.x] 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. Backport of 8c4ca16c65 and b62f72498a from master
Diffstat (limited to 'tests')
-rw-r--r--tests/apps/tests.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/apps/tests.py b/tests/apps/tests.py
index 513ed32039..1a308efb6a 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,44 @@ 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. "
+ "Reloading models is not advised as it can lead to inconsistencies, "
+ "most notably with related models.")
+
+ # 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):