| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2014-09-01 03:54:45 +08:00
										 |  |  |     tests.reqctx | 
					
						
							| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  |     ~~~~~~~~~~~~~~~~~~~~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Tests the request context. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-03 02:21:07 +08:00
										 |  |  |     :copyright: (c) 2014 by Armin Ronacher. | 
					
						
							| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  |     :license: BSD, see LICENSE for more details. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 11:26:52 +08:00
										 |  |  | import pytest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  | import flask | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from greenlet import greenlet | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     greenlet = None | 
					
						
							| 
									
										
										
										
											2014-09-04 03:02:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  | def test_teardown_on_pop(): | 
					
						
							|  |  |  |     buffer = [] | 
					
						
							|  |  |  |     app = flask.Flask(__name__) | 
					
						
							|  |  |  |     @app.teardown_request | 
					
						
							|  |  |  |     def end_of_request(exception): | 
					
						
							|  |  |  |         buffer.append(exception) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ctx = app.test_request_context() | 
					
						
							|  |  |  |     ctx.push() | 
					
						
							|  |  |  |     assert buffer == [] | 
					
						
							|  |  |  |     ctx.pop() | 
					
						
							|  |  |  |     assert buffer == [None] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_teardown_with_previous_exception(): | 
					
						
							|  |  |  |     buffer = [] | 
					
						
							|  |  |  |     app = flask.Flask(__name__) | 
					
						
							|  |  |  |     @app.teardown_request | 
					
						
							|  |  |  |     def end_of_request(exception): | 
					
						
							|  |  |  |         buffer.append(exception) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         raise Exception('dummy') | 
					
						
							|  |  |  |     except Exception: | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with app.test_request_context(): | 
					
						
							|  |  |  |         assert buffer == [] | 
					
						
							|  |  |  |     assert buffer == [None] | 
					
						
							| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  | def test_proper_test_request_context(): | 
					
						
							|  |  |  |     app = flask.Flask(__name__) | 
					
						
							|  |  |  |     app.config.update( | 
					
						
							|  |  |  |         SERVER_NAME='localhost.localdomain:5000' | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         return None | 
					
						
							| 
									
										
										
										
											2013-10-17 02:12:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  |     @app.route('/', subdomain='foo') | 
					
						
							|  |  |  |     def sub(): | 
					
						
							|  |  |  |         return None | 
					
						
							| 
									
										
										
										
											2013-10-17 02:12:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  |     with app.test_request_context('/'): | 
					
						
							|  |  |  |         assert flask.url_for('index', _external=True) == \ | 
					
						
							|  |  |  |             'http://localhost.localdomain:5000/' | 
					
						
							| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  |     with app.test_request_context('/'): | 
					
						
							|  |  |  |         assert flask.url_for('sub', _external=True) == \ | 
					
						
							|  |  |  |             'http://foo.localhost.localdomain:5000/' | 
					
						
							| 
									
										
										
										
											2014-09-02 11:26:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  |     try: | 
					
						
							|  |  |  |         with app.test_request_context('/', environ_overrides={'HTTP_HOST': 'localhost'}): | 
					
						
							| 
									
										
										
										
											2014-09-02 11:26:52 +08:00
										 |  |  |             pass | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  |     except ValueError as e: | 
					
						
							|  |  |  |         assert str(e) == ( | 
					
						
							|  |  |  |             "the server name provided " | 
					
						
							|  |  |  |             "('localhost.localdomain:5000') does not match the " | 
					
						
							|  |  |  |             "server name from the WSGI environment ('localhost')" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  |     app.config.update(SERVER_NAME='localhost') | 
					
						
							|  |  |  |     with app.test_request_context('/', environ_overrides={'SERVER_NAME': 'localhost'}): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     app.config.update(SERVER_NAME='localhost:80') | 
					
						
							|  |  |  |     with app.test_request_context('/', environ_overrides={'SERVER_NAME': 'localhost:80'}): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_context_binding(): | 
					
						
							|  |  |  |     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'): | 
					
						
							| 
									
										
										
										
											2014-09-02 11:26:52 +08:00
										 |  |  |         assert index() == 'Hello World!' | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  |     with app.test_request_context('/meh'): | 
					
						
							|  |  |  |         assert meh() == 'http://localhost/meh' | 
					
						
							|  |  |  |     assert flask._request_ctx_stack.top is None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_context_test(): | 
					
						
							|  |  |  |     app = flask.Flask(__name__) | 
					
						
							|  |  |  |     assert not flask.request | 
					
						
							|  |  |  |     assert not flask.has_request_context() | 
					
						
							|  |  |  |     ctx = app.test_request_context() | 
					
						
							|  |  |  |     ctx.push() | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         assert flask.request | 
					
						
							|  |  |  |         assert flask.has_request_context() | 
					
						
							|  |  |  |     finally: | 
					
						
							| 
									
										
										
										
											2013-05-14 18:00:04 +08:00
										 |  |  |         ctx.pop() | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_manual_context_binding(): | 
					
						
							|  |  |  |     app = flask.Flask(__name__) | 
					
						
							|  |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         return 'Hello %s!' % flask.request.args['name'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ctx = app.test_request_context('/?name=World') | 
					
						
							|  |  |  |     ctx.push() | 
					
						
							|  |  |  |     assert index() == 'Hello World!' | 
					
						
							|  |  |  |     ctx.pop() | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         index() | 
					
						
							|  |  |  |     except RuntimeError: | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         assert 0, 'expected runtime error' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.skipif(greenlet is None, reason='greenlet not installed') | 
					
						
							|  |  |  | def test_greenlet_context_copying(): | 
					
						
							|  |  |  |     app = flask.Flask(__name__) | 
					
						
							|  |  |  |     greenlets = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         reqctx = flask._request_ctx_stack.top.copy() | 
					
						
							|  |  |  |         def g(): | 
					
						
							|  |  |  |             assert not flask.request | 
					
						
							|  |  |  |             assert not flask.current_app | 
					
						
							|  |  |  |             with reqctx: | 
					
						
							| 
									
										
										
										
											2014-09-02 11:26:52 +08:00
										 |  |  |                 assert flask.request | 
					
						
							|  |  |  |                 assert flask.current_app == app | 
					
						
							|  |  |  |                 assert flask.request.path == '/' | 
					
						
							|  |  |  |                 assert flask.request.args['foo'] == 'bar' | 
					
						
							| 
									
										
										
										
											2014-09-04 02:56:10 +08:00
										 |  |  |             assert not flask.request | 
					
						
							|  |  |  |             return 42 | 
					
						
							|  |  |  |         greenlets.append(greenlet(g)) | 
					
						
							|  |  |  |         return 'Hello World!' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rv = app.test_client().get('/?foo=bar') | 
					
						
							|  |  |  |     assert rv.data == b'Hello World!' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = greenlets[0].run() | 
					
						
							|  |  |  |     assert result == 42 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.skipif(greenlet is None, reason='greenlet not installed') | 
					
						
							|  |  |  | def test_greenlet_context_copying_api(): | 
					
						
							|  |  |  |     app = flask.Flask(__name__) | 
					
						
							|  |  |  |     greenlets = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         reqctx = flask._request_ctx_stack.top.copy() | 
					
						
							|  |  |  |         @flask.copy_current_request_context | 
					
						
							|  |  |  |         def g(): | 
					
						
							|  |  |  |             assert flask.request | 
					
						
							|  |  |  |             assert flask.current_app == app | 
					
						
							|  |  |  |             assert flask.request.path == '/' | 
					
						
							|  |  |  |             assert flask.request.args['foo'] == 'bar' | 
					
						
							|  |  |  |             return 42 | 
					
						
							|  |  |  |         greenlets.append(greenlet(g)) | 
					
						
							|  |  |  |         return 'Hello World!' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rv = app.test_client().get('/?foo=bar') | 
					
						
							|  |  |  |     assert rv.data == b'Hello World!' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = greenlets[0].run() | 
					
						
							|  |  |  |     assert result == 42 |