mirror of https://github.com/mitsuhiko/flask.git
Armin Ronacher
12 years ago
7 changed files with 272 additions and 114 deletions
@ -0,0 +1,187 @@
|
||||
# -*- coding: utf-8 -*- |
||||
""" |
||||
flask.testsuite.reqctx |
||||
~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
Tests the request context. |
||||
|
||||
:copyright: (c) 2012 by Armin Ronacher. |
||||
:license: BSD, see LICENSE for more details. |
||||
""" |
||||
|
||||
from __future__ import with_statement |
||||
|
||||
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, e: |
||||
self.assert_(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, 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, 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_(flask._request_ctx_stack.top is None) |
||||
|
||||
def test_context_test(self): |
||||
app = flask.Flask(__name__) |
||||
self.assert_(not flask.request) |
||||
self.assert_(not flask.has_request_context()) |
||||
ctx = app.test_request_context() |
||||
ctx.push() |
||||
try: |
||||
self.assert_(flask.request) |
||||
self.assert_(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_(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_(not flask.request) |
||||
self.assert_(not flask.current_app) |
||||
with reqctx: |
||||
self.assert_(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_(not flask.request) |
||||
return 42 |
||||
greenlets.append(greenlet(g)) |
||||
return 'Hello World!' |
||||
|
||||
rv = app.test_client().get('/?foo=bar') |
||||
self.assert_equal(rv.data, '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_(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, '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 |
Loading…
Reference in new issue