2
0

test_legacy.py 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  1. import sys
  2. from django.core.signals import got_request_exception
  3. from django.http import HttpResponse
  4. from django.template import engines
  5. from django.template.response import TemplateResponse
  6. from django.test import SimpleTestCase, override_settings
  7. from django.test.utils import ignore_warnings
  8. from django.utils.deprecation import MiddlewareMixin, RemovedInDjango20Warning
  9. from .tests import MiddlewareNotUsedTests
  10. class TestException(Exception):
  11. pass
  12. # A middleware base class that tracks which methods have been called
  13. class TestMiddleware(MiddlewareMixin):
  14. def __init__(self, get_response=None):
  15. self.process_request_called = False
  16. self.process_view_called = False
  17. self.process_response_called = False
  18. self.process_template_response_called = False
  19. self.process_exception_called = False
  20. self.get_response = get_response
  21. def process_request(self, request):
  22. self.process_request_called = True
  23. def process_view(self, request, view_func, view_args, view_kwargs):
  24. self.process_view_called = True
  25. def process_template_response(self, request, response):
  26. self.process_template_response_called = True
  27. return response
  28. def process_response(self, request, response):
  29. self.process_response_called = True
  30. return response
  31. def process_exception(self, request, exception):
  32. self.process_exception_called = True
  33. # Middleware examples that do the right thing
  34. class RequestMiddleware(TestMiddleware):
  35. def process_request(self, request):
  36. super(RequestMiddleware, self).process_request(request)
  37. return HttpResponse('Request Middleware')
  38. class ViewMiddleware(TestMiddleware):
  39. def process_view(self, request, view_func, view_args, view_kwargs):
  40. super(ViewMiddleware, self).process_view(request, view_func, view_args, view_kwargs)
  41. return HttpResponse('View Middleware')
  42. class TemplateResponseViewMiddleware(TestMiddleware):
  43. def process_view(self, request, view_func, view_args, view_kwargs):
  44. super(TemplateResponseViewMiddleware, self).process_view(request, view_func, view_args, view_kwargs)
  45. template = engines['django'].from_string('TemplateResponse View Middleware')
  46. return TemplateResponse(request, template)
  47. class ResponseMiddleware(TestMiddleware):
  48. def process_response(self, request, response):
  49. super(ResponseMiddleware, self).process_response(request, response)
  50. return HttpResponse('Response Middleware')
  51. class ContentAccessingResponseMiddleware(TestMiddleware):
  52. def process_response(self, request, response):
  53. super(ContentAccessingResponseMiddleware, self).process_response(request, response)
  54. return HttpResponse('Content-accessing Response Middleware: %d' % len(response.content))
  55. class TemplateResponseMiddleware(TestMiddleware):
  56. def process_template_response(self, request, response):
  57. super(TemplateResponseMiddleware, self).process_template_response(request, response)
  58. template = engines['django'].from_string('Template Response Middleware')
  59. return TemplateResponse(request, template)
  60. class ExceptionMiddleware(TestMiddleware):
  61. def process_exception(self, request, exception):
  62. super(ExceptionMiddleware, self).process_exception(request, exception)
  63. return HttpResponse('Exception Middleware')
  64. # Sample middlewares that raise exceptions
  65. class BadRequestMiddleware(TestMiddleware):
  66. def process_request(self, request):
  67. super(BadRequestMiddleware, self).process_request(request)
  68. raise TestException('Test Request Exception')
  69. class BadViewMiddleware(TestMiddleware):
  70. def process_view(self, request, view_func, view_args, view_kwargs):
  71. super(BadViewMiddleware, self).process_view(request, view_func, view_args, view_kwargs)
  72. raise TestException('Test View Exception')
  73. class BadTemplateResponseMiddleware(TestMiddleware):
  74. def process_template_response(self, request, response):
  75. super(BadTemplateResponseMiddleware, self).process_template_response(request, response)
  76. raise TestException('Test Template Response Exception')
  77. class BadResponseMiddleware(TestMiddleware):
  78. def process_response(self, request, response):
  79. super(BadResponseMiddleware, self).process_response(request, response)
  80. raise TestException('Test Response Exception')
  81. class BadExceptionMiddleware(TestMiddleware):
  82. def process_exception(self, request, exception):
  83. super(BadExceptionMiddleware, self).process_exception(request, exception)
  84. raise TestException('Test Exception Exception')
  85. # Sample middlewares that omit to return an HttpResonse
  86. class NoTemplateResponseMiddleware(TestMiddleware):
  87. def process_template_response(self, request, response):
  88. super(NoTemplateResponseMiddleware, self).process_template_response(request, response)
  89. class NoResponseMiddleware(TestMiddleware):
  90. def process_response(self, request, response):
  91. super(NoResponseMiddleware, self).process_response(request, response)
  92. @ignore_warnings(category=RemovedInDjango20Warning)
  93. @override_settings(
  94. ROOT_URLCONF='middleware_exceptions.urls',
  95. MIDDLEWARE_CLASSES=['django.middleware.common.CommonMiddleware'],
  96. MIDDLEWARE=None,
  97. )
  98. class BaseMiddlewareExceptionTest(SimpleTestCase):
  99. def setUp(self):
  100. self.exceptions = []
  101. got_request_exception.connect(self._on_request_exception)
  102. self.client.handler.load_middleware()
  103. def tearDown(self):
  104. got_request_exception.disconnect(self._on_request_exception)
  105. self.exceptions = []
  106. def _on_request_exception(self, sender, request, **kwargs):
  107. self.exceptions.append(sys.exc_info())
  108. def _add_middleware(self, middleware):
  109. self.client.handler._request_middleware.insert(0, middleware.process_request)
  110. self.client.handler._view_middleware.insert(0, middleware.process_view)
  111. self.client.handler._template_response_middleware.append(middleware.process_template_response)
  112. self.client.handler._response_middleware.append(middleware.process_response)
  113. self.client.handler._exception_middleware.append(middleware.process_exception)
  114. def assert_exceptions_handled(self, url, errors, extra_error=None):
  115. try:
  116. self.client.get(url)
  117. except TestException:
  118. # Test client intentionally re-raises any exceptions being raised
  119. # during request handling. Hence actual testing that exception was
  120. # properly handled is done by relying on got_request_exception
  121. # signal being sent.
  122. pass
  123. except Exception as e:
  124. if type(extra_error) != type(e):
  125. self.fail("Unexpected exception: %s" % e)
  126. self.assertEqual(len(self.exceptions), len(errors))
  127. for i, error in enumerate(errors):
  128. exception, value, tb = self.exceptions[i]
  129. self.assertEqual(value.args, (error, ))
  130. def assert_middleware_usage(self, middleware, request, view, template_response, response, exception):
  131. # include the middleware name for easier debugging of failures
  132. self.assertEqual(
  133. (
  134. middleware.__class__.__name__,
  135. middleware.process_request_called,
  136. middleware.process_view_called,
  137. middleware.process_template_response_called,
  138. middleware.process_response_called,
  139. middleware.process_exception_called,
  140. ), (
  141. middleware.__class__.__name__,
  142. request,
  143. view,
  144. template_response,
  145. response,
  146. exception,
  147. )
  148. )
  149. class MiddlewareTests(BaseMiddlewareExceptionTest):
  150. def test_process_request_middleware(self):
  151. pre_middleware = TestMiddleware()
  152. middleware = RequestMiddleware()
  153. post_middleware = TestMiddleware()
  154. self._add_middleware(post_middleware)
  155. self._add_middleware(middleware)
  156. self._add_middleware(pre_middleware)
  157. self.assert_exceptions_handled('/middleware_exceptions/view/', [])
  158. # The right middleware methods have been invoked
  159. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  160. self.assert_middleware_usage(middleware, True, False, False, True, False)
  161. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  162. def test_process_view_middleware(self):
  163. pre_middleware = TestMiddleware()
  164. middleware = ViewMiddleware()
  165. post_middleware = TestMiddleware()
  166. self._add_middleware(post_middleware)
  167. self._add_middleware(middleware)
  168. self._add_middleware(pre_middleware)
  169. self.assert_exceptions_handled('/middleware_exceptions/view/', [])
  170. # The right middleware methods have been invoked
  171. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  172. self.assert_middleware_usage(middleware, True, True, False, True, False)
  173. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  174. def test_process_response_middleware(self):
  175. pre_middleware = TestMiddleware()
  176. middleware = ResponseMiddleware()
  177. post_middleware = TestMiddleware()
  178. self._add_middleware(post_middleware)
  179. self._add_middleware(middleware)
  180. self._add_middleware(pre_middleware)
  181. self.assert_exceptions_handled('/middleware_exceptions/view/', [])
  182. # The right middleware methods have been invoked
  183. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  184. self.assert_middleware_usage(middleware, True, True, False, True, False)
  185. self.assert_middleware_usage(post_middleware, True, True, False, True, False)
  186. def test_process_template_response_middleware(self):
  187. pre_middleware = TestMiddleware()
  188. middleware = TemplateResponseMiddleware()
  189. post_middleware = TestMiddleware()
  190. self._add_middleware(post_middleware)
  191. self._add_middleware(middleware)
  192. self._add_middleware(pre_middleware)
  193. self.assert_exceptions_handled('/middleware_exceptions/template_response/', [])
  194. # The right middleware methods have been invoked
  195. self.assert_middleware_usage(pre_middleware, True, True, True, True, False)
  196. self.assert_middleware_usage(middleware, True, True, True, True, False)
  197. self.assert_middleware_usage(post_middleware, True, True, True, True, False)
  198. def test_process_exception_middleware(self):
  199. pre_middleware = TestMiddleware()
  200. middleware = ExceptionMiddleware()
  201. post_middleware = TestMiddleware()
  202. self._add_middleware(post_middleware)
  203. self._add_middleware(middleware)
  204. self._add_middleware(pre_middleware)
  205. self.assert_exceptions_handled('/middleware_exceptions/view/', [])
  206. # The right middleware methods have been invoked
  207. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  208. self.assert_middleware_usage(middleware, True, True, False, True, False)
  209. self.assert_middleware_usage(post_middleware, True, True, False, True, False)
  210. def test_process_request_middleware_not_found(self):
  211. pre_middleware = TestMiddleware()
  212. middleware = RequestMiddleware()
  213. post_middleware = TestMiddleware()
  214. self._add_middleware(post_middleware)
  215. self._add_middleware(middleware)
  216. self._add_middleware(pre_middleware)
  217. self.assert_exceptions_handled('/middleware_exceptions/not_found/', [])
  218. # The right middleware methods have been invoked
  219. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  220. self.assert_middleware_usage(middleware, True, False, False, True, False)
  221. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  222. def test_process_view_middleware_not_found(self):
  223. pre_middleware = TestMiddleware()
  224. middleware = ViewMiddleware()
  225. post_middleware = TestMiddleware()
  226. self._add_middleware(post_middleware)
  227. self._add_middleware(middleware)
  228. self._add_middleware(pre_middleware)
  229. self.assert_exceptions_handled('/middleware_exceptions/not_found/', [])
  230. # The right middleware methods have been invoked
  231. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  232. self.assert_middleware_usage(middleware, True, True, False, True, False)
  233. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  234. def test_process_template_response_middleware_not_found(self):
  235. pre_middleware = TestMiddleware()
  236. middleware = TemplateResponseMiddleware()
  237. post_middleware = TestMiddleware()
  238. self._add_middleware(post_middleware)
  239. self._add_middleware(middleware)
  240. self._add_middleware(pre_middleware)
  241. self.assert_exceptions_handled('/middleware_exceptions/not_found/', [])
  242. # The right middleware methods have been invoked
  243. self.assert_middleware_usage(pre_middleware, True, True, False, True, True)
  244. self.assert_middleware_usage(middleware, True, True, False, True, True)
  245. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  246. def test_process_response_middleware_not_found(self):
  247. pre_middleware = TestMiddleware()
  248. middleware = ResponseMiddleware()
  249. post_middleware = TestMiddleware()
  250. self._add_middleware(post_middleware)
  251. self._add_middleware(middleware)
  252. self._add_middleware(pre_middleware)
  253. self.assert_exceptions_handled('/middleware_exceptions/not_found/', [])
  254. # The right middleware methods have been invoked
  255. self.assert_middleware_usage(pre_middleware, True, True, False, True, True)
  256. self.assert_middleware_usage(middleware, True, True, False, True, True)
  257. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  258. def test_process_exception_middleware_not_found(self):
  259. pre_middleware = TestMiddleware()
  260. middleware = ExceptionMiddleware()
  261. post_middleware = TestMiddleware()
  262. self._add_middleware(post_middleware)
  263. self._add_middleware(middleware)
  264. self._add_middleware(pre_middleware)
  265. self.assert_exceptions_handled('/middleware_exceptions/not_found/', [])
  266. # The right middleware methods have been invoked
  267. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  268. self.assert_middleware_usage(middleware, True, True, False, True, True)
  269. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  270. def test_process_request_middleware_exception(self):
  271. pre_middleware = TestMiddleware()
  272. middleware = RequestMiddleware()
  273. post_middleware = TestMiddleware()
  274. self._add_middleware(post_middleware)
  275. self._add_middleware(middleware)
  276. self._add_middleware(pre_middleware)
  277. self.assert_exceptions_handled('/middleware_exceptions/error/', [])
  278. # The right middleware methods have been invoked
  279. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  280. self.assert_middleware_usage(middleware, True, False, False, True, False)
  281. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  282. def test_process_view_middleware_exception(self):
  283. pre_middleware = TestMiddleware()
  284. middleware = ViewMiddleware()
  285. post_middleware = TestMiddleware()
  286. self._add_middleware(post_middleware)
  287. self._add_middleware(middleware)
  288. self._add_middleware(pre_middleware)
  289. self.assert_exceptions_handled('/middleware_exceptions/error/', [])
  290. # The right middleware methods have been invoked
  291. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  292. self.assert_middleware_usage(middleware, True, True, False, True, False)
  293. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  294. def test_process_response_middleware_exception(self):
  295. pre_middleware = TestMiddleware()
  296. middleware = ResponseMiddleware()
  297. post_middleware = TestMiddleware()
  298. self._add_middleware(post_middleware)
  299. self._add_middleware(middleware)
  300. self._add_middleware(pre_middleware)
  301. self.assert_exceptions_handled('/middleware_exceptions/error/', ['Error in view'], Exception())
  302. # The right middleware methods have been invoked
  303. self.assert_middleware_usage(pre_middleware, True, True, False, True, True)
  304. self.assert_middleware_usage(middleware, True, True, False, True, True)
  305. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  306. def test_process_exception_middleware_exception(self):
  307. pre_middleware = TestMiddleware()
  308. middleware = ExceptionMiddleware()
  309. post_middleware = TestMiddleware()
  310. self._add_middleware(post_middleware)
  311. self._add_middleware(middleware)
  312. self._add_middleware(pre_middleware)
  313. self.assert_exceptions_handled('/middleware_exceptions/error/', [])
  314. # The right middleware methods have been invoked
  315. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  316. self.assert_middleware_usage(middleware, True, True, False, True, True)
  317. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  318. def test_process_request_middleware_null_view(self):
  319. pre_middleware = TestMiddleware()
  320. middleware = RequestMiddleware()
  321. post_middleware = TestMiddleware()
  322. self._add_middleware(post_middleware)
  323. self._add_middleware(middleware)
  324. self._add_middleware(pre_middleware)
  325. self.assert_exceptions_handled('/middleware_exceptions/null_view/', [])
  326. # The right middleware methods have been invoked
  327. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  328. self.assert_middleware_usage(middleware, True, False, False, True, False)
  329. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  330. def test_process_view_middleware_null_view(self):
  331. pre_middleware = TestMiddleware()
  332. middleware = ViewMiddleware()
  333. post_middleware = TestMiddleware()
  334. self._add_middleware(post_middleware)
  335. self._add_middleware(middleware)
  336. self._add_middleware(pre_middleware)
  337. self.assert_exceptions_handled('/middleware_exceptions/null_view/', [])
  338. # The right middleware methods have been invoked
  339. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  340. self.assert_middleware_usage(middleware, True, True, False, True, False)
  341. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  342. def test_process_response_middleware_null_view(self):
  343. pre_middleware = TestMiddleware()
  344. middleware = ResponseMiddleware()
  345. post_middleware = TestMiddleware()
  346. self._add_middleware(post_middleware)
  347. self._add_middleware(middleware)
  348. self._add_middleware(pre_middleware)
  349. self.assert_exceptions_handled(
  350. '/middleware_exceptions/null_view/', [
  351. "The view middleware_exceptions.views.null_view didn't return "
  352. "an HttpResponse object. It returned None instead."
  353. ],
  354. ValueError()
  355. )
  356. # The right middleware methods have been invoked
  357. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  358. self.assert_middleware_usage(middleware, True, True, False, True, False)
  359. self.assert_middleware_usage(post_middleware, True, True, False, True, False)
  360. def test_process_exception_middleware_null_view(self):
  361. pre_middleware = TestMiddleware()
  362. middleware = ExceptionMiddleware()
  363. post_middleware = TestMiddleware()
  364. self._add_middleware(post_middleware)
  365. self._add_middleware(middleware)
  366. self._add_middleware(pre_middleware)
  367. self.assert_exceptions_handled(
  368. '/middleware_exceptions/null_view/', [
  369. "The view middleware_exceptions.views.null_view didn't return "
  370. "an HttpResponse object. It returned None instead."
  371. ],
  372. ValueError()
  373. )
  374. # The right middleware methods have been invoked
  375. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  376. self.assert_middleware_usage(middleware, True, True, False, True, False)
  377. self.assert_middleware_usage(post_middleware, True, True, False, True, False)
  378. def test_process_request_middleware_permission_denied(self):
  379. pre_middleware = TestMiddleware()
  380. middleware = RequestMiddleware()
  381. post_middleware = TestMiddleware()
  382. self._add_middleware(post_middleware)
  383. self._add_middleware(middleware)
  384. self._add_middleware(pre_middleware)
  385. self.assert_exceptions_handled('/middleware_exceptions/permission_denied/', [])
  386. # The right middleware methods have been invoked
  387. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  388. self.assert_middleware_usage(middleware, True, False, False, True, False)
  389. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  390. def test_process_view_middleware_permission_denied(self):
  391. pre_middleware = TestMiddleware()
  392. middleware = ViewMiddleware()
  393. post_middleware = TestMiddleware()
  394. self._add_middleware(post_middleware)
  395. self._add_middleware(middleware)
  396. self._add_middleware(pre_middleware)
  397. self.assert_exceptions_handled('/middleware_exceptions/permission_denied/', [])
  398. # The right middleware methods have been invoked
  399. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  400. self.assert_middleware_usage(middleware, True, True, False, True, False)
  401. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  402. def test_process_response_middleware_permission_denied(self):
  403. pre_middleware = TestMiddleware()
  404. middleware = ResponseMiddleware()
  405. post_middleware = TestMiddleware()
  406. self._add_middleware(post_middleware)
  407. self._add_middleware(middleware)
  408. self._add_middleware(pre_middleware)
  409. self.assert_exceptions_handled('/middleware_exceptions/permission_denied/', [])
  410. # The right middleware methods have been invoked
  411. self.assert_middleware_usage(pre_middleware, True, True, False, True, True)
  412. self.assert_middleware_usage(middleware, True, True, False, True, True)
  413. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  414. def test_process_exception_middleware_permission_denied(self):
  415. pre_middleware = TestMiddleware()
  416. middleware = ExceptionMiddleware()
  417. post_middleware = TestMiddleware()
  418. self._add_middleware(post_middleware)
  419. self._add_middleware(middleware)
  420. self._add_middleware(pre_middleware)
  421. self.assert_exceptions_handled('/middleware_exceptions/permission_denied/', [])
  422. # The right middleware methods have been invoked
  423. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  424. self.assert_middleware_usage(middleware, True, True, False, True, True)
  425. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  426. def test_process_template_response_error(self):
  427. middleware = TestMiddleware()
  428. self._add_middleware(middleware)
  429. self.assert_exceptions_handled('/middleware_exceptions/template_response_error/', [])
  430. # The right middleware methods have been invoked
  431. self.assert_middleware_usage(middleware, True, True, True, True, False)
  432. def test_templateresponse_from_process_view_rendered(self):
  433. view_middleware = TemplateResponseViewMiddleware()
  434. # ContentAccessingResponseMiddleware tries to access response.content
  435. # in its process_response().
  436. post_middleware = ContentAccessingResponseMiddleware()
  437. self._add_middleware(view_middleware)
  438. self._add_middleware(post_middleware)
  439. self.assert_exceptions_handled('/middleware_exceptions/view/', [])
  440. self.assert_middleware_usage(view_middleware, True, True, True, True, False)
  441. self.assert_middleware_usage(post_middleware, True, True, True, True, False)
  442. def test_templateresponse_from_process_view_passed_to_template_response_middleware(self):
  443. """
  444. TemplateResponses returned from process_view() should be passed to any
  445. process_template_response().
  446. """
  447. view_middleware = TemplateResponseViewMiddleware()
  448. resp_middleware = TemplateResponseMiddleware()
  449. self._add_middleware(view_middleware)
  450. self._add_middleware(resp_middleware)
  451. self.assert_exceptions_handled('/middleware_exceptions/view/', [])
  452. self.assert_middleware_usage(view_middleware, True, True, True, True, False)
  453. self.assert_middleware_usage(resp_middleware, True, True, True, True, False)
  454. class BadMiddlewareTests(BaseMiddlewareExceptionTest):
  455. def test_process_request_bad_middleware(self):
  456. pre_middleware = TestMiddleware()
  457. bad_middleware = BadRequestMiddleware()
  458. post_middleware = TestMiddleware()
  459. self._add_middleware(post_middleware)
  460. self._add_middleware(bad_middleware)
  461. self._add_middleware(pre_middleware)
  462. self.assert_exceptions_handled('/middleware_exceptions/view/', ['Test Request Exception'])
  463. # The right middleware methods have been invoked
  464. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  465. self.assert_middleware_usage(bad_middleware, True, False, False, True, False)
  466. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  467. def test_process_view_bad_middleware(self):
  468. pre_middleware = TestMiddleware()
  469. bad_middleware = BadViewMiddleware()
  470. post_middleware = TestMiddleware()
  471. self._add_middleware(post_middleware)
  472. self._add_middleware(bad_middleware)
  473. self._add_middleware(pre_middleware)
  474. self.assert_exceptions_handled('/middleware_exceptions/view/', ['Test View Exception'])
  475. # The right middleware methods have been invoked
  476. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  477. self.assert_middleware_usage(bad_middleware, True, True, False, True, False)
  478. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  479. def test_process_template_response_bad_middleware(self):
  480. pre_middleware = TestMiddleware()
  481. bad_middleware = BadTemplateResponseMiddleware()
  482. post_middleware = TestMiddleware()
  483. self._add_middleware(post_middleware)
  484. self._add_middleware(bad_middleware)
  485. self._add_middleware(pre_middleware)
  486. self.assert_exceptions_handled(
  487. '/middleware_exceptions/template_response/',
  488. ['Test Template Response Exception']
  489. )
  490. # The right middleware methods have been invoked
  491. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  492. self.assert_middleware_usage(bad_middleware, True, True, True, True, False)
  493. self.assert_middleware_usage(post_middleware, True, True, True, True, False)
  494. def test_process_response_bad_middleware(self):
  495. pre_middleware = TestMiddleware()
  496. bad_middleware = BadResponseMiddleware()
  497. post_middleware = TestMiddleware()
  498. self._add_middleware(post_middleware)
  499. self._add_middleware(bad_middleware)
  500. self._add_middleware(pre_middleware)
  501. self.assert_exceptions_handled('/middleware_exceptions/view/', ['Test Response Exception'])
  502. # The right middleware methods have been invoked
  503. self.assert_middleware_usage(pre_middleware, True, True, False, False, False)
  504. self.assert_middleware_usage(bad_middleware, True, True, False, True, False)
  505. self.assert_middleware_usage(post_middleware, True, True, False, True, False)
  506. def test_process_exception_bad_middleware(self):
  507. pre_middleware = TestMiddleware()
  508. bad_middleware = BadExceptionMiddleware()
  509. post_middleware = TestMiddleware()
  510. self._add_middleware(post_middleware)
  511. self._add_middleware(bad_middleware)
  512. self._add_middleware(pre_middleware)
  513. self.assert_exceptions_handled('/middleware_exceptions/view/', [])
  514. # The right middleware methods have been invoked
  515. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  516. self.assert_middleware_usage(bad_middleware, True, True, False, True, False)
  517. self.assert_middleware_usage(post_middleware, True, True, False, True, False)
  518. def test_process_request_bad_middleware_not_found(self):
  519. pre_middleware = TestMiddleware()
  520. bad_middleware = BadRequestMiddleware()
  521. post_middleware = TestMiddleware()
  522. self._add_middleware(post_middleware)
  523. self._add_middleware(bad_middleware)
  524. self._add_middleware(pre_middleware)
  525. self.assert_exceptions_handled('/middleware_exceptions/not_found/', ['Test Request Exception'])
  526. # The right middleware methods have been invoked
  527. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  528. self.assert_middleware_usage(bad_middleware, True, False, False, True, False)
  529. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  530. def test_process_view_bad_middleware_not_found(self):
  531. pre_middleware = TestMiddleware()
  532. bad_middleware = BadViewMiddleware()
  533. post_middleware = TestMiddleware()
  534. self._add_middleware(post_middleware)
  535. self._add_middleware(bad_middleware)
  536. self._add_middleware(pre_middleware)
  537. self.assert_exceptions_handled('/middleware_exceptions/not_found/', ['Test View Exception'])
  538. # The right middleware methods have been invoked
  539. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  540. self.assert_middleware_usage(bad_middleware, True, True, False, True, False)
  541. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  542. def test_process_response_bad_middleware_not_found(self):
  543. pre_middleware = TestMiddleware()
  544. bad_middleware = BadResponseMiddleware()
  545. post_middleware = TestMiddleware()
  546. self._add_middleware(post_middleware)
  547. self._add_middleware(bad_middleware)
  548. self._add_middleware(pre_middleware)
  549. self.assert_exceptions_handled('/middleware_exceptions/not_found/', ['Test Response Exception'])
  550. # The right middleware methods have been invoked
  551. self.assert_middleware_usage(pre_middleware, True, True, False, False, True)
  552. self.assert_middleware_usage(bad_middleware, True, True, False, True, True)
  553. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  554. def test_process_exception_bad_middleware_not_found(self):
  555. pre_middleware = TestMiddleware()
  556. bad_middleware = BadExceptionMiddleware()
  557. post_middleware = TestMiddleware()
  558. self._add_middleware(post_middleware)
  559. self._add_middleware(bad_middleware)
  560. self._add_middleware(pre_middleware)
  561. self.assert_exceptions_handled('/middleware_exceptions/not_found/', ['Test Exception Exception'])
  562. # The right middleware methods have been invoked
  563. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  564. self.assert_middleware_usage(bad_middleware, True, True, False, True, True)
  565. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  566. def test_process_request_bad_middleware_exception(self):
  567. pre_middleware = TestMiddleware()
  568. bad_middleware = BadRequestMiddleware()
  569. post_middleware = TestMiddleware()
  570. self._add_middleware(post_middleware)
  571. self._add_middleware(bad_middleware)
  572. self._add_middleware(pre_middleware)
  573. self.assert_exceptions_handled('/middleware_exceptions/error/', ['Test Request Exception'])
  574. # The right middleware methods have been invoked
  575. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  576. self.assert_middleware_usage(bad_middleware, True, False, False, True, False)
  577. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  578. def test_process_view_bad_middleware_exception(self):
  579. pre_middleware = TestMiddleware()
  580. bad_middleware = BadViewMiddleware()
  581. post_middleware = TestMiddleware()
  582. self._add_middleware(post_middleware)
  583. self._add_middleware(bad_middleware)
  584. self._add_middleware(pre_middleware)
  585. self.assert_exceptions_handled('/middleware_exceptions/error/', ['Test View Exception'])
  586. # The right middleware methods have been invoked
  587. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  588. self.assert_middleware_usage(bad_middleware, True, True, False, True, False)
  589. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  590. def test_process_response_bad_middleware_exception(self):
  591. pre_middleware = TestMiddleware()
  592. bad_middleware = BadResponseMiddleware()
  593. post_middleware = TestMiddleware()
  594. self._add_middleware(post_middleware)
  595. self._add_middleware(bad_middleware)
  596. self._add_middleware(pre_middleware)
  597. self.assert_exceptions_handled('/middleware_exceptions/error/', ['Error in view', 'Test Response Exception'])
  598. # The right middleware methods have been invoked
  599. self.assert_middleware_usage(pre_middleware, True, True, False, False, True)
  600. self.assert_middleware_usage(bad_middleware, True, True, False, True, True)
  601. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  602. def test_process_exception_bad_middleware_exception(self):
  603. pre_middleware = TestMiddleware()
  604. bad_middleware = BadExceptionMiddleware()
  605. post_middleware = TestMiddleware()
  606. self._add_middleware(post_middleware)
  607. self._add_middleware(bad_middleware)
  608. self._add_middleware(pre_middleware)
  609. self.assert_exceptions_handled('/middleware_exceptions/error/', ['Test Exception Exception'])
  610. # The right middleware methods have been invoked
  611. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  612. self.assert_middleware_usage(bad_middleware, True, True, False, True, True)
  613. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  614. def test_process_request_bad_middleware_null_view(self):
  615. pre_middleware = TestMiddleware()
  616. bad_middleware = BadRequestMiddleware()
  617. post_middleware = TestMiddleware()
  618. self._add_middleware(post_middleware)
  619. self._add_middleware(bad_middleware)
  620. self._add_middleware(pre_middleware)
  621. self.assert_exceptions_handled('/middleware_exceptions/null_view/', ['Test Request Exception'])
  622. # The right middleware methods have been invoked
  623. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  624. self.assert_middleware_usage(bad_middleware, True, False, False, True, False)
  625. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  626. def test_process_view_bad_middleware_null_view(self):
  627. pre_middleware = TestMiddleware()
  628. bad_middleware = BadViewMiddleware()
  629. post_middleware = TestMiddleware()
  630. self._add_middleware(post_middleware)
  631. self._add_middleware(bad_middleware)
  632. self._add_middleware(pre_middleware)
  633. self.assert_exceptions_handled('/middleware_exceptions/null_view/', ['Test View Exception'])
  634. # The right middleware methods have been invoked
  635. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  636. self.assert_middleware_usage(bad_middleware, True, True, False, True, False)
  637. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  638. def test_process_response_bad_middleware_null_view(self):
  639. pre_middleware = TestMiddleware()
  640. bad_middleware = BadResponseMiddleware()
  641. post_middleware = TestMiddleware()
  642. self._add_middleware(post_middleware)
  643. self._add_middleware(bad_middleware)
  644. self._add_middleware(pre_middleware)
  645. self.assert_exceptions_handled(
  646. '/middleware_exceptions/null_view/', [
  647. "The view middleware_exceptions.views.null_view didn't return "
  648. "an HttpResponse object. It returned None instead.",
  649. 'Test Response Exception'
  650. ]
  651. )
  652. # The right middleware methods have been invoked
  653. self.assert_middleware_usage(pre_middleware, True, True, False, False, False)
  654. self.assert_middleware_usage(bad_middleware, True, True, False, True, False)
  655. self.assert_middleware_usage(post_middleware, True, True, False, True, False)
  656. def test_process_exception_bad_middleware_null_view(self):
  657. pre_middleware = TestMiddleware()
  658. bad_middleware = BadExceptionMiddleware()
  659. post_middleware = TestMiddleware()
  660. self._add_middleware(post_middleware)
  661. self._add_middleware(bad_middleware)
  662. self._add_middleware(pre_middleware)
  663. self.assert_exceptions_handled(
  664. '/middleware_exceptions/null_view/', [
  665. "The view middleware_exceptions.views.null_view didn't return "
  666. "an HttpResponse object. It returned None instead."
  667. ],
  668. ValueError()
  669. )
  670. # The right middleware methods have been invoked
  671. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  672. self.assert_middleware_usage(bad_middleware, True, True, False, True, False)
  673. self.assert_middleware_usage(post_middleware, True, True, False, True, False)
  674. def test_process_request_bad_middleware_permission_denied(self):
  675. pre_middleware = TestMiddleware()
  676. bad_middleware = BadRequestMiddleware()
  677. post_middleware = TestMiddleware()
  678. self._add_middleware(post_middleware)
  679. self._add_middleware(bad_middleware)
  680. self._add_middleware(pre_middleware)
  681. self.assert_exceptions_handled('/middleware_exceptions/permission_denied/', ['Test Request Exception'])
  682. # The right middleware methods have been invoked
  683. self.assert_middleware_usage(pre_middleware, True, False, False, True, False)
  684. self.assert_middleware_usage(bad_middleware, True, False, False, True, False)
  685. self.assert_middleware_usage(post_middleware, False, False, False, True, False)
  686. def test_process_view_bad_middleware_permission_denied(self):
  687. pre_middleware = TestMiddleware()
  688. bad_middleware = BadViewMiddleware()
  689. post_middleware = TestMiddleware()
  690. self._add_middleware(post_middleware)
  691. self._add_middleware(bad_middleware)
  692. self._add_middleware(pre_middleware)
  693. self.assert_exceptions_handled('/middleware_exceptions/permission_denied/', ['Test View Exception'])
  694. # The right middleware methods have been invoked
  695. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  696. self.assert_middleware_usage(bad_middleware, True, True, False, True, False)
  697. self.assert_middleware_usage(post_middleware, True, False, False, True, False)
  698. def test_process_response_bad_middleware_permission_denied(self):
  699. pre_middleware = TestMiddleware()
  700. bad_middleware = BadResponseMiddleware()
  701. post_middleware = TestMiddleware()
  702. self._add_middleware(post_middleware)
  703. self._add_middleware(bad_middleware)
  704. self._add_middleware(pre_middleware)
  705. self.assert_exceptions_handled('/middleware_exceptions/permission_denied/', ['Test Response Exception'])
  706. # The right middleware methods have been invoked
  707. self.assert_middleware_usage(pre_middleware, True, True, False, False, True)
  708. self.assert_middleware_usage(bad_middleware, True, True, False, True, True)
  709. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  710. def test_process_exception_bad_middleware_permission_denied(self):
  711. pre_middleware = TestMiddleware()
  712. bad_middleware = BadExceptionMiddleware()
  713. post_middleware = TestMiddleware()
  714. self._add_middleware(post_middleware)
  715. self._add_middleware(bad_middleware)
  716. self._add_middleware(pre_middleware)
  717. self.assert_exceptions_handled('/middleware_exceptions/permission_denied/', ['Test Exception Exception'])
  718. # The right middleware methods have been invoked
  719. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  720. self.assert_middleware_usage(bad_middleware, True, True, False, True, True)
  721. self.assert_middleware_usage(post_middleware, True, True, False, True, True)
  722. def test_process_response_no_response_middleware(self):
  723. pre_middleware = TestMiddleware()
  724. middleware = NoResponseMiddleware()
  725. post_middleware = TestMiddleware()
  726. self._add_middleware(post_middleware)
  727. self._add_middleware(middleware)
  728. self._add_middleware(pre_middleware)
  729. self.assert_exceptions_handled('/middleware_exceptions/view/', [
  730. "NoResponseMiddleware.process_response didn't return an HttpResponse object. It returned None instead."
  731. ],
  732. ValueError())
  733. # The right middleware methods have been invoked
  734. self.assert_middleware_usage(pre_middleware, True, True, False, False, False)
  735. self.assert_middleware_usage(middleware, True, True, False, True, False)
  736. self.assert_middleware_usage(post_middleware, True, True, False, True, False)
  737. def test_process_template_response_no_response_middleware(self):
  738. pre_middleware = TestMiddleware()
  739. middleware = NoTemplateResponseMiddleware()
  740. post_middleware = TestMiddleware()
  741. self._add_middleware(post_middleware)
  742. self._add_middleware(middleware)
  743. self._add_middleware(pre_middleware)
  744. self.assert_exceptions_handled(
  745. '/middleware_exceptions/template_response/', [
  746. "NoTemplateResponseMiddleware.process_template_response didn't "
  747. "return an HttpResponse object. It returned None instead."
  748. ],
  749. ValueError()
  750. )
  751. # The right middleware methods have been invoked
  752. self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
  753. self.assert_middleware_usage(middleware, True, True, True, True, False)
  754. self.assert_middleware_usage(post_middleware, True, True, True, True, False)
  755. @ignore_warnings(category=RemovedInDjango20Warning)
  756. @override_settings(
  757. MIDDLEWARE_CLASSES=['django.middleware.common.CommonMiddleware'],
  758. MIDDLEWARE=None,
  759. )
  760. class MiddlewareNotUsedMiddlewareClassesTests(MiddlewareNotUsedTests):
  761. pass