foundation_tests.py 7.4 KB

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