summaryrefslogtreecommitdiff
path: root/tests/regressiontests
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2010-05-04 06:14:47 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2010-05-04 06:14:47 +0000
commit4ca7c4e34de273f0deab727d57132c9d18241b0b (patch)
treea92caadaa2d99d610290f50b03585f0a3ec34504 /tests/regressiontests
parent7fc25715d6af20e14827c85170fff20f82ded8ab (diff)
Fixed #13464 -- Reworked module_has_submodule to break the requirement for loader and finder to be the same class. Thanks to Alex Gaynor for the report and patch, and Brett Cannon for suggesting the approach.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@13082 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests/regressiontests')
-rw-r--r--tests/regressiontests/utils/eggs/test_egg.eggbin0 -> 4844 bytes
-rw-r--r--tests/regressiontests/utils/module_loading.py139
-rw-r--r--tests/regressiontests/utils/test_module/__init__.py0
-rw-r--r--tests/regressiontests/utils/test_module/bad_module.py3
-rw-r--r--tests/regressiontests/utils/test_module/good_module.py1
-rw-r--r--tests/regressiontests/utils/tests.py1
6 files changed, 144 insertions, 0 deletions
diff --git a/tests/regressiontests/utils/eggs/test_egg.egg b/tests/regressiontests/utils/eggs/test_egg.egg
new file mode 100644
index 0000000000..9b08cc10ef
--- /dev/null
+++ b/tests/regressiontests/utils/eggs/test_egg.egg
Binary files differ
diff --git a/tests/regressiontests/utils/module_loading.py b/tests/regressiontests/utils/module_loading.py
new file mode 100644
index 0000000000..7b233f8e14
--- /dev/null
+++ b/tests/regressiontests/utils/module_loading.py
@@ -0,0 +1,139 @@
+import os
+import sys
+from unittest import TestCase
+from zipimport import zipimporter
+
+from django.utils.importlib import import_module
+from django.utils.module_loading import module_has_submodule
+
+class DefaultLoader(TestCase):
+ def test_loader(self):
+ "Normal module existence can be tested"
+ test_module = import_module('regressiontests.utils.test_module')
+
+ # An importable child
+ self.assertTrue(module_has_submodule(test_module, 'good_module'))
+ mod = import_module('regressiontests.utils.test_module.good_module')
+ self.assertEqual(mod.content, 'Good Module')
+
+ # A child that exists, but will generate an import error if loaded
+ self.assertTrue(module_has_submodule(test_module, 'bad_module'))
+ self.assertRaises(ImportError, import_module, 'regressiontests.utils.test_module.bad_module')
+
+ # A child that doesn't exist
+ self.assertFalse(module_has_submodule(test_module, 'no_such_module'))
+ self.assertRaises(ImportError, import_module, 'regressiontests.utils.test_module.no_such_module')
+
+class EggLoader(TestCase):
+ def setUp(self):
+ self.old_path = sys.path
+ self.egg_dir = '%s/eggs' % os.path.dirname(__file__)
+
+ def tearDown(self):
+ sys.path = self.old_path
+
+ def test_shallow_loader(self):
+ "Module existence can be tested inside eggs"
+ egg_name = '%s/test_egg.egg' % self.egg_dir
+ sys.path.append(egg_name)
+ egg_module = import_module('egg_module')
+
+ # An importable child
+ self.assertTrue(module_has_submodule(egg_module, 'good_module'))
+ mod = import_module('egg_module.good_module')
+ self.assertEqual(mod.content, 'Good Module')
+
+ # A child that exists, but will generate an import error if loaded
+ self.assertTrue(module_has_submodule(egg_module, 'bad_module'))
+ self.assertRaises(ImportError, import_module, 'egg_module.bad_module')
+
+ # A child that doesn't exist
+ self.assertFalse(module_has_submodule(egg_module, 'no_such_module'))
+ self.assertRaises(ImportError, import_module, 'egg_module.no_such_module')
+
+ def test_deep_loader(self):
+ "Modules deep inside an egg can still be tested for existence"
+ egg_name = '%s/test_egg.egg' % self.egg_dir
+ sys.path.append(egg_name)
+ egg_module = import_module('egg_module.sub1.sub2')
+
+ # An importable child
+ self.assertTrue(module_has_submodule(egg_module, 'good_module'))
+ mod = import_module('egg_module.sub1.sub2.good_module')
+ self.assertEqual(mod.content, 'Deep Good Module')
+
+ # A child that exists, but will generate an import error if loaded
+ self.assertTrue(module_has_submodule(egg_module, 'bad_module'))
+ self.assertRaises(ImportError, import_module, 'egg_module.sub1.sub2.bad_module')
+
+ # A child that doesn't exist
+ self.assertFalse(module_has_submodule(egg_module, 'no_such_module'))
+ self.assertRaises(ImportError, import_module, 'egg_module.sub1.sub2.no_such_module')
+
+class TestFinder(object):
+ def __init__(self, *args, **kwargs):
+ self.importer = zipimporter(*args, **kwargs)
+
+ def find_module(self, path):
+ importer = self.importer.find_module(path)
+ if importer is None:
+ return
+ return TestLoader(importer)
+
+class TestLoader(object):
+ def __init__(self, importer):
+ self.importer = importer
+
+ def load_module(self, name):
+ mod = self.importer.load_module(name)
+ mod.__loader__ = self
+ return mod
+
+class CustomLoader(TestCase):
+ def setUp(self):
+ self.egg_dir = '%s/eggs' % os.path.dirname(__file__)
+ self.old_path = sys.path
+ sys.path_hooks.insert(0, TestFinder)
+ sys.path_importer_cache.clear()
+
+ def tearDown(self):
+ sys.path = self.old_path
+ sys.path_hooks.pop(0)
+
+ def test_shallow_loader(self):
+ "Module existence can be tested with a custom loader"
+ egg_name = '%s/test_egg.egg' % self.egg_dir
+ sys.path.append(egg_name)
+ egg_module = import_module('egg_module')
+
+ # An importable child
+ self.assertTrue(module_has_submodule(egg_module, 'good_module'))
+ mod = import_module('egg_module.good_module')
+ self.assertEqual(mod.content, 'Good Module')
+
+ # A child that exists, but will generate an import error if loaded
+ self.assertTrue(module_has_submodule(egg_module, 'bad_module'))
+ self.assertRaises(ImportError, import_module, 'egg_module.bad_module')
+
+ # A child that doesn't exist
+ self.assertFalse(module_has_submodule(egg_module, 'no_such_module'))
+ self.assertRaises(ImportError, import_module, 'egg_module.no_such_module')
+
+ def test_deep_loader(self):
+ "Modules existence can be tested deep inside a custom loader"
+ egg_name = '%s/test_egg.egg' % self.egg_dir
+ sys.path.append(egg_name)
+ egg_module = import_module('egg_module.sub1.sub2')
+
+ # An importable child
+ self.assertTrue(module_has_submodule(egg_module, 'good_module'))
+ mod = import_module('egg_module.sub1.sub2.good_module')
+ self.assertEqual(mod.content, 'Deep Good Module')
+
+ # A child that exists, but will generate an import error if loaded
+ self.assertTrue(module_has_submodule(egg_module, 'bad_module'))
+ self.assertRaises(ImportError, import_module, 'egg_module.sub1.sub2.bad_module')
+
+ # A child that doesn't exist
+ self.assertFalse(module_has_submodule(egg_module, 'no_such_module'))
+ self.assertRaises(ImportError, import_module, 'egg_module.sub1.sub2.no_such_module')
diff --git a/tests/regressiontests/utils/test_module/__init__.py b/tests/regressiontests/utils/test_module/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/utils/test_module/__init__.py
diff --git a/tests/regressiontests/utils/test_module/bad_module.py b/tests/regressiontests/utils/test_module/bad_module.py
new file mode 100644
index 0000000000..cc0cd168ce
--- /dev/null
+++ b/tests/regressiontests/utils/test_module/bad_module.py
@@ -0,0 +1,3 @@
+import a_package_name_that_does_not_exist
+
+content = 'Bad Module' \ No newline at end of file
diff --git a/tests/regressiontests/utils/test_module/good_module.py b/tests/regressiontests/utils/test_module/good_module.py
new file mode 100644
index 0000000000..0ca689832a
--- /dev/null
+++ b/tests/regressiontests/utils/test_module/good_module.py
@@ -0,0 +1 @@
+content = 'Good Module' \ No newline at end of file
diff --git a/tests/regressiontests/utils/tests.py b/tests/regressiontests/utils/tests.py
index 4ad4e63e33..8897df6789 100644
--- a/tests/regressiontests/utils/tests.py
+++ b/tests/regressiontests/utils/tests.py
@@ -34,6 +34,7 @@ __test__ = {
from dateformat import *
from feedgenerator import *
+from module_loading import *
from termcolors import *
class TestUtilsHtml(TestCase):