ext.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # -*- coding: utf-8 -*-
  2. """
  3. flask.testsuite.ext
  4. ~~~~~~~~~~~~~~~~~~~
  5. Tests the extension import thing.
  6. :copyright: (c) 2011 by Armin Ronacher.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import sys
  10. import unittest
  11. try:
  12. from imp import reload as reload_module
  13. except ImportError:
  14. reload_module = reload
  15. from flask.testsuite import FlaskTestCase
  16. from flask._compat import PY2
  17. class ExtImportHookTestCase(FlaskTestCase):
  18. def setup(self):
  19. # we clear this out for various reasons. The most important one is
  20. # that a real flaskext could be in there which would disable our
  21. # fake package. Secondly we want to make sure that the flaskext
  22. # import hook does not break on reloading.
  23. for entry, value in list(sys.modules.items()):
  24. if (entry.startswith('flask.ext.') or
  25. entry.startswith('flask_') or
  26. entry.startswith('flaskext.') or
  27. entry == 'flaskext') and value is not None:
  28. sys.modules.pop(entry, None)
  29. from flask import ext
  30. reload_module(ext)
  31. # reloading must not add more hooks
  32. import_hooks = 0
  33. for item in sys.meta_path:
  34. cls = type(item)
  35. if cls.__module__ == 'flask.exthook' and \
  36. cls.__name__ == 'ExtensionImporter':
  37. import_hooks += 1
  38. self.assert_equal(import_hooks, 1)
  39. def teardown(self):
  40. from flask import ext
  41. for key in ext.__dict__:
  42. self.assert_not_in('.', key)
  43. def test_flaskext_new_simple_import_normal(self):
  44. from flask.ext.newext_simple import ext_id
  45. self.assert_equal(ext_id, 'newext_simple')
  46. def test_flaskext_new_simple_import_module(self):
  47. from flask.ext import newext_simple
  48. self.assert_equal(newext_simple.ext_id, 'newext_simple')
  49. self.assert_equal(newext_simple.__name__, 'flask_newext_simple')
  50. def test_flaskext_new_package_import_normal(self):
  51. from flask.ext.newext_package import ext_id
  52. self.assert_equal(ext_id, 'newext_package')
  53. def test_flaskext_new_package_import_module(self):
  54. from flask.ext import newext_package
  55. self.assert_equal(newext_package.ext_id, 'newext_package')
  56. self.assert_equal(newext_package.__name__, 'flask_newext_package')
  57. def test_flaskext_new_package_import_submodule_function(self):
  58. from flask.ext.newext_package.submodule import test_function
  59. self.assert_equal(test_function(), 42)
  60. def test_flaskext_new_package_import_submodule(self):
  61. from flask.ext.newext_package import submodule
  62. self.assert_equal(submodule.__name__, 'flask_newext_package.submodule')
  63. self.assert_equal(submodule.test_function(), 42)
  64. def test_flaskext_old_simple_import_normal(self):
  65. from flask.ext.oldext_simple import ext_id
  66. self.assert_equal(ext_id, 'oldext_simple')
  67. def test_flaskext_old_simple_import_module(self):
  68. from flask.ext import oldext_simple
  69. self.assert_equal(oldext_simple.ext_id, 'oldext_simple')
  70. self.assert_equal(oldext_simple.__name__, 'flaskext.oldext_simple')
  71. def test_flaskext_old_package_import_normal(self):
  72. from flask.ext.oldext_package import ext_id
  73. self.assert_equal(ext_id, 'oldext_package')
  74. def test_flaskext_old_package_import_module(self):
  75. from flask.ext import oldext_package
  76. self.assert_equal(oldext_package.ext_id, 'oldext_package')
  77. self.assert_equal(oldext_package.__name__, 'flaskext.oldext_package')
  78. def test_flaskext_old_package_import_submodule(self):
  79. from flask.ext.oldext_package import submodule
  80. self.assert_equal(submodule.__name__, 'flaskext.oldext_package.submodule')
  81. self.assert_equal(submodule.test_function(), 42)
  82. def test_flaskext_old_package_import_submodule_function(self):
  83. from flask.ext.oldext_package.submodule import test_function
  84. self.assert_equal(test_function(), 42)
  85. def test_flaskext_broken_package_no_module_caching(self):
  86. for x in range(2):
  87. with self.assert_raises(ImportError):
  88. import flask.ext.broken
  89. def test_no_error_swallowing(self):
  90. try:
  91. import flask.ext.broken
  92. except ImportError:
  93. exc_type, exc_value, tb = sys.exc_info()
  94. self.assert_true(exc_type is ImportError)
  95. if PY2:
  96. message = 'No module named missing_module'
  97. else:
  98. message = 'No module named \'missing_module\''
  99. self.assert_equal(str(exc_value), message)
  100. self.assert_true(tb.tb_frame.f_globals is globals())
  101. # reraise() adds a second frame so we need to skip that one too.
  102. # On PY3 we even have another one :(
  103. next = tb.tb_next.tb_next
  104. if not PY2:
  105. next = next.tb_next
  106. self.assert_in('flask_broken/__init__.py', next.tb_frame.f_code.co_filename)
  107. def suite():
  108. suite = unittest.TestSuite()
  109. suite.addTest(unittest.makeSuite(ExtImportHookTestCase))
  110. return suite