test_admin_system_checks.py 7.8 KB

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