hook_tests.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. """Tests for cement.core.hook."""
  2. import signal
  3. from cement.core import exc, backend, hook, foundation
  4. from cement.utils import test
  5. def cement_hook_one(*args, **kw):
  6. return 'kapla 1'
  7. def cement_hook_two(*args, **kw):
  8. return 'kapla 2'
  9. def cement_hook_three(*args, **kw):
  10. return 'kapla 3'
  11. def nosetests_hook(*args, **kw):
  12. return 'kapla 4'
  13. def cement_hook_five(app, data):
  14. return data
  15. class HookTestCase(test.CementTestCase):
  16. def setUp(self):
  17. self.app = self.make_app()
  18. hook.define('nosetests_hook')
  19. def test_define(self):
  20. self.ok('nosetests_hook' in backend.hooks)
  21. @test.raises(exc.FrameworkError)
  22. def test_define_again(self):
  23. try:
  24. hook.define('nosetests_hook')
  25. except exc.FrameworkError as e:
  26. self.eq(e.msg, "Hook name 'nosetests_hook' already defined!")
  27. raise
  28. def test_hooks_registered(self):
  29. hook.register('nosetests_hook', cement_hook_one, weight=99)
  30. hook.register('nosetests_hook', cement_hook_two, weight=-1)
  31. hook.register('some_bogus_hook', cement_hook_three, weight=-99)
  32. self.eq(len(backend.hooks['nosetests_hook']), 2)
  33. def test_run(self):
  34. hook.register('nosetests_hook', cement_hook_one, weight=99)
  35. hook.register('nosetests_hook', cement_hook_two, weight=-1)
  36. hook.register('nosetests_hook', cement_hook_three, weight=-99)
  37. results = []
  38. for res in hook.run('nosetests_hook'):
  39. results.append(res)
  40. self.eq(results[0], 'kapla 3')
  41. self.eq(results[1], 'kapla 2')
  42. self.eq(results[2], 'kapla 1')
  43. @test.raises(exc.FrameworkError)
  44. def test_run_bad_hook(self):
  45. for res in hook.run('some_bogus_hook'):
  46. pass
  47. def test_hook_is_defined(self):
  48. self.ok(hook.defined('nosetests_hook'))
  49. self.eq(hook.defined('some_bogus_hook'), False)
  50. def test_framework_hooks(self):
  51. app = self.make_app('cement-testapp', argv=['--quiet'])
  52. hook.register('pre_setup', cement_hook_one)
  53. hook.register('post_setup', cement_hook_one)
  54. hook.register('pre_run', cement_hook_one)
  55. hook.register('post_run', cement_hook_one)
  56. hook.register('pre_close', cement_hook_one)
  57. hook.register('post_close', cement_hook_one)
  58. hook.register('signal', cement_hook_one)
  59. hook.register('pre_render', cement_hook_one)
  60. hook.register('pre_render', cement_hook_five)
  61. hook.register('post_render', cement_hook_one)
  62. hook.register('post_render', cement_hook_five)
  63. app.setup()
  64. app.run()
  65. app.render(dict(foo='bar'))
  66. app.close()
  67. # this is where cement_signal_hook is run
  68. try:
  69. foundation.cement_signal_handler(signal.SIGTERM, 5)
  70. except exc.CaughtSignal as e:
  71. pass