parts/django/tests/regressiontests/utils/module_loading.py
changeset 307 c6bca38c1cbf
equal deleted inserted replaced
306:5ff1fc726848 307:c6bca38c1cbf
       
     1 import os
       
     2 import sys
       
     3 import unittest
       
     4 from zipimport import zipimporter
       
     5 
       
     6 from django.utils.importlib import import_module
       
     7 from django.utils.module_loading import module_has_submodule
       
     8 
       
     9 class DefaultLoader(unittest.TestCase):
       
    10     def test_loader(self):
       
    11         "Normal module existence can be tested"
       
    12         test_module = import_module('regressiontests.utils.test_module')
       
    13 
       
    14         # An importable child
       
    15         self.assertTrue(module_has_submodule(test_module, 'good_module'))
       
    16         mod = import_module('regressiontests.utils.test_module.good_module')
       
    17         self.assertEqual(mod.content, 'Good Module')
       
    18 
       
    19         # A child that exists, but will generate an import error if loaded
       
    20         self.assertTrue(module_has_submodule(test_module, 'bad_module'))
       
    21         self.assertRaises(ImportError, import_module, 'regressiontests.utils.test_module.bad_module')
       
    22 
       
    23         # A child that doesn't exist
       
    24         self.assertFalse(module_has_submodule(test_module, 'no_such_module'))
       
    25         self.assertRaises(ImportError, import_module, 'regressiontests.utils.test_module.no_such_module')
       
    26 
       
    27 class EggLoader(unittest.TestCase):
       
    28     def setUp(self):
       
    29         self.old_path = sys.path[:]
       
    30         self.egg_dir = '%s/eggs' % os.path.dirname(__file__)
       
    31 
       
    32     def tearDown(self):
       
    33         sys.path = self.old_path
       
    34         sys.path_importer_cache.clear()
       
    35 
       
    36         sys.modules.pop('egg_module.sub1.sub2.bad_module', None)
       
    37         sys.modules.pop('egg_module.sub1.sub2.good_module', None)
       
    38         sys.modules.pop('egg_module.sub1.sub2', None)
       
    39         sys.modules.pop('egg_module.sub1', None)
       
    40         sys.modules.pop('egg_module.bad_module', None)
       
    41         sys.modules.pop('egg_module.good_module', None)
       
    42         sys.modules.pop('egg_module', None)
       
    43 
       
    44     def test_shallow_loader(self):
       
    45         "Module existence can be tested inside eggs"
       
    46         egg_name = '%s/test_egg.egg' % self.egg_dir
       
    47         sys.path.append(egg_name)
       
    48         egg_module = import_module('egg_module')
       
    49 
       
    50         # An importable child
       
    51         self.assertTrue(module_has_submodule(egg_module, 'good_module'))
       
    52         mod = import_module('egg_module.good_module')
       
    53         self.assertEqual(mod.content, 'Good Module')
       
    54 
       
    55         # A child that exists, but will generate an import error if loaded
       
    56         self.assertTrue(module_has_submodule(egg_module, 'bad_module'))
       
    57         self.assertRaises(ImportError, import_module, 'egg_module.bad_module')
       
    58 
       
    59         # A child that doesn't exist
       
    60         self.assertFalse(module_has_submodule(egg_module, 'no_such_module'))
       
    61         self.assertRaises(ImportError, import_module, 'egg_module.no_such_module')
       
    62 
       
    63     def test_deep_loader(self):
       
    64         "Modules deep inside an egg can still be tested for existence"
       
    65         egg_name = '%s/test_egg.egg' % self.egg_dir
       
    66         sys.path.append(egg_name)
       
    67         egg_module = import_module('egg_module.sub1.sub2')
       
    68 
       
    69         # An importable child
       
    70         self.assertTrue(module_has_submodule(egg_module, 'good_module'))
       
    71         mod = import_module('egg_module.sub1.sub2.good_module')
       
    72         self.assertEqual(mod.content, 'Deep Good Module')
       
    73 
       
    74         # A child that exists, but will generate an import error if loaded
       
    75         self.assertTrue(module_has_submodule(egg_module, 'bad_module'))
       
    76         self.assertRaises(ImportError, import_module, 'egg_module.sub1.sub2.bad_module')
       
    77 
       
    78         # A child that doesn't exist
       
    79         self.assertFalse(module_has_submodule(egg_module, 'no_such_module'))
       
    80         self.assertRaises(ImportError, import_module, 'egg_module.sub1.sub2.no_such_module')
       
    81 
       
    82 class TestFinder(object):
       
    83     def __init__(self, *args, **kwargs):
       
    84         self.importer = zipimporter(*args, **kwargs)
       
    85 
       
    86     def find_module(self, path):
       
    87         importer = self.importer.find_module(path)
       
    88         if importer is None:
       
    89             return
       
    90         return TestLoader(importer)
       
    91 
       
    92 class TestLoader(object):
       
    93     def __init__(self, importer):
       
    94         self.importer = importer
       
    95 
       
    96     def load_module(self, name):
       
    97         mod = self.importer.load_module(name)
       
    98         mod.__loader__ = self
       
    99         return mod
       
   100 
       
   101 class CustomLoader(EggLoader):
       
   102     """The Custom Loader test is exactly the same as the EggLoader, but
       
   103     it uses a custom defined Loader and Finder that is intentionally
       
   104     split into two classes. Although the EggLoader combines both functions
       
   105     into one class, this isn't required.
       
   106     """
       
   107     def setUp(self):
       
   108         super(CustomLoader, self).setUp()
       
   109         sys.path_hooks.insert(0, TestFinder)
       
   110         sys.path_importer_cache.clear()
       
   111 
       
   112     def tearDown(self):
       
   113         super(CustomLoader, self).tearDown()
       
   114         sys.path_hooks.pop(0)