# -*- coding: utf-8 -*- """ tests.signals ~~~~~~~~~~~~~~~~~~~~~~~ Signalling. :copyright: (c) 2014 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ import pytest try: import blinker except ImportError: blinker = None import flask pytestmark = pytest.mark.skipif( blinker is None, reason='Signals require the blinker library.' ) def test_template_rendered(): app = flask.Flask(__name__) @app.route('/') def index(): return flask.render_template('simple_template.html', whiskey=42) recorded = [] def record(sender, template, context): recorded.append((template, context)) flask.template_rendered.connect(record, app) try: app.test_client().get('/') assert len(recorded) == 1 template, context = recorded[0] assert template.name == 'simple_template.html' assert context['whiskey'] == 42 finally: flask.template_rendered.disconnect(record, app) def test_request_signals(): app = flask.Flask(__name__) calls = [] def before_request_signal(sender): calls.append('before-signal') def after_request_signal(sender, response): assert response.data == b'stuff' calls.append('after-signal') @app.before_request def before_request_handler(): calls.append('before-handler') @app.after_request def after_request_handler(response): calls.append('after-handler') response.data = 'stuff' return response @app.route('/') def index(): calls.append('handler') return 'ignored anyway' flask.request_started.connect(before_request_signal, app) flask.request_finished.connect(after_request_signal, app) try: rv = app.test_client().get('/') assert rv.data == b'stuff' assert calls == ['before-signal', 'before-handler', 'handler', 'after-handler', 'after-signal'] finally: flask.request_started.disconnect(before_request_signal, app) flask.request_finished.disconnect(after_request_signal, app) def test_request_exception_signal(): app = flask.Flask(__name__) recorded = [] @app.route('/') def index(): 1 // 0 def record(sender, exception): recorded.append(exception) flask.got_request_exception.connect(record, app) try: assert app.test_client().get('/').status_code == 500 assert len(recorded) == 1 assert isinstance(recorded[0], ZeroDivisionError) finally: flask.got_request_exception.disconnect(record, app) def test_appcontext_signals(): app = flask.Flask(__name__) recorded = [] def record_push(sender, **kwargs): recorded.append('push') def record_pop(sender, **kwargs): recorded.append('pop') @app.route('/') def index(): return 'Hello' flask.appcontext_pushed.connect(record_push, app) flask.appcontext_popped.connect(record_pop, app) try: with app.test_client() as c: rv = c.get('/') assert rv.data == b'Hello' assert recorded == ['push'] assert recorded == ['push', 'pop'] finally: flask.appcontext_pushed.disconnect(record_push, app) flask.appcontext_popped.disconnect(record_pop, app) def test_flash_signal(): 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('/') assert len(recorded) == 1 message, category = recorded[0] assert message == 'This is a flash message' assert category == 'notice' finally: flask.message_flashed.disconnect(record, app) def test_appcontext_tearing_down_signal(): app = flask.Flask(__name__) recorded = [] def record_teardown(sender, **kwargs): recorded.append(('tear_down', kwargs)) @app.route('/') def index(): 1 // 0 flask.appcontext_tearing_down.connect(record_teardown, app) try: with app.test_client() as c: rv = c.get('/') assert rv.status_code == 500 assert recorded == [] assert recorded == [('tear_down', {'exc': None})] finally: flask.appcontext_tearing_down.disconnect(record_teardown, app)