Permalink
Browse files

Flash messages signals

If we send a signal when a template is rendered why not when a message
is flashed? One real world use case is in tests, this signal should make
flash messages expectation easier to implement.
  • Loading branch information...
1 parent bfeee75 commit b2aae044ca9c9875c594d57a3bd92bd80d8d56ff @poiati poiati committed Feb 28, 2013
Showing with 32 additions and 1 deletion.
  1. +1 −1 flask/__init__.py
  2. +3 −0 flask/helpers.py
  3. +1 −0 flask/signals.py
  4. +27 −0 flask/testsuite/signals.py
View
@@ -34,7 +34,7 @@
# the signals
from .signals import signals_available, template_rendered, request_started, \
request_finished, got_request_exception, request_tearing_down, \
- appcontext_tearing_down
+ appcontext_tearing_down, message_flashed
# We're not exposing the actual json module but a convenient wrapper around
# it.
View
@@ -35,6 +35,7 @@
from jinja2 import FileSystemLoader
+from .signals import message_flashed
from .globals import session, _request_ctx_stack, _app_ctx_stack, \
current_app, request
@@ -361,6 +362,8 @@ def flash(message, category='message'):
flashes = session.get('_flashes', [])
flashes.append((category, message))
session['_flashes'] = flashes
+ message_flashed.send(current_app._get_current_object(),
+ message=message, category=category)
def get_flashed_messages(with_categories=False, category_filter=[]):
View
@@ -50,3 +50,4 @@ def _fail(self, *args, **kwargs):
request_tearing_down = _signals.signal('request-tearing-down')
got_request_exception = _signals.signal('got-request-exception')
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')
+message_flashed = _signals.signal('message-flashed')
View
@@ -8,6 +8,8 @@
:copyright: (c) 2011 by Armin Ronacher.
:license: BSD, see LICENSE for more details.
"""
+from __future__ import with_statement
+
import flask
import unittest
from flask.testsuite import FlaskTestCase
@@ -95,6 +97,31 @@ def record(sender, exception):
finally:
flask.got_request_exception.disconnect(record, app)
+ def test_flash_signal(self):
+ app = flask.Flask(__name__)
+ app.config['SECRET_KEY'] = 'secret'
+
+ @app.route('/')
+ def index():
+ flask.flash('This is a flash message', category='notice')
+ return flask.redirect('/other')
+
+ recorded = []
+ def record(sender, message, category):
+ recorded.append((message, category))
+
+ flask.message_flashed.connect(record, app)
+ try:
+ client = app.test_client()
+ with client.session_transaction():
+ client.get('/')
+ self.assert_equal(len(recorded), 1)
+ message, category = recorded[0]
+ self.assert_equal(message, 'This is a flash message')
+ self.assert_equal(category, 'notice')
+ finally:
+ flask.message_flashed.disconnect(record, app)
+
def suite():
suite = unittest.TestSuite()

0 comments on commit b2aae04

Please sign in to comment.