reqctx.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # -*- coding: utf-8 -*-
  2. """
  3. flask.testsuite.reqctx
  4. ~~~~~~~~~~~~~~~~~~~~~~
  5. Tests the request context.
  6. :copyright: (c) 2012 by Armin Ronacher.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import flask
  10. import unittest
  11. try:
  12. from greenlet import greenlet
  13. except ImportError:
  14. greenlet = None
  15. from flask.testsuite import FlaskTestCase
  16. class RequestContextTestCase(FlaskTestCase):
  17. def test_teardown_on_pop(self):
  18. buffer = []
  19. app = flask.Flask(__name__)
  20. @app.teardown_request
  21. def end_of_request(exception):
  22. buffer.append(exception)
  23. ctx = app.test_request_context()
  24. ctx.push()
  25. self.assert_equal(buffer, [])
  26. ctx.pop()
  27. self.assert_equal(buffer, [None])
  28. def test_proper_test_request_context(self):
  29. app = flask.Flask(__name__)
  30. app.config.update(
  31. SERVER_NAME='localhost.localdomain:5000'
  32. )
  33. @app.route('/')
  34. def index():
  35. return None
  36. @app.route('/', subdomain='foo')
  37. def sub():
  38. return None
  39. with app.test_request_context('/'):
  40. self.assert_equal(flask.url_for('index', _external=True), 'http://localhost.localdomain:5000/')
  41. with app.test_request_context('/'):
  42. self.assert_equal(flask.url_for('sub', _external=True), 'http://foo.localhost.localdomain:5000/')
  43. try:
  44. with app.test_request_context('/', environ_overrides={'HTTP_HOST': 'localhost'}):
  45. pass
  46. except Exception as e:
  47. self.assert_true(isinstance(e, ValueError))
  48. self.assert_equal(str(e), "the server name provided " +
  49. "('localhost.localdomain:5000') does not match the " + \
  50. "server name from the WSGI environment ('localhost')")
  51. try:
  52. app.config.update(SERVER_NAME='localhost')
  53. with app.test_request_context('/', environ_overrides={'SERVER_NAME': 'localhost'}):
  54. pass
  55. except ValueError as e:
  56. raise ValueError(
  57. "No ValueError exception should have been raised \"%s\"" % e
  58. )
  59. try:
  60. app.config.update(SERVER_NAME='localhost:80')
  61. with app.test_request_context('/', environ_overrides={'SERVER_NAME': 'localhost:80'}):
  62. pass
  63. except ValueError as e:
  64. raise ValueError(
  65. "No ValueError exception should have been raised \"%s\"" % e
  66. )
  67. def test_context_binding(self):
  68. app = flask.Flask(__name__)
  69. @app.route('/')
  70. def index():
  71. return 'Hello %s!' % flask.request.args['name']
  72. @app.route('/meh')
  73. def meh():
  74. return flask.request.url
  75. with app.test_request_context('/?name=World'):
  76. self.assert_equal(index(), 'Hello World!')
  77. with app.test_request_context('/meh'):
  78. self.assert_equal(meh(), 'http://localhost/meh')
  79. self.assert_true(flask._request_ctx_stack.top is None)
  80. def test_context_test(self):
  81. app = flask.Flask(__name__)
  82. self.assert_false(flask.request)
  83. self.assert_false(flask.has_request_context())
  84. ctx = app.test_request_context()
  85. ctx.push()
  86. try:
  87. self.assert_true(flask.request)
  88. self.assert_true(flask.has_request_context())
  89. finally:
  90. ctx.pop()
  91. def test_manual_context_binding(self):
  92. app = flask.Flask(__name__)
  93. @app.route('/')
  94. def index():
  95. return 'Hello %s!' % flask.request.args['name']
  96. ctx = app.test_request_context('/?name=World')
  97. ctx.push()
  98. self.assert_equal(index(), 'Hello World!')
  99. ctx.pop()
  100. try:
  101. index()
  102. except RuntimeError:
  103. pass
  104. else:
  105. self.assert_true(0, 'expected runtime error')
  106. def test_greenlet_context_copying(self):
  107. app = flask.Flask(__name__)
  108. greenlets = []
  109. @app.route('/')
  110. def index():
  111. reqctx = flask._request_ctx_stack.top.copy()
  112. def g():
  113. self.assert_false(flask.request)
  114. self.assert_false(flask.current_app)
  115. with reqctx:
  116. self.assert_true(flask.request)
  117. self.assert_equal(flask.current_app, app)
  118. self.assert_equal(flask.request.path, '/')
  119. self.assert_equal(flask.request.args['foo'], 'bar')
  120. self.assert_false(flask.request)
  121. return 42
  122. greenlets.append(greenlet(g))
  123. return 'Hello World!'
  124. rv = app.test_client().get('/?foo=bar')
  125. self.assert_equal(rv.data, b'Hello World!')
  126. result = greenlets[0].run()
  127. self.assert_equal(result, 42)
  128. def test_greenlet_context_copying_api(self):
  129. app = flask.Flask(__name__)
  130. greenlets = []
  131. @app.route('/')
  132. def index():
  133. reqctx = flask._request_ctx_stack.top.copy()
  134. @flask.copy_current_request_context
  135. def g():
  136. self.assert_true(flask.request)
  137. self.assert_equal(flask.current_app, app)
  138. self.assert_equal(flask.request.path, '/')
  139. self.assert_equal(flask.request.args['foo'], 'bar')
  140. return 42
  141. greenlets.append(greenlet(g))
  142. return 'Hello World!'
  143. rv = app.test_client().get('/?foo=bar')
  144. self.assert_equal(rv.data, b'Hello World!')
  145. result = greenlets[0].run()
  146. self.assert_equal(result, 42)
  147. # Disable test if we don't have greenlets available
  148. if greenlet is None:
  149. test_greenlet_context_copying = None
  150. test_greenlet_context_copying_api = None
  151. def suite():
  152. suite = unittest.TestSuite()
  153. suite.addTest(unittest.makeSuite(RequestContextTestCase))
  154. return suite