test_floodprotection_middleware.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. from datetime import timedelta
  2. import pytest
  3. from django.utils import timezone
  4. from ...conf.test import override_dynamic_settings
  5. from ..api.postingendpoint import PostingEndpoint, PostingInterrupt
  6. from ..api.postingendpoint.floodprotection import FloodProtectionMiddleware
  7. from ..test import post_thread
  8. default_acl = {"can_omit_flood_protection": False}
  9. can_omit_flood_acl = {"can_omit_flood_protection": True}
  10. def test_middleware_lets_users_first_post_through(dynamic_settings, user):
  11. user.update_fields = []
  12. middleware = FloodProtectionMiddleware(
  13. settings=dynamic_settings, user=user, user_acl=default_acl
  14. )
  15. middleware.interrupt_posting(None)
  16. def test_middleware_updates_users_last_post_datetime(dynamic_settings, user):
  17. user.update_fields = []
  18. middleware = FloodProtectionMiddleware(
  19. settings=dynamic_settings, user=user, user_acl=default_acl
  20. )
  21. middleware.interrupt_posting(None)
  22. assert user.last_posted_on
  23. assert "last_posted_on" in user.update_fields
  24. def test_middleware_interrupts_posting_because_previous_post_was_posted_too_recently(
  25. dynamic_settings, user
  26. ):
  27. user.last_posted_on = timezone.now()
  28. user.update_fields = []
  29. middleware = FloodProtectionMiddleware(
  30. mode=PostingEndpoint.START,
  31. settings=dynamic_settings,
  32. user=user,
  33. user_acl=default_acl,
  34. )
  35. assert middleware.use_this_middleware()
  36. with pytest.raises(PostingInterrupt):
  37. middleware.interrupt_posting(None)
  38. def test_middleware_lets_users_next_post_through_if_previous_post_is_not_recent(
  39. dynamic_settings, user
  40. ):
  41. user.last_posted_on = timezone.now() - timedelta(seconds=10)
  42. user.update_fields = []
  43. middleware = FloodProtectionMiddleware(
  44. mode=PostingEndpoint.START,
  45. settings=dynamic_settings,
  46. user=user,
  47. user_acl=default_acl,
  48. )
  49. assert middleware.use_this_middleware()
  50. middleware.interrupt_posting(None)
  51. def test_middleware_is_not_used_if_user_has_permission_to_omit_flood_protection(
  52. dynamic_settings, user
  53. ):
  54. user.last_posted_on = timezone.now()
  55. user.update_fields = []
  56. middleware = FloodProtectionMiddleware(
  57. mode=PostingEndpoint.START,
  58. settings=dynamic_settings,
  59. user=user,
  60. user_acl=can_omit_flood_acl,
  61. )
  62. assert not middleware.use_this_middleware()
  63. def test_middleware_is_not_used_if_user_edits_post(dynamic_settings, user):
  64. middleware = FloodProtectionMiddleware(
  65. mode=PostingEndpoint.EDIT,
  66. settings=dynamic_settings,
  67. user=user,
  68. user_acl=can_omit_flood_acl,
  69. )
  70. assert not middleware.use_this_middleware()
  71. @override_dynamic_settings(hourly_post_limit=3)
  72. def test_middleware_interrupts_posting_if_hourly_limit_was_met(
  73. default_category, dynamic_settings, user
  74. ):
  75. user.update_fields = []
  76. for _ in range(3):
  77. post_thread(default_category, poster=user)
  78. middleware = FloodProtectionMiddleware(
  79. mode=PostingEndpoint.START,
  80. settings=dynamic_settings,
  81. user=user,
  82. user_acl=default_acl,
  83. )
  84. assert middleware.use_this_middleware()
  85. with pytest.raises(PostingInterrupt):
  86. middleware.interrupt_posting(None)
  87. @override_dynamic_settings(hourly_post_limit=0)
  88. def test_old_posts_dont_count_to_hourly_limit(default_category, dynamic_settings, user):
  89. user.update_fields = []
  90. for _ in range(3):
  91. post_thread(
  92. default_category,
  93. poster=user,
  94. started_on=timezone.now() - timedelta(hours=1),
  95. )
  96. middleware = FloodProtectionMiddleware(
  97. mode=PostingEndpoint.START,
  98. settings=dynamic_settings,
  99. user=user,
  100. user_acl=default_acl,
  101. )
  102. middleware.interrupt_posting(None)
  103. @override_dynamic_settings(hourly_post_limit=0)
  104. def test_middleware_lets_post_through_if_hourly_limit_was_disabled(
  105. default_category, dynamic_settings, user
  106. ):
  107. user.update_fields = []
  108. for _ in range(3):
  109. post_thread(default_category, poster=user)
  110. middleware = FloodProtectionMiddleware(
  111. mode=PostingEndpoint.START,
  112. settings=dynamic_settings,
  113. user=user,
  114. user_acl=default_acl,
  115. )
  116. middleware.interrupt_posting(None)
  117. @override_dynamic_settings(daily_post_limit=3)
  118. def test_middleware_interrupts_posting_if_daily_limit_was_met(
  119. default_category, dynamic_settings, user
  120. ):
  121. user.update_fields = []
  122. for _ in range(3):
  123. post_thread(default_category, poster=user)
  124. middleware = FloodProtectionMiddleware(
  125. mode=PostingEndpoint.START,
  126. settings=dynamic_settings,
  127. user=user,
  128. user_acl=default_acl,
  129. )
  130. assert middleware.use_this_middleware()
  131. with pytest.raises(PostingInterrupt):
  132. middleware.interrupt_posting(None)
  133. @override_dynamic_settings(daily_post_limit=0)
  134. def test_old_posts_dont_count_to_daily_limit(default_category, dynamic_settings, user):
  135. user.update_fields = []
  136. for _ in range(3):
  137. post_thread(
  138. default_category, poster=user, started_on=timezone.now() - timedelta(days=1)
  139. )
  140. middleware = FloodProtectionMiddleware(
  141. mode=PostingEndpoint.START,
  142. settings=dynamic_settings,
  143. user=user,
  144. user_acl=default_acl,
  145. )
  146. middleware.interrupt_posting(None)
  147. @override_dynamic_settings(daily_post_limit=0)
  148. def test_middleware_lets_post_through_if_daily_limit_was_disabled(
  149. default_category, dynamic_settings, user
  150. ):
  151. user.update_fields = []
  152. for _ in range(3):
  153. post_thread(default_category, poster=user)
  154. middleware = FloodProtectionMiddleware(
  155. mode=PostingEndpoint.START,
  156. settings=dynamic_settings,
  157. user=user,
  158. user_acl=default_acl,
  159. )
  160. middleware.interrupt_posting(None)