signals.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. # -*- coding: utf-8 -*-
  2. """
  3. flask.testsuite.signals
  4. ~~~~~~~~~~~~~~~~~~~~~~~
  5. Signalling.
  6. :copyright: (c) 2011 by Armin Ronacher.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import flask
  10. import unittest
  11. from flask.testsuite import FlaskTestCase
  12. class SignalsTestCase(FlaskTestCase):
  13. def test_template_rendered(self):
  14. app = flask.Flask(__name__)
  15. @app.route('/')
  16. def index():
  17. return flask.render_template('simple_template.html', whiskey=42)
  18. recorded = []
  19. def record(sender, template, context):
  20. recorded.append((template, context))
  21. flask.template_rendered.connect(record, app)
  22. try:
  23. app.test_client().get('/')
  24. self.assert_equal(len(recorded), 1)
  25. template, context = recorded[0]
  26. self.assert_equal(template.name, 'simple_template.html')
  27. self.assert_equal(context['whiskey'], 42)
  28. finally:
  29. flask.template_rendered.disconnect(record, app)
  30. def test_request_signals(self):
  31. app = flask.Flask(__name__)
  32. calls = []
  33. def before_request_signal(sender):
  34. calls.append('before-signal')
  35. def after_request_signal(sender, response):
  36. self.assert_equal(response.data, b'stuff')
  37. calls.append('after-signal')
  38. @app.before_request
  39. def before_request_handler():
  40. calls.append('before-handler')
  41. @app.after_request
  42. def after_request_handler(response):
  43. calls.append('after-handler')
  44. response.data = 'stuff'
  45. return response
  46. @app.route('/')
  47. def index():
  48. calls.append('handler')
  49. return 'ignored anyway'
  50. flask.request_started.connect(before_request_signal, app)
  51. flask.request_finished.connect(after_request_signal, app)
  52. try:
  53. rv = app.test_client().get('/')
  54. self.assert_equal(rv.data, b'stuff')
  55. self.assert_equal(calls, ['before-signal', 'before-handler',
  56. 'handler', 'after-handler',
  57. 'after-signal'])
  58. finally:
  59. flask.request_started.disconnect(before_request_signal, app)
  60. flask.request_finished.disconnect(after_request_signal, app)
  61. def test_request_exception_signal(self):
  62. app = flask.Flask(__name__)
  63. recorded = []
  64. @app.route('/')
  65. def index():
  66. 1 // 0
  67. def record(sender, exception):
  68. recorded.append(exception)
  69. flask.got_request_exception.connect(record, app)
  70. try:
  71. self.assert_equal(app.test_client().get('/').status_code, 500)
  72. self.assert_equal(len(recorded), 1)
  73. self.assert_true(isinstance(recorded[0], ZeroDivisionError))
  74. finally:
  75. flask.got_request_exception.disconnect(record, app)
  76. def test_appcontext_signals(self):
  77. app = flask.Flask(__name__)
  78. recorded = []
  79. def record_push(sender, **kwargs):
  80. recorded.append('push')
  81. def record_pop(sender, **kwargs):
  82. recorded.append('push')
  83. @app.route('/')
  84. def index():
  85. return 'Hello'
  86. flask.appcontext_pushed.connect(record_push, app)
  87. flask.appcontext_popped.connect(record_pop, app)
  88. try:
  89. with app.test_client() as c:
  90. rv = c.get('/')
  91. self.assert_equal(rv.data, b'Hello')
  92. self.assert_equal(recorded, ['push'])
  93. self.assert_equal(recorded, ['push', 'pop'])
  94. finally:
  95. flask.appcontext_pushed.disconnect(record_push, app)
  96. flask.appcontext_popped.disconnect(record_pop, app)
  97. def test_flash_signal(self):
  98. app = flask.Flask(__name__)
  99. app.config['SECRET_KEY'] = 'secret'
  100. @app.route('/')
  101. def index():
  102. flask.flash('This is a flash message', category='notice')
  103. return flask.redirect('/other')
  104. recorded = []
  105. def record(sender, message, category):
  106. recorded.append((message, category))
  107. flask.message_flashed.connect(record, app)
  108. try:
  109. client = app.test_client()
  110. with client.session_transaction():
  111. client.get('/')
  112. self.assert_equal(len(recorded), 1)
  113. message, category = recorded[0]
  114. self.assert_equal(message, 'This is a flash message')
  115. self.assert_equal(category, 'notice')
  116. finally:
  117. flask.message_flashed.disconnect(record, app)
  118. def suite():
  119. suite = unittest.TestSuite()
  120. if flask.signals_available:
  121. suite.addTest(unittest.makeSuite(SignalsTestCase))
  122. return suite