| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- # -*- coding: utf-8 -*-
- """
- flask.testsuite.testing
- ~~~~~~~~~~~~~~~~~~~~~~~
- Test client and more.
- :copyright: (c) 2011 by Armin Ronacher.
- :license: BSD, see LICENSE for more details.
- """
- import flask
- import unittest
- from flask.testsuite import FlaskTestCase
- from flask._compat import text_type
- class TestToolsTestCase(FlaskTestCase):
- 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()
- self.assert_equal(ctx.request.url, 'http://example.com:1234/foo/')
- with app.test_client() as c:
- rv = c.get('/')
- self.assert_equal(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()
- self.assert_equal(ctx.request.url, 'http://localhost/')
- with app.test_client() as c:
- rv = c.get('/')
- self.assert_equal(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', '<missing>')
- with app.test_client() as c:
- rv = c.get('/getsession')
- assert rv.data == b'<missing>'
- 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.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:
- self.assert_equal(len(sess), 0)
- sess['foo'] = [42]
- self.assert_equal(len(sess), 1)
- rv = c.get('/')
- self.assert_equal(rv.data, b'[42]')
- with c.session_transaction() as sess:
- self.assert_equal(len(sess), 1)
- self.assert_equal(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:
- self.assert_in('Session backend did not open a session', str(e))
- else:
- self.fail('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()
- self.assert_true(req is not None)
- with c.session_transaction():
- self.assert_true(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)
- try:
- with c.session_transaction() as s:
- pass
- except RuntimeError as e:
- self.assert_in('cookies', str(e))
- else:
- self.fail('Expected runtime error')
- def test_test_client_context_binding(self):
- app = flask.Flask(__name__)
- @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('/')
- self.assert_equal(flask.g.value, 42)
- self.assert_equal(resp.data, b'Hello World!')
- self.assert_equal(resp.status_code, 200)
- resp = c.get('/other')
- self.assert_false(hasattr(flask.g, 'value'))
- self.assert_in(b'Internal Server Error', resp.data)
- self.assert_equal(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(self):
- app = flask.Flask(__name__)
- c = app.test_client()
- with c:
- self.assert_equal(c.get('/').status_code, 404)
- with c:
- self.assert_equal(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:
- self.assert_equal(called, [])
- c.get('/')
- self.assert_equal(called, [])
- self.assert_equal(called, [None])
- del called[:]
- with app.test_client() as c:
- self.assert_equal(called, [])
- c.get('/')
- self.assert_equal(called, [])
- c.get('/')
- self.assert_equal(called, [None])
- self.assert_equal(called, [None, None])
- class SubdomainTestCase(FlaskTestCase):
- def setUp(self):
- self.app = flask.Flask(__name__)
- self.app.config['SERVER_NAME'] = 'example.com'
- self.client = self.app.test_client()
- self._ctx = self.app.test_request_context()
- self._ctx.push()
- def tearDown(self):
- if self._ctx is not None:
- self._ctx.pop()
- def test_subdomain(self):
- @self.app.route('/', subdomain='<company_id>')
- def view(company_id):
- return company_id
- url = flask.url_for('view', company_id='xxx')
- response = self.client.get(url)
- self.assert_equal(200, response.status_code)
- self.assert_equal(b'xxx', response.data)
- def test_nosubdomain(self):
- @self.app.route('/<company_id>')
- def view(company_id):
- return company_id
- url = flask.url_for('view', company_id='xxx')
- response = self.client.get(url)
- self.assert_equal(200, response.status_code)
- self.assert_equal(b'xxx', response.data)
- def suite():
- suite = unittest.TestSuite()
- suite.addTest(unittest.makeSuite(TestToolsTestCase))
- suite.addTest(unittest.makeSuite(SubdomainTestCase))
- return suite
|