test_errorpages.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. from django.core.exceptions import PermissionDenied
  2. from django.http import Http404
  3. from django.test import Client, TestCase, override_settings
  4. from django.test.client import RequestFactory
  5. from django.urls import reverse
  6. from ...acl.useracl import get_user_acl
  7. from ...conf.dynamicsettings import DynamicSettings
  8. from ...conftest import get_cache_versions
  9. from ...users.models import AnonymousUser
  10. from ..testproject.views import mock_custom_403_error_page, mock_custom_404_error_page
  11. from ..utils import encode_json_html
  12. class CSRFErrorViewTests(TestCase):
  13. def test_csrf_failure_is_handled(self):
  14. """csrf_failure error page has no show-stoppers"""
  15. csrf_client = Client(enforce_csrf_checks=True)
  16. response = csrf_client.post(reverse("misago:index"), data={"eric": "fish"})
  17. self.assertContains(response, "Request blocked", status_code=403)
  18. def test_ajax_csrf_failure_is_handled(self):
  19. """csrf_failure error ajax response has no show-stoppers"""
  20. csrf_client = Client(enforce_csrf_checks=True)
  21. response = csrf_client.post(
  22. reverse("misago:api:auth"),
  23. data={"eric": "fish"},
  24. HTTP_X_REQUESTED_WITH="XMLHttpRequest",
  25. )
  26. self.assertContains(response, "CSRF cookie", status_code=403)
  27. @override_settings(ROOT_URLCONF="misago.core.testproject.urls")
  28. class ErrorPageViewsTests(TestCase):
  29. def test_banned_returns_403(self):
  30. """banned error page has no show-stoppers"""
  31. response = self.client.get(reverse("raise-misago-banned"))
  32. self.assertContains(response, "misago:error-banned", status_code=403)
  33. self.assertContains(response, "<p>Banned for test!</p>", status_code=403)
  34. self.assertContains(
  35. response, encode_json_html("<p>Banned for test!</p>"), status_code=403
  36. )
  37. def test_permission_denied_returns_403(self):
  38. """permission_denied error page has no show-stoppers"""
  39. response = self.client.get(reverse("raise-misago-403"))
  40. self.assertContains(response, "misago:error-403", status_code=403)
  41. self.assertContains(response, "Page not available", status_code=403)
  42. def test_page_not_found_returns_404(self):
  43. """page_not_found error page has no show-stoppers"""
  44. response = self.client.get(reverse("raise-misago-404"))
  45. self.assertContains(response, "misago:error-404", status_code=404)
  46. self.assertContains(response, "Page not found", status_code=404)
  47. def test_not_allowed_returns_405(self):
  48. """not allowed error page has no showstoppers"""
  49. response = self.client.get(reverse("raise-misago-405"))
  50. self.assertContains(response, "misago:error-405", status_code=405)
  51. self.assertContains(response, "Wrong way", status_code=405)
  52. def test_social_auth_failed_returns_403(self):
  53. """social auth's failed error returns 403"""
  54. response = self.client.get(reverse("raise-social-auth-failed"))
  55. self.assertContains(response, "page-error-social", status_code=403)
  56. self.assertContains(response, "GitHub", status_code=403)
  57. def test_social_wrong_backend_returns_403(self):
  58. """social auth's wrong backend error returns 403"""
  59. response = self.client.get(reverse("raise-social-wrong-backend"))
  60. self.assertContains(response, "page-error-social", status_code=403)
  61. def test_social_not_allowed_to_disconnect_returns_403(self):
  62. """social auth's not allowed to disconnect error returns 403"""
  63. response = self.client.get(reverse("raise-social-not-allowed-to-disconnect"))
  64. self.assertContains(response, "page-error-social", status_code=403)
  65. def test_social_failed_message(self):
  66. """misago-specific social auth failed error page returns 403 with message"""
  67. response = self.client.get(reverse("raise-social-auth-failed-message"))
  68. self.assertContains(response, "page-error-social", status_code=403)
  69. self.assertContains(
  70. response, "This message will be shown to user!", status_code=403
  71. )
  72. def test_social_auth_banned(self):
  73. """misago-specific social auth banned error page returns 403 with ban message"""
  74. response = self.client.get(reverse("raise-social-auth-banned"))
  75. self.assertContains(response, "page-error-social", status_code=403)
  76. self.assertContains(response, "Banned in auth!", status_code=403)
  77. def create_request(url):
  78. request = RequestFactory().get(url)
  79. request.cache_versions = get_cache_versions()
  80. request.settings = DynamicSettings(request.cache_versions)
  81. request.user = AnonymousUser()
  82. request.user_acl = get_user_acl(request.user, request.cache_versions)
  83. request.include_frontend_context = True
  84. request.frontend_context = {}
  85. return request
  86. @override_settings(ROOT_URLCONF="misago.core.testproject.urlswitherrorhandlers")
  87. class CustomErrorPagesTests(TestCase):
  88. def setUp(self):
  89. self.misago_request = create_request(reverse("misago:index"))
  90. self.site_request = create_request(reverse("raise-403"))
  91. def test_shared_403_decorator(self):
  92. """shared_403_decorator calls correct error handler"""
  93. response = self.client.get(reverse("raise-misago-403"))
  94. self.assertEqual(response.status_code, 403)
  95. response = self.client.get(reverse("raise-403"))
  96. self.assertContains(response, "Custom 403", status_code=403)
  97. response = mock_custom_403_error_page(self.misago_request, PermissionDenied())
  98. self.assertNotContains(response, "Custom 403", status_code=403)
  99. response = mock_custom_403_error_page(self.site_request, PermissionDenied())
  100. self.assertContains(response, "Custom 403", status_code=403)
  101. def test_shared_404_decorator(self):
  102. """shared_404_decorator calls correct error handler"""
  103. response = self.client.get(reverse("raise-misago-404"))
  104. self.assertEqual(response.status_code, 404)
  105. response = self.client.get(reverse("raise-404"))
  106. self.assertContains(response, "Custom 404", status_code=404)
  107. response = mock_custom_404_error_page(self.misago_request, Http404())
  108. self.assertNotContains(response, "Custom 404", status_code=404)
  109. response = mock_custom_404_error_page(self.site_request, Http404())
  110. self.assertContains(response, "Custom 404", status_code=404)