| 
									
										
										
										
											2011-08-26 18:21:26 +08:00
										 |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2014-09-01 03:54:45 +08:00
										 |  |  |     tests.testing | 
					
						
							| 
									
										
										
										
											2014-09-21 22:47:38 +08:00
										 |  |  |     ~~~~~~~~~~~~~ | 
					
						
							| 
									
										
										
										
											2011-08-26 18:21:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Test client and more. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 04:09:09 +08:00
										 |  |  |     :copyright: 2010 Pallets | 
					
						
							|  |  |  |     :license: BSD-3-Clause | 
					
						
							| 
									
										
										
										
											2011-08-26 18:21:26 +08:00
										 |  |  | """
 | 
					
						
							| 
									
										
										
										
											2018-02-20 07:34:46 +08:00
										 |  |  | import click | 
					
						
							| 
									
										
										
										
											2014-09-01 03:56:15 +08:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2011-09-02 00:35:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-26 18:21:26 +08:00
										 |  |  | import flask | 
					
						
							| 
									
										
										
										
											2016-10-12 14:54:25 +08:00
										 |  |  | import werkzeug | 
					
						
							| 
									
										
										
										
											2014-09-04 03:02:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-17 23:39:16 +08:00
										 |  |  | from flask import appcontext_popped | 
					
						
							| 
									
										
										
										
											2013-05-23 03:40:30 +08:00
										 |  |  | from flask._compat import text_type | 
					
						
							| 
									
										
										
										
											2018-02-20 07:34:46 +08:00
										 |  |  | from flask.cli import ScriptInfo | 
					
						
							| 
									
										
										
										
											2015-04-02 06:08:06 +08:00
										 |  |  | from flask.json import jsonify | 
					
						
							| 
									
										
										
										
											2018-02-20 07:34:46 +08:00
										 |  |  | from flask.testing import make_test_environ_builder, FlaskCliRunner | 
					
						
							| 
									
										
										
										
											2011-08-26 18:21:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-17 23:39:16 +08:00
										 |  |  | try: | 
					
						
							|  |  |  |     import blinker | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     blinker = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-26 18:21:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | def test_environ_defaults_from_config(app, client): | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     app.config['SERVER_NAME'] = 'example.com:1234' | 
					
						
							|  |  |  |     app.config['APPLICATION_ROOT'] = '/foo' | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         return flask.request.url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ctx = app.test_request_context() | 
					
						
							|  |  |  |     assert ctx.request.url == 'http://example.com:1234/foo/' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  |     rv = client.get('/') | 
					
						
							|  |  |  |     assert rv.data == b'http://example.com:1234/foo/' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_environ_defaults(app, client, app_ctx, req_ctx): | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         return flask.request.url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ctx = app.test_request_context() | 
					
						
							|  |  |  |     assert ctx.request.url == 'http://localhost/' | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |     with client: | 
					
						
							|  |  |  |         rv = client.get('/') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert rv.data == b'http://localhost/' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_environ_base_default(app, client, app_ctx): | 
					
						
							| 
									
										
										
										
											2016-10-12 14:54:25 +08:00
										 |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         flask.g.user_agent = flask.request.headers["User-Agent"] | 
					
						
							|  |  |  |         return flask.request.remote_addr | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  |     rv = client.get('/') | 
					
						
							|  |  |  |     assert rv.data == b'127.0.0.1' | 
					
						
							|  |  |  |     assert flask.g.user_agent == 'werkzeug/' + werkzeug.__version__ | 
					
						
							| 
									
										
										
										
											2016-10-12 14:54:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_environ_base_modified(app, client, app_ctx): | 
					
						
							| 
									
										
										
										
											2016-10-12 14:54:25 +08:00
										 |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         flask.g.user_agent = flask.request.headers["User-Agent"] | 
					
						
							|  |  |  |         return flask.request.remote_addr | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  |     client.environ_base['REMOTE_ADDR'] = '0.0.0.0' | 
					
						
							|  |  |  |     client.environ_base['HTTP_USER_AGENT'] = 'Foo' | 
					
						
							|  |  |  |     rv = client.get('/') | 
					
						
							|  |  |  |     assert rv.data == b'0.0.0.0' | 
					
						
							|  |  |  |     assert flask.g.user_agent == 'Foo' | 
					
						
							| 
									
										
										
										
											2016-10-12 14:54:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  |     client.environ_base['REMOTE_ADDR'] = '0.0.0.1' | 
					
						
							|  |  |  |     client.environ_base['HTTP_USER_AGENT'] = 'Bar' | 
					
						
							|  |  |  |     rv = client.get('/') | 
					
						
							|  |  |  |     assert rv.data == b'0.0.0.1' | 
					
						
							|  |  |  |     assert flask.g.user_agent == 'Bar' | 
					
						
							| 
									
										
										
										
											2016-10-12 14:54:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-13 23:42:53 +08:00
										 |  |  | def test_client_open_environ(app, client, request): | 
					
						
							|  |  |  |     @app.route('/index') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         return flask.request.remote_addr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     builder = make_test_environ_builder(app, path='/index', method='GET') | 
					
						
							|  |  |  |     request.addfinalizer(builder.close) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rv = client.open(builder) | 
					
						
							|  |  |  |     assert rv.data == b'127.0.0.1' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     environ = builder.get_environ() | 
					
						
							|  |  |  |     client.environ_base['REMOTE_ADDR'] = '127.0.0.2' | 
					
						
							|  |  |  |     rv = client.open(environ) | 
					
						
							|  |  |  |     assert rv.data == b'127.0.0.2' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 22:25:15 +08:00
										 |  |  | def test_specify_url_scheme(app, client): | 
					
						
							|  |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         return flask.request.url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ctx = app.test_request_context(url_scheme='https') | 
					
						
							|  |  |  |     assert ctx.request.url == 'https://localhost/' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rv = client.get('/', url_scheme='https') | 
					
						
							|  |  |  |     assert rv.data == b'https://localhost/' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-30 04:03:08 +08:00
										 |  |  | def test_path_is_url(app): | 
					
						
							|  |  |  |     eb = make_test_environ_builder(app, 'https://example.com/') | 
					
						
							|  |  |  |     assert eb.url_scheme == 'https' | 
					
						
							|  |  |  |     assert eb.host == 'example.com' | 
					
						
							|  |  |  |     assert eb.script_root == '' | 
					
						
							|  |  |  |     assert eb.path == '/' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-20 04:20:03 +08:00
										 |  |  | def test_blueprint_with_subdomain(): | 
					
						
							|  |  |  |     app = flask.Flask(__name__, subdomain_matching=True) | 
					
						
							| 
									
										
										
										
											2017-05-28 22:25:15 +08:00
										 |  |  |     app.config['SERVER_NAME'] = 'example.com:1234' | 
					
						
							|  |  |  |     app.config['APPLICATION_ROOT'] = '/foo' | 
					
						
							| 
									
										
										
										
											2018-02-20 04:20:03 +08:00
										 |  |  |     client = app.test_client() | 
					
						
							| 
									
										
										
										
											2017-05-28 22:25:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bp = flask.Blueprint('company', __name__, subdomain='xxx') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @bp.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         return flask.request.url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     app.register_blueprint(bp) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ctx = app.test_request_context('/', subdomain='xxx') | 
					
						
							|  |  |  |     assert ctx.request.url == 'http://xxx.example.com:1234/foo/' | 
					
						
							|  |  |  |     assert ctx.request.blueprint == bp.name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rv = client.get('/', subdomain='xxx') | 
					
						
							|  |  |  |     assert rv.data == b'http://xxx.example.com:1234/foo/' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | def test_redirect_keep_session(app, client, app_ctx): | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     @app.route('/', methods=['GET', 'POST']) | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         if flask.request.method == 'POST': | 
					
						
							|  |  |  |             return flask.redirect('/getsession') | 
					
						
							|  |  |  |         flask.session['data'] = 'foo' | 
					
						
							|  |  |  |         return 'index' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @app.route('/getsession') | 
					
						
							|  |  |  |     def get_session(): | 
					
						
							|  |  |  |         return flask.session.get('data', '<missing>') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |     with client: | 
					
						
							|  |  |  |         rv = client.get('/getsession') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert rv.data == b'<missing>' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         rv = client.get('/') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert rv.data == b'index' | 
					
						
							|  |  |  |         assert flask.session.get('data') == 'foo' | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         rv = client.post('/', data={}, follow_redirects=True) | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert rv.data == b'foo' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # This support requires a new Werkzeug version | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         if not hasattr(client, 'redirect_client'): | 
					
						
							| 
									
										
										
										
											2011-11-08 16:31:45 +08:00
										 |  |  |             assert flask.session.get('data') == 'foo' | 
					
						
							| 
									
										
										
										
											2011-11-26 04:08:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         rv = client.get('/getsession') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert rv.data == b'foo' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  | def test_session_transactions(app, client): | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         return text_type(flask.session['foo']) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |     with client: | 
					
						
							|  |  |  |         with client.session_transaction() as sess: | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |             assert len(sess) == 0 | 
					
						
							|  |  |  |             sess['foo'] = [42] | 
					
						
							|  |  |  |             assert len(sess) == 1 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         rv = client.get('/') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert rv.data == b'[42]' | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         with client.session_transaction() as sess: | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |             assert len(sess) == 1 | 
					
						
							|  |  |  |             assert sess['foo'] == [42] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  | def test_session_transactions_no_null_sessions(): | 
					
						
							|  |  |  |     app = flask.Flask(__name__) | 
					
						
							|  |  |  |     app.testing = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with app.test_client() as c: | 
					
						
							| 
									
										
										
										
											2016-03-04 19:30:40 +08:00
										 |  |  |         with pytest.raises(RuntimeError) as e: | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |             with c.session_transaction() as sess: | 
					
						
							| 
									
										
										
										
											2011-08-26 20:47:01 +08:00
										 |  |  |                 pass | 
					
						
							| 
									
										
										
										
											2016-03-04 19:30:40 +08:00
										 |  |  |         assert 'Session backend did not open a session' in str(e.value) | 
					
						
							| 
									
										
										
										
											2011-08-26 20:47:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_session_transactions_keep_context(app, client, req_ctx): | 
					
						
							|  |  |  |     rv = client.get('/') | 
					
						
							|  |  |  |     req = flask.request._get_current_object() | 
					
						
							|  |  |  |     assert req is not None | 
					
						
							|  |  |  |     with client.session_transaction(): | 
					
						
							|  |  |  |         assert req is flask.request._get_current_object() | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | def test_session_transaction_needs_cookies(app): | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     c = app.test_client(use_cookies=False) | 
					
						
							| 
									
										
										
										
											2016-03-04 19:30:40 +08:00
										 |  |  |     with pytest.raises(RuntimeError) as e: | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         with c.session_transaction() as s: | 
					
						
							| 
									
										
										
										
											2011-08-26 18:21:26 +08:00
										 |  |  |             pass | 
					
						
							| 
									
										
										
										
											2016-03-04 19:30:40 +08:00
										 |  |  |     assert 'cookies' in str(e.value) | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  | def test_test_client_context_binding(app, client): | 
					
						
							|  |  |  |     app.testing = False | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     @app.route('/') | 
					
						
							|  |  |  |     def index(): | 
					
						
							|  |  |  |         flask.g.value = 42 | 
					
						
							|  |  |  |         return 'Hello World!' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @app.route('/other') | 
					
						
							|  |  |  |     def other(): | 
					
						
							|  |  |  |         1 // 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |     with client: | 
					
						
							|  |  |  |         resp = client.get('/') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert flask.g.value == 42 | 
					
						
							|  |  |  |         assert resp.data == b'Hello World!' | 
					
						
							|  |  |  |         assert resp.status_code == 200 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         resp = client.get('/other') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert not hasattr(flask.g, 'value') | 
					
						
							|  |  |  |         assert b'Internal Server Error' in resp.data | 
					
						
							|  |  |  |         assert resp.status_code == 500 | 
					
						
							|  |  |  |         flask.g.value = 23 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         flask.g.value | 
					
						
							|  |  |  |     except (AttributeError, RuntimeError): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         raise AssertionError('some kind of exception expected') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  | def test_reuse_client(client): | 
					
						
							|  |  |  |     c = client | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     with c: | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         assert client.get('/').status_code == 404 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     with c: | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         assert client.get('/').status_code == 404 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  | def test_test_client_calls_teardown_handlers(app, client): | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     called = [] | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     @app.teardown_request | 
					
						
							|  |  |  |     def remember(error): | 
					
						
							|  |  |  |         called.append(error) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |     with client: | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert called == [] | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         client.get('/') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert called == [] | 
					
						
							|  |  |  |     assert called == [None] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     del called[:] | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |     with client: | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert called == [] | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         client.get('/') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert called == [] | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |         client.get('/') | 
					
						
							| 
									
										
										
										
											2014-09-02 11:26:52 +08:00
										 |  |  |         assert called == [None] | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     assert called == [None, None] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  | def test_full_url_request(app, client): | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     @app.route('/action', methods=['POST']) | 
					
						
							|  |  |  |     def action(): | 
					
						
							|  |  |  |         return 'x' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |     with client: | 
					
						
							|  |  |  |         rv = client.post('http://domain.com/action?vodka=42', data={'gin': 43}) | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |         assert rv.status_code == 200 | 
					
						
							|  |  |  |         assert 'gin' in flask.request.form | 
					
						
							|  |  |  |         assert 'vodka' in flask.request.args | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 05:05:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-05 00:42:19 +08:00
										 |  |  | def test_json_request_and_response(app, client): | 
					
						
							| 
									
										
										
										
											2015-04-02 06:08:06 +08:00
										 |  |  |     @app.route('/echo', methods=['POST']) | 
					
						
							|  |  |  |     def echo(): | 
					
						
							| 
									
										
										
										
											2017-06-05 02:44:00 +08:00
										 |  |  |         return jsonify(flask.request.get_json()) | 
					
						
							| 
									
										
										
										
											2015-03-30 05:05:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-05 00:42:19 +08:00
										 |  |  |     with client: | 
					
						
							| 
									
										
										
										
											2015-03-30 05:05:32 +08:00
										 |  |  |         json_data = {'drink': {'gin': 1, 'tonic': True}, 'price': 10} | 
					
						
							| 
									
										
										
										
											2017-06-05 00:42:19 +08:00
										 |  |  |         rv = client.post('/echo', json=json_data) | 
					
						
							| 
									
										
										
										
											2015-04-02 06:08:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Request should be in JSON | 
					
						
							| 
									
										
										
										
											2015-03-30 06:05:40 +08:00
										 |  |  |         assert flask.request.is_json | 
					
						
							| 
									
										
										
										
											2015-03-30 05:05:32 +08:00
										 |  |  |         assert flask.request.get_json() == json_data | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 06:08:06 +08:00
										 |  |  |         # Response should be in JSON | 
					
						
							|  |  |  |         assert rv.status_code == 200 | 
					
						
							|  |  |  |         assert rv.is_json | 
					
						
							|  |  |  |         assert rv.get_json() == json_data | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-05 00:42:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-17 23:39:16 +08:00
										 |  |  | @pytest.mark.skipif(blinker is None, reason="blinker is not installed") | 
					
						
							|  |  |  | def test_client_json_no_app_context(app, client): | 
					
						
							|  |  |  |     @app.route("/hello", methods=["POST"]) | 
					
						
							|  |  |  |     def hello(): | 
					
						
							|  |  |  |         return "Hello, {}!".format(flask.request.json["name"]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class Namespace(object): | 
					
						
							|  |  |  |         count = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def add(self, app): | 
					
						
							|  |  |  |             self.count += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ns = Namespace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with appcontext_popped.connected_to(ns.add, app): | 
					
						
							|  |  |  |         rv = client.post("/hello", json={"name": "Flask"}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert rv.get_data(as_text=True) == "Hello, Flask!" | 
					
						
							|  |  |  |     assert ns.count == 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-20 04:20:03 +08:00
										 |  |  | def test_subdomain(): | 
					
						
							|  |  |  |     app = flask.Flask(__name__, subdomain_matching=True) | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     app.config['SERVER_NAME'] = 'example.com' | 
					
						
							| 
									
										
										
										
											2018-02-20 04:20:03 +08:00
										 |  |  |     client = app.test_client() | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     @app.route('/', subdomain='<company_id>') | 
					
						
							|  |  |  |     def view(company_id): | 
					
						
							|  |  |  |         return company_id | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with app.test_request_context(): | 
					
						
							| 
									
										
										
										
											2012-10-07 18:48:19 +08:00
										 |  |  |         url = flask.url_for('view', company_id='xxx') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |     with client: | 
					
						
							|  |  |  |         response = client.get(url) | 
					
						
							| 
									
										
										
										
											2012-10-07 18:48:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     assert 200 == response.status_code | 
					
						
							|  |  |  |     assert b'xxx' == response.data | 
					
						
							| 
									
										
										
										
											2012-10-07 18:48:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  | def test_nosubdomain(app, client): | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     app.config['SERVER_NAME'] = 'example.com' | 
					
						
							| 
									
										
										
										
											2017-05-24 06:18:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     @app.route('/<company_id>') | 
					
						
							|  |  |  |     def view(company_id): | 
					
						
							|  |  |  |         return company_id | 
					
						
							| 
									
										
										
										
											2012-10-07 18:48:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  |     with app.test_request_context(): | 
					
						
							| 
									
										
										
										
											2012-10-07 18:48:19 +08:00
										 |  |  |         url = flask.url_for('view', company_id='xxx') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 08:27:36 +08:00
										 |  |  |     with client: | 
					
						
							|  |  |  |         response = client.get(url) | 
					
						
							| 
									
										
										
										
											2014-09-04 21:30:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     assert 200 == response.status_code | 
					
						
							|  |  |  |     assert b'xxx' == response.data | 
					
						
							| 
									
										
										
										
											2018-02-20 07:34:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_cli_runner_class(app): | 
					
						
							|  |  |  |     runner = app.test_cli_runner() | 
					
						
							|  |  |  |     assert isinstance(runner, FlaskCliRunner) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class SubRunner(FlaskCliRunner): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     app.test_cli_runner_class = SubRunner | 
					
						
							|  |  |  |     runner = app.test_cli_runner() | 
					
						
							|  |  |  |     assert isinstance(runner, SubRunner) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_cli_invoke(app): | 
					
						
							|  |  |  |     @app.cli.command('hello') | 
					
						
							|  |  |  |     def hello_command(): | 
					
						
							|  |  |  |         click.echo('Hello, World!') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     runner = app.test_cli_runner() | 
					
						
							|  |  |  |     # invoke with command name | 
					
						
							|  |  |  |     result = runner.invoke(args=['hello']) | 
					
						
							|  |  |  |     assert 'Hello' in result.output | 
					
						
							|  |  |  |     # invoke with command object | 
					
						
							|  |  |  |     result = runner.invoke(hello_command) | 
					
						
							|  |  |  |     assert 'Hello' in result.output | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_cli_custom_obj(app): | 
					
						
							|  |  |  |     class NS(object): | 
					
						
							|  |  |  |         called = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def create_app(): | 
					
						
							|  |  |  |         NS.called = True | 
					
						
							|  |  |  |         return app | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @app.cli.command('hello') | 
					
						
							|  |  |  |     def hello_command(): | 
					
						
							|  |  |  |         click.echo('Hello, World!') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     script_info = ScriptInfo(create_app=create_app) | 
					
						
							|  |  |  |     runner = app.test_cli_runner() | 
					
						
							|  |  |  |     runner.invoke(hello_command, obj=script_info) | 
					
						
							|  |  |  |     assert NS.called |