tests.py 38 KB

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