test_admin_system_checks.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. from datetime import timedelta
  2. from unittest.mock import Mock
  3. import pytest
  4. from django.contrib.auth import get_user_model
  5. from django.test import override_settings
  6. from django.urls import reverse
  7. from django.utils import timezone
  8. from ...conf.test import override_dynamic_settings
  9. from ...test import assert_contains
  10. from ...users.datadownloads import request_user_data_download
  11. from ...users.models import DataDownload
  12. from ...users.test import create_test_user
  13. from ..views.index import (
  14. check_cache,
  15. check_data_downloads,
  16. check_debug_status,
  17. check_forum_address,
  18. check_https,
  19. check_inactive_users,
  20. )
  21. User = get_user_model()
  22. admin_link = reverse("misago:admin:index")
  23. def test_cache_check_passess_if_cache_can_be_read_after_setting(mocker):
  24. mocker.patch("misago.admin.views.index.cache.set")
  25. mocker.patch("misago.admin.views.index.cache.get", return_value="ok")
  26. assert check_cache() == {"is_ok": True}
  27. def test_cache_check_passess_if_cache_cant_be_read_after_setting(mocker):
  28. mocker.patch("misago.admin.views.index.cache.set")
  29. mocker.patch("misago.admin.views.index.cache.get", return_value=None)
  30. assert check_cache() == {"is_ok": False}
  31. def test_warning_about_disabled_cache_is_displayed_on_checks_list(mocker, admin_client):
  32. mocker.patch("misago.admin.views.index.check_cache", return_value={"is_ok": False})
  33. response = admin_client.get(admin_link)
  34. assert_contains(response, "Cache is disabled")
  35. def test_data_downloads_processing_check_passes_if_there_are_no_data_downloads(db):
  36. assert check_data_downloads() == {"is_ok": True, "count": 0}
  37. def test_ready_data_downloads_are_excluded_by_check(user):
  38. data_download = request_user_data_download(user)
  39. data_download.status = DataDownload.STATUS_READY
  40. data_download.save()
  41. assert check_data_downloads() == {"is_ok": True, "count": 0}
  42. def test_expired_data_downloads_are_excluded_by_check(user):
  43. data_download = request_user_data_download(user)
  44. data_download.status = DataDownload.STATUS_EXPIRED
  45. data_download.save()
  46. assert check_data_downloads() == {"is_ok": True, "count": 0}
  47. def test_recent_pending_data_downloads_are_excluded_by_check(user):
  48. data_download = request_user_data_download(user)
  49. data_download.status = DataDownload.STATUS_PENDING
  50. data_download.save()
  51. assert check_data_downloads() == {"is_ok": True, "count": 0}
  52. def test_recent_processing_data_downloads_are_excluded_by_check(user):
  53. data_download = request_user_data_download(user)
  54. data_download.status = DataDownload.STATUS_PROCESSING
  55. data_download.save()
  56. assert check_data_downloads() == {"is_ok": True, "count": 0}
  57. def test_check_fails_if_there_are_old_processing_data_downloads(user):
  58. data_download = request_user_data_download(user)
  59. data_download.status = DataDownload.STATUS_PROCESSING
  60. data_download.requested_on = timezone.now() - timedelta(days=5)
  61. data_download.save()
  62. assert check_data_downloads() == {"is_ok": False, "count": 1}
  63. def test_check_fails_if_there_are_old_pending_data_downloads(user):
  64. data_download = request_user_data_download(user)
  65. data_download.status = DataDownload.STATUS_PENDING
  66. data_download.requested_on = timezone.now() - timedelta(days=5)
  67. data_download.save()
  68. assert check_data_downloads() == {"is_ok": False, "count": 1}
  69. def test_warning_about_unprocessed_data_downloads_is_displayed_on_checks_list(
  70. admin_client, user
  71. ):
  72. data_download = request_user_data_download(user)
  73. data_download.status = DataDownload.STATUS_PENDING
  74. data_download.requested_on = timezone.now() - timedelta(days=5)
  75. data_download.save()
  76. response = admin_client.get(admin_link)
  77. assert_contains(response, "There is 1 unprocessed data download request")
  78. class RequestMock:
  79. absolute_uri = "https://misago-project.org/somewhere/"
  80. def __init__(self, settings):
  81. self.settings = settings
  82. def build_absolute_uri(self, location):
  83. assert location == "/"
  84. return self.absolute_uri
  85. @pytest.fixture
  86. def request_mock(dynamic_settings):
  87. return RequestMock(dynamic_settings)
  88. incorrect_address = "http://somewhere.com"
  89. correct_address = RequestMock.absolute_uri
  90. @override_dynamic_settings(forum_address=None)
  91. def test_forum_address_check_handles_setting_not_configured(request_mock):
  92. result = check_forum_address(request_mock)
  93. assert result == {
  94. "is_ok": False,
  95. "set_address": None,
  96. "correct_address": request_mock.absolute_uri,
  97. }
  98. @override_dynamic_settings(forum_address=incorrect_address)
  99. def test_forum_address_check_detects_invalid_address_configuration(request_mock):
  100. result = check_forum_address(request_mock)
  101. assert result == {
  102. "is_ok": False,
  103. "set_address": incorrect_address,
  104. "correct_address": request_mock.absolute_uri,
  105. }
  106. @override_dynamic_settings(forum_address=correct_address)
  107. def test_forum_address_check_detects_valid_address_configuration(request_mock):
  108. result = check_forum_address(request_mock)
  109. assert result == {
  110. "is_ok": True,
  111. "set_address": correct_address,
  112. "correct_address": request_mock.absolute_uri,
  113. }
  114. @override_dynamic_settings(forum_address=None)
  115. def test_warning_about_unset_forum_address_is_displayed_on_checks_list(admin_client):
  116. response = admin_client.get(admin_link)
  117. assert_contains(response, "address")
  118. @override_dynamic_settings(forum_address=incorrect_address)
  119. def test_warning_about_incorrect_forum_address_is_displayed_on_checks_list(
  120. admin_client
  121. ):
  122. response = admin_client.get(admin_link)
  123. assert_contains(response, "address")
  124. @override_settings(DEBUG=False)
  125. def test_debug_check_passess_if_debug_is_disabled():
  126. assert check_debug_status() == {"is_ok": True}
  127. @override_settings(DEBUG=True)
  128. def test_debug_check_fails_if_debug_is_enabled():
  129. assert check_debug_status() == {"is_ok": False}
  130. @override_settings(DEBUG=True)
  131. def test_warning_about_enabled_debug_is_displayed_on_checks_list(admin_client):
  132. response = admin_client.get(admin_link)
  133. assert_contains(response, "site is running in DEBUG mode")
  134. def test_https_check_passes_if_site_is_accessed_over_https():
  135. request = Mock(is_secure=Mock(return_value=True))
  136. assert check_https(request) == {"is_ok": True}
  137. def test_https_check_fails_if_site_is_accessed_without_https(mocker):
  138. request = Mock(is_secure=Mock(return_value=False))
  139. assert check_https(request) == {"is_ok": False}
  140. def test_warning_about_accessing_site_without_https_is_displayed_on_checks_list(
  141. admin_client
  142. ):
  143. response = admin_client.get(admin_link)
  144. assert_contains(response, "site is not running over HTTPS")
  145. def test_inactive_users_check_passess_if_there_are_no_inactive_users(db):
  146. assert check_inactive_users() == {"is_ok": True, "count": 0}
  147. def test_inactive_users_check_passess_if_there_are_less_than_eleven_inactive_users(db):
  148. for i in range(10):
  149. create_test_user(
  150. "User%s" % i,
  151. "user%s@example.com" % i,
  152. requires_activation=User.ACTIVATION_USER,
  153. )
  154. assert check_inactive_users() == {"is_ok": True, "count": 10}
  155. def test_inactive_users_check_fails_if_there_are_more_than_ten_inactive_users(db):
  156. for i in range(11):
  157. create_test_user(
  158. "User%s" % i,
  159. "user%s@example.com" % i,
  160. requires_activation=User.ACTIVATION_USER,
  161. )
  162. assert check_inactive_users() == {"is_ok": False, "count": 11}
  163. def test_warning_about_inactive_users_is_displayed_on_checks_list(admin_client):
  164. for i in range(11):
  165. create_test_user(
  166. "User%s" % i,
  167. "user%s@example.com" % i,
  168. requires_activation=User.ACTIVATION_USER,
  169. )
  170. response = admin_client.get(admin_link)
  171. assert_contains(response, "There are 11 inactive users accounts")