diff --git a/tests/test_testing.py b/tests/test_testing.py index 1916ea9c..d0e8f9f7 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -16,242 +16,228 @@ import unittest from flask._compat import text_type -class TestTestTools(object): - - def test_environ_defaults_from_config(self): - app = flask.Flask(__name__) - app.testing = True - app.config['SERVER_NAME'] = 'example.com:1234' - app.config['APPLICATION_ROOT'] = '/foo' - @app.route('/') - def index(): - return flask.request.url - - ctx = app.test_request_context() - assert ctx.request.url == 'http://example.com:1234/foo/' - with app.test_client() as c: - rv = c.get('/') - assert rv.data == b'http://example.com:1234/foo/' - - def test_environ_defaults(self): - app = flask.Flask(__name__) - app.testing = True - @app.route('/') - def index(): - return flask.request.url - - ctx = app.test_request_context() - assert ctx.request.url == 'http://localhost/' - with app.test_client() as c: - rv = c.get('/') - assert rv.data == b'http://localhost/' - - def test_redirect_keep_session(self): - app = flask.Flask(__name__) - app.secret_key = 'testing' - - @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', '') - - with app.test_client() as c: - rv = c.get('/getsession') - assert rv.data == b'' - - rv = c.get('/') - assert rv.data == b'index' +def test_environ_defaults_from_config(): + app = flask.Flask(__name__) + app.testing = True + app.config['SERVER_NAME'] = 'example.com:1234' + app.config['APPLICATION_ROOT'] = '/foo' + @app.route('/') + def index(): + return flask.request.url + + ctx = app.test_request_context() + assert ctx.request.url == 'http://example.com:1234/foo/' + with app.test_client() as c: + rv = c.get('/') + assert rv.data == b'http://example.com:1234/foo/' + +def test_environ_defaults(): + app = flask.Flask(__name__) + app.testing = True + @app.route('/') + def index(): + return flask.request.url + + ctx = app.test_request_context() + assert ctx.request.url == 'http://localhost/' + with app.test_client() as c: + rv = c.get('/') + assert rv.data == b'http://localhost/' + +def test_redirect_keep_session(): + app = flask.Flask(__name__) + app.secret_key = 'testing' + + @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', '') + + with app.test_client() as c: + rv = c.get('/getsession') + assert rv.data == b'' + + rv = c.get('/') + assert rv.data == b'index' + assert flask.session.get('data') == 'foo' + rv = c.post('/', data={}, follow_redirects=True) + assert rv.data == b'foo' + + # This support requires a new Werkzeug version + if not hasattr(c, 'redirect_client'): assert flask.session.get('data') == 'foo' - rv = c.post('/', data={}, follow_redirects=True) - assert rv.data == b'foo' - # This support requires a new Werkzeug version - if not hasattr(c, 'redirect_client'): - assert flask.session.get('data') == 'foo' - - rv = c.get('/getsession') - assert rv.data == b'foo' - - def test_session_transactions(self): - app = flask.Flask(__name__) - app.testing = True - app.secret_key = 'testing' - - @app.route('/') - def index(): - return text_type(flask.session['foo']) - - with app.test_client() as c: - with c.session_transaction() as sess: - assert len(sess) == 0 - sess['foo'] = [42] - assert len(sess) == 1 - rv = c.get('/') - assert rv.data == b'[42]' - with c.session_transaction() as sess: - assert len(sess) == 1 - assert sess['foo'] == [42] - - def test_session_transactions_no_null_sessions(self): - app = flask.Flask(__name__) - app.testing = True - - with app.test_client() as c: - try: - with c.session_transaction() as sess: - pass - except RuntimeError as e: - assert 'Session backend did not open a session' in str(e) - else: - assert False, 'Expected runtime error' - - def test_session_transactions_keep_context(self): - app = flask.Flask(__name__) - app.testing = True - app.secret_key = 'testing' - - with app.test_client() as c: - rv = c.get('/') - req = flask.request._get_current_object() - assert req is not None - with c.session_transaction(): - assert req is flask.request._get_current_object() - - def test_session_transaction_needs_cookies(self): - app = flask.Flask(__name__) - app.testing = True - c = app.test_client(use_cookies=False) + rv = c.get('/getsession') + assert rv.data == b'foo' + +def test_session_transactions(): + app = flask.Flask(__name__) + app.testing = True + app.secret_key = 'testing' + + @app.route('/') + def index(): + return text_type(flask.session['foo']) + + with app.test_client() as c: + with c.session_transaction() as sess: + assert len(sess) == 0 + sess['foo'] = [42] + assert len(sess) == 1 + rv = c.get('/') + assert rv.data == b'[42]' + with c.session_transaction() as sess: + assert len(sess) == 1 + assert sess['foo'] == [42] + +def test_session_transactions_no_null_sessions(): + app = flask.Flask(__name__) + app.testing = True + + with app.test_client() as c: try: - with c.session_transaction() as s: + with c.session_transaction() as sess: pass except RuntimeError as e: - assert 'cookies' in str(e) + assert 'Session backend did not open a session' in str(e) else: assert False, 'Expected runtime error' - def test_test_client_context_binding(self): - app = flask.Flask(__name__) - app.config['LOGGER_HANDLER_POLICY'] = 'never' - @app.route('/') - def index(): - flask.g.value = 42 - return 'Hello World!' - - @app.route('/other') - def other(): - 1 // 0 - - with app.test_client() as c: - resp = c.get('/') - assert flask.g.value == 42 - assert resp.data == b'Hello World!' - assert resp.status_code == 200 - - resp = c.get('/other') - 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): +def test_session_transactions_keep_context(): + app = flask.Flask(__name__) + app.testing = True + app.secret_key = 'testing' + + with app.test_client() as c: + rv = c.get('/') + req = flask.request._get_current_object() + assert req is not None + with c.session_transaction(): + assert req is flask.request._get_current_object() + +def test_session_transaction_needs_cookies(): + app = flask.Flask(__name__) + app.testing = True + c = app.test_client(use_cookies=False) + try: + with c.session_transaction() as s: pass - else: - raise AssertionError('some kind of exception expected') - - def test_reuse_client(self): - app = flask.Flask(__name__) - c = app.test_client() - - with c: - assert c.get('/').status_code == 404 - - with c: - assert c.get('/').status_code == 404 - - def test_test_client_calls_teardown_handlers(self): - app = flask.Flask(__name__) - called = [] - @app.teardown_request - def remember(error): - called.append(error) - - with app.test_client() as c: - assert called == [] - c.get('/') - assert called == [] + except RuntimeError as e: + assert 'cookies' in str(e) + else: + assert False, 'Expected runtime error' + +def test_test_client_context_binding(): + app = flask.Flask(__name__) + app.config['LOGGER_HANDLER_POLICY'] = 'never' + @app.route('/') + def index(): + flask.g.value = 42 + return 'Hello World!' + + @app.route('/other') + def other(): + 1 // 0 + + with app.test_client() as c: + resp = c.get('/') + assert flask.g.value == 42 + assert resp.data == b'Hello World!' + assert resp.status_code == 200 + + resp = c.get('/other') + 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') + +def test_reuse_client(): + app = flask.Flask(__name__) + c = app.test_client() + + with c: + assert c.get('/').status_code == 404 + + with c: + assert c.get('/').status_code == 404 + +def test_test_client_calls_teardown_handlers(): + app = flask.Flask(__name__) + called = [] + @app.teardown_request + def remember(error): + called.append(error) + + with app.test_client() as c: + assert called == [] + c.get('/') + assert called == [] + assert called == [None] + + del called[:] + with app.test_client() as c: + assert called == [] + c.get('/') + assert called == [] + c.get('/') assert called == [None] - - del called[:] - with app.test_client() as c: - assert called == [] - c.get('/') - assert called == [] - c.get('/') - assert called == [None] - assert called == [None, None] - - def test_full_url_request(self): - app = flask.Flask(__name__) - app.testing = True - - @app.route('/action', methods=['POST']) - def action(): - return 'x' - - with app.test_client() as c: - rv = c.post('http://domain.com/action?vodka=42', data={'gin': 43}) - assert rv.status_code == 200 - assert 'gin' in flask.request.form - assert 'vodka' in flask.request.args - - -class TestSubdomain(object): - - @pytest.fixture - def app(self, request): - app = flask.Flask(__name__) - app.config['SERVER_NAME'] = 'example.com' - - ctx = app.test_request_context() - ctx.push() - - def teardown(): - if ctx is not None: - ctx.pop() - request.addfinalizer(teardown) - return app - - @pytest.fixture - def client(self, app): - return app.test_client() - - def test_subdomain(self, app, client): - @app.route('/', subdomain='') - def view(company_id): - return company_id - + assert called == [None, None] + +def test_full_url_request(): + app = flask.Flask(__name__) + app.testing = True + + @app.route('/action', methods=['POST']) + def action(): + return 'x' + + with app.test_client() as c: + rv = c.post('http://domain.com/action?vodka=42', data={'gin': 43}) + assert rv.status_code == 200 + assert 'gin' in flask.request.form + assert 'vodka' in flask.request.args + +def test_subdomain(): + app = flask.Flask(__name__) + app.config['SERVER_NAME'] = 'example.com' + @app.route('/', subdomain='') + def view(company_id): + return company_id + + with app.test_request_context(): url = flask.url_for('view', company_id='xxx') - response = client.get(url) - assert 200 == response.status_code - assert b'xxx' == response.data + with app.test_client() as c: + response = c.get(url) + assert 200 == response.status_code + assert b'xxx' == response.data - def test_nosubdomain(self, app, client): - @app.route('/') - def view(company_id): - return company_id +def test_nosubdomain(): + app = flask.Flask(__name__) + app.config['SERVER_NAME'] = 'example.com' + @app.route('/') + def view(company_id): + return company_id + with app.test_request_context(): url = flask.url_for('view', company_id='xxx') - response = client.get(url) - assert 200 == response.status_code - assert b'xxx' == response.data + with app.test_client() as c: + response = c.get(url) + + assert 200 == response.status_code + assert b'xxx' == response.data