| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- # -*- coding: utf-8 -*-
- """
- flask.testsuite.views
- ~~~~~~~~~~~~~~~~~~~~~
- Pluggable views.
- :copyright: (c) 2011 by Armin Ronacher.
- :license: BSD, see LICENSE for more details.
- """
- import flask
- import flask.views
- import unittest
- from flask.testsuite import FlaskTestCase
- from werkzeug.http import parse_set_header
- class ViewTestCase(FlaskTestCase):
- def common_test(self, app):
- c = app.test_client()
- self.assert_equal(c.get('/').data, b'GET')
- self.assert_equal(c.post('/').data, b'POST')
- self.assert_equal(c.put('/').status_code, 405)
- meths = parse_set_header(c.open('/', method='OPTIONS').headers['Allow'])
- self.assert_equal(sorted(meths), ['GET', 'HEAD', 'OPTIONS', 'POST'])
- def test_basic_view(self):
- app = flask.Flask(__name__)
- class Index(flask.views.View):
- methods = ['GET', 'POST']
- def dispatch_request(self):
- return flask.request.method
- app.add_url_rule('/', view_func=Index.as_view('index'))
- self.common_test(app)
- def test_method_based_view(self):
- app = flask.Flask(__name__)
- class Index(flask.views.MethodView):
- def get(self):
- return 'GET'
- def post(self):
- return 'POST'
- app.add_url_rule('/', view_func=Index.as_view('index'))
- self.common_test(app)
- def test_view_patching(self):
- app = flask.Flask(__name__)
- class Index(flask.views.MethodView):
- def get(self):
- 1 // 0
- def post(self):
- 1 // 0
- class Other(Index):
- def get(self):
- return 'GET'
- def post(self):
- return 'POST'
- view = Index.as_view('index')
- view.view_class = Other
- app.add_url_rule('/', view_func=view)
- self.common_test(app)
- def test_view_inheritance(self):
- app = flask.Flask(__name__)
- class Index(flask.views.MethodView):
- def get(self):
- return 'GET'
- def post(self):
- return 'POST'
- class BetterIndex(Index):
- def delete(self):
- return 'DELETE'
- app.add_url_rule('/', view_func=BetterIndex.as_view('index'))
- c = app.test_client()
- meths = parse_set_header(c.open('/', method='OPTIONS').headers['Allow'])
- self.assert_equal(sorted(meths), ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST'])
- def test_view_decorators(self):
- app = flask.Flask(__name__)
- def add_x_parachute(f):
- def new_function(*args, **kwargs):
- resp = flask.make_response(f(*args, **kwargs))
- resp.headers['X-Parachute'] = 'awesome'
- return resp
- return new_function
- class Index(flask.views.View):
- decorators = [add_x_parachute]
- def dispatch_request(self):
- return 'Awesome'
- app.add_url_rule('/', view_func=Index.as_view('index'))
- c = app.test_client()
- rv = c.get('/')
- self.assert_equal(rv.headers['X-Parachute'], 'awesome')
- self.assert_equal(rv.data, b'Awesome')
- def test_implicit_head(self):
- app = flask.Flask(__name__)
- class Index(flask.views.MethodView):
- def get(self):
- return flask.Response('Blub', headers={
- 'X-Method': flask.request.method
- })
- app.add_url_rule('/', view_func=Index.as_view('index'))
- c = app.test_client()
- rv = c.get('/')
- self.assert_equal(rv.data, b'Blub')
- self.assert_equal(rv.headers['X-Method'], 'GET')
- rv = c.head('/')
- self.assert_equal(rv.data, b'')
- self.assert_equal(rv.headers['X-Method'], 'HEAD')
- def test_explicit_head(self):
- app = flask.Flask(__name__)
- class Index(flask.views.MethodView):
- def get(self):
- return 'GET'
- def head(self):
- return flask.Response('', headers={'X-Method': 'HEAD'})
- app.add_url_rule('/', view_func=Index.as_view('index'))
- c = app.test_client()
- rv = c.get('/')
- self.assert_equal(rv.data, b'GET')
- rv = c.head('/')
- self.assert_equal(rv.data, b'')
- self.assert_equal(rv.headers['X-Method'], 'HEAD')
- def test_endpoint_override(self):
- app = flask.Flask(__name__)
- app.debug = True
- class Index(flask.views.View):
- methods = ['GET', 'POST']
- def dispatch_request(self):
- return flask.request.method
- app.add_url_rule('/', view_func=Index.as_view('index'))
- with self.assert_raises(AssertionError):
- app.add_url_rule('/', view_func=Index.as_view('index'))
- # But these tests should still pass. We just log a warning.
- self.common_test(app)
- def suite():
- suite = unittest.TestSuite()
- suite.addTest(unittest.makeSuite(ViewTestCase))
- return suite
|