| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- # -*- coding: utf-8 -*-
- """
- flask.testsuite.reqctx
- ~~~~~~~~~~~~~~~~~~~~~~
- Tests the request context.
- :copyright: (c) 2012 by Armin Ronacher.
- :license: BSD, see LICENSE for more details.
- """
- import flask
- import unittest
- try:
- from greenlet import greenlet
- except ImportError:
- greenlet = None
- from flask.testsuite import FlaskTestCase
- class RequestContextTestCase(FlaskTestCase):
- def test_teardown_on_pop(self):
- buffer = []
- app = flask.Flask(__name__)
- @app.teardown_request
- def end_of_request(exception):
- buffer.append(exception)
- ctx = app.test_request_context()
- ctx.push()
- self.assert_equal(buffer, [])
- ctx.pop()
- self.assert_equal(buffer, [None])
- def test_proper_test_request_context(self):
- app = flask.Flask(__name__)
- app.config.update(
- SERVER_NAME='localhost.localdomain:5000'
- )
- @app.route('/')
- def index():
- return None
- @app.route('/', subdomain='foo')
- def sub():
- return None
- with app.test_request_context('/'):
- self.assert_equal(flask.url_for('index', _external=True), 'http://localhost.localdomain:5000/')
- with app.test_request_context('/'):
- self.assert_equal(flask.url_for('sub', _external=True), 'http://foo.localhost.localdomain:5000/')
- try:
- with app.test_request_context('/', environ_overrides={'HTTP_HOST': 'localhost'}):
- pass
- except Exception as e:
- self.assert_true(isinstance(e, ValueError))
- self.assert_equal(str(e), "the server name provided " +
- "('localhost.localdomain:5000') does not match the " + \
- "server name from the WSGI environment ('localhost')")
- try:
- app.config.update(SERVER_NAME='localhost')
- with app.test_request_context('/', environ_overrides={'SERVER_NAME': 'localhost'}):
- pass
- except ValueError as e:
- raise ValueError(
- "No ValueError exception should have been raised \"%s\"" % e
- )
- try:
- app.config.update(SERVER_NAME='localhost:80')
- with app.test_request_context('/', environ_overrides={'SERVER_NAME': 'localhost:80'}):
- pass
- except ValueError as e:
- raise ValueError(
- "No ValueError exception should have been raised \"%s\"" % e
- )
- def test_context_binding(self):
- app = flask.Flask(__name__)
- @app.route('/')
- def index():
- return 'Hello %s!' % flask.request.args['name']
- @app.route('/meh')
- def meh():
- return flask.request.url
- with app.test_request_context('/?name=World'):
- self.assert_equal(index(), 'Hello World!')
- with app.test_request_context('/meh'):
- self.assert_equal(meh(), 'http://localhost/meh')
- self.assert_true(flask._request_ctx_stack.top is None)
- def test_context_test(self):
- app = flask.Flask(__name__)
- self.assert_false(flask.request)
- self.assert_false(flask.has_request_context())
- ctx = app.test_request_context()
- ctx.push()
- try:
- self.assert_true(flask.request)
- self.assert_true(flask.has_request_context())
- finally:
- ctx.pop()
- def test_manual_context_binding(self):
- app = flask.Flask(__name__)
- @app.route('/')
- def index():
- return 'Hello %s!' % flask.request.args['name']
- ctx = app.test_request_context('/?name=World')
- ctx.push()
- self.assert_equal(index(), 'Hello World!')
- ctx.pop()
- try:
- index()
- except RuntimeError:
- pass
- else:
- self.assert_true(0, 'expected runtime error')
- def test_greenlet_context_copying(self):
- app = flask.Flask(__name__)
- greenlets = []
- @app.route('/')
- def index():
- reqctx = flask._request_ctx_stack.top.copy()
- def g():
- self.assert_false(flask.request)
- self.assert_false(flask.current_app)
- with reqctx:
- self.assert_true(flask.request)
- self.assert_equal(flask.current_app, app)
- self.assert_equal(flask.request.path, '/')
- self.assert_equal(flask.request.args['foo'], 'bar')
- self.assert_false(flask.request)
- return 42
- greenlets.append(greenlet(g))
- return 'Hello World!'
- rv = app.test_client().get('/?foo=bar')
- self.assert_equal(rv.data, b'Hello World!')
- result = greenlets[0].run()
- self.assert_equal(result, 42)
- def test_greenlet_context_copying_api(self):
- app = flask.Flask(__name__)
- greenlets = []
- @app.route('/')
- def index():
- reqctx = flask._request_ctx_stack.top.copy()
- @flask.copy_current_request_context
- def g():
- self.assert_true(flask.request)
- self.assert_equal(flask.current_app, app)
- self.assert_equal(flask.request.path, '/')
- self.assert_equal(flask.request.args['foo'], 'bar')
- return 42
- greenlets.append(greenlet(g))
- return 'Hello World!'
- rv = app.test_client().get('/?foo=bar')
- self.assert_equal(rv.data, b'Hello World!')
- result = greenlets[0].run()
- self.assert_equal(result, 42)
- # Disable test if we don't have greenlets available
- if greenlet is None:
- test_greenlet_context_copying = None
- test_greenlet_context_copying_api = None
- def suite():
- suite = unittest.TestSuite()
- suite.addTest(unittest.makeSuite(RequestContextTestCase))
- return suite
|