foundation_tests.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. """Tests for cement.core.setup."""
  2. import os
  3. import sys
  4. from cement.core import foundation, exc, backend, config, extension, plugin
  5. from cement.core import log, output, handler, hook, arg, controller
  6. from cement.utils import test
  7. def my_extended_func():
  8. return 'KAPLA'
  9. class DeprecatedApp(foundation.CementApp):
  10. class Meta:
  11. label = 'deprecated'
  12. defaults = None
  13. class TestOutputHandler(output.CementOutputHandler):
  14. file_suffix = None
  15. class Meta:
  16. interface = output.IOutput
  17. label = 'test_output_handler'
  18. def _setup(self, config_obj):
  19. self.config = config_obj
  20. def render(self, data_dict, template=None):
  21. return None
  22. class BogusBaseController(controller.CementBaseController):
  23. class Meta:
  24. label = 'bad_base_controller_label'
  25. def my_hook_one(app):
  26. return 1
  27. def my_hook_two(app):
  28. return 2
  29. def my_hook_three(app):
  30. return 3
  31. class FoundationTestCase(test.CementTestCase):
  32. def setUp(self):
  33. self.app = self.make_app('my_app')
  34. def test_argv_is_none(self):
  35. app = self.make_app('cement-testapp', argv=None)
  36. app.setup()
  37. self.eq(app.argv, list(sys.argv[1:]))
  38. def test_bootstrap(self):
  39. app = self.make_app('my_app', bootstrap='tests.bootstrap')
  40. app.setup()
  41. self.eq(app._loaded_bootstrap.__name__, 'tests.bootstrap')
  42. def test_reload_bootstrap(self):
  43. app = self.make_app('my_app', bootstrap='cement.utils.test')
  44. app._loaded_bootstrap = test
  45. app.setup()
  46. self.eq(app._loaded_bootstrap.__name__, 'cement.utils.test')
  47. def test_argv(self):
  48. app = self.make_app('my_app', argv=['bogus', 'args'])
  49. self.eq(app.argv, ['bogus', 'args'])
  50. @test.raises(exc.FrameworkError)
  51. def test_resolve_handler_bad_handler(self):
  52. class Bogus(object):
  53. pass
  54. try:
  55. self.app._resolve_handler('output', Bogus)
  56. except exc.FrameworkError as e:
  57. self.ok(e.msg.find('resolve'))
  58. raise
  59. def test_default(self):
  60. self.app.setup()
  61. self.app.run()
  62. def test_passed_handlers(self):
  63. from cement.ext import ext_configparser
  64. from cement.ext import ext_logging
  65. from cement.ext import ext_argparse
  66. from cement.ext import ext_plugin
  67. from cement.ext import ext_nulloutput
  68. # forces CementApp._resolve_handler to register the handler
  69. from cement.ext import ext_json
  70. app = self.make_app('my-app-test',
  71. config_handler=ext_configparser.ConfigParserConfigHandler,
  72. log_handler=ext_logging.LoggingLogHandler(),
  73. arg_handler=ext_argparse.ArgParseArgumentHandler(),
  74. extension_handler=extension.CementExtensionHandler(),
  75. plugin_handler=ext_plugin.CementPluginHandler(),
  76. output_handler=ext_json.JsonOutputHandler(),
  77. argv=[__file__, '--debug']
  78. )
  79. app.setup()
  80. def test_null_out(self):
  81. null = foundation.NullOut()
  82. null.write('nonsense')
  83. def test_render(self):
  84. # Render with default
  85. self.app.setup()
  86. self.app.render(dict(foo='bar'))
  87. # Render with no output_handler... this is hackish, but there are
  88. # circumstances where app.output would be None.
  89. app = self.make_app('test', output_handler=None)
  90. app.setup()
  91. app.output = None
  92. app.render(dict(foo='bar'))
  93. @test.raises(exc.FrameworkError)
  94. def test_bad_label(self):
  95. try:
  96. app = foundation.CementApp(None)
  97. except exc.FrameworkError as e:
  98. # FIX ME: verify error msg
  99. raise
  100. @test.raises(exc.FrameworkError)
  101. def test_bad_label_chars(self):
  102. try:
  103. app = foundation.CementApp('some!bogus()label')
  104. except exc.FrameworkError as e:
  105. self.ok(e.msg.find('alpha-numeric'))
  106. raise
  107. def test_add_arg_shortcut(self):
  108. self.app.setup()
  109. self.app.add_arg('--foo', action='store')
  110. def test_reset_output_handler(self):
  111. app = self.make_app('test', argv=[], output_handler=TestOutputHandler)
  112. app.setup()
  113. app.run()
  114. app.output = None
  115. app._meta.output_handler = None
  116. app._setup_output_handler()
  117. @test.raises(NotImplementedError)
  118. def test_controller_handler(self):
  119. app = self.make_app('test',
  120. base_controller=controller.CementBaseController,
  121. argv=['default'],
  122. )
  123. handler.register(controller.CementBaseController)
  124. app.setup()
  125. try:
  126. app.run()
  127. except NotImplementedError as e:
  128. raise
  129. def test_lay_cement(self):
  130. app = self.make_app('test', argv=['--quiet'])
  131. app = self.make_app('test', argv=['--json', '--yaml'])
  132. def test_none_member(self):
  133. class Test(object):
  134. var = None
  135. self.app.setup()
  136. self.app.args.parsed_args = Test()
  137. try:
  138. self.app._parse_args()
  139. except SystemExit:
  140. pass
  141. @test.raises(exc.CaughtSignal)
  142. def test_cement_signal_handler(self):
  143. import signal
  144. try:
  145. foundation.cement_signal_handler(signal.SIGTERM, 5)
  146. except exc.CaughtSignal as e:
  147. self.eq(e.signum, signal.SIGTERM)
  148. self.eq(e.frame, 5)
  149. raise
  150. def test_cement_without_signals(self):
  151. app = self.make_app('test', catch_signals=None)
  152. app.setup()
  153. def test_extend(self):
  154. self.app.extend('kapla', my_extended_func)
  155. self.eq(self.app.kapla(), 'KAPLA')
  156. @test.raises(exc.FrameworkError)
  157. def test_extended_duplicate(self):
  158. self.app.extend('config', my_extended_func)
  159. def test_no_handler(self):
  160. app = self.make_app('cement-testapp')
  161. app._resolve_handler('cache', None, raise_error=False)
  162. def test_config_files_is_none(self):
  163. app = self.make_app('cement-testapp', config_files=None)
  164. app.setup()
  165. label = 'cement-testapp'
  166. user_home = os.path.abspath(os.path.expanduser(os.environ['HOME']))
  167. files = [
  168. os.path.join('/', 'etc', label, '%s.conf' % label),
  169. os.path.join(user_home, '.%s.conf' % label),
  170. os.path.join(user_home, '.%s' % label, 'config'),
  171. ]
  172. for f in files:
  173. res = f in app._meta.config_files
  174. self.ok(res)
  175. @test.raises(exc.FrameworkError)
  176. def test_base_controller_label(self):
  177. app = self.make_app('cement-testapp', base_controller=BogusBaseController)
  178. app.setup()