test_readtracker.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. from datetime import timedelta
  2. from django.contrib.auth import get_user_model
  3. from django.test import TestCase
  4. from django.utils import timezone
  5. from misago.acl import add_acl
  6. from misago.forums.models import Forum
  7. from misago.threads.models import Thread, Post
  8. from misago.users.models import AnonymousUser
  9. from misago.readtracker import forumstracker, threadstracker
  10. from misago.readtracker.dates import cutoff_date
  11. class ReadTrackerTests(TestCase):
  12. def setUp(self):
  13. self.forums = [f for f in Forum.objects.filter(role="forum")[:1]]
  14. self.forum = self.forums[0]
  15. User = get_user_model()
  16. self.user = User.objects.create_user("Bob", "bob@test.com", "Pass.123")
  17. self.anon = AnonymousUser()
  18. def post_thread(self, datetime):
  19. thread = Thread.objects.create(
  20. forum=self.forum,
  21. weight=0,
  22. started_on=datetime,
  23. starter_name='Tester',
  24. starter_slug='tester',
  25. last_post_on=datetime,
  26. last_poster_name='Tester',
  27. last_poster_slug='tester')
  28. self.forum.synchronize()
  29. self.forum.save()
  30. return thread
  31. class ForumsTrackerTests(ReadTrackerTests):
  32. def test_anon_empty_forum_read(self):
  33. """anon users content is always read"""
  34. forumstracker.make_read_aware(self.anon, self.forums)
  35. self.assertIsNone(self.forum.last_post_on)
  36. self.assertTrue(self.forum.is_read)
  37. def test_anon_forum_with_recent_reply_read(self):
  38. """anon users content is always read"""
  39. forumstracker.make_read_aware(self.anon, self.forums)
  40. self.forum.last_post_on = timezone.now()
  41. self.assertTrue(self.forum.is_read)
  42. def test_empty_forum_is_read(self):
  43. """empty forum is read for signed in user"""
  44. forumstracker.make_read_aware(self.user, self.forums)
  45. self.assertTrue(self.forum.is_read)
  46. def test_make_read_aware_sets_read_flag_for_empty_forum(self):
  47. """make_read_aware sets read flag on empty forum"""
  48. forumstracker.make_read_aware(self.anon, self.forums)
  49. self.assertTrue(self.forum.is_read)
  50. forumstracker.make_read_aware(self.user, self.forums)
  51. self.assertTrue(self.forum.is_read)
  52. def test_make_read_aware_sets_read_flag_for_forum_with_old_thread(self):
  53. """make_read_aware sets read flag on forum with old thread"""
  54. self.forum.last_post_on = cutoff_date() - timedelta(days=1)
  55. forumstracker.make_read_aware(self.user, self.forums)
  56. self.assertTrue(self.forum.is_read)
  57. def test_make_read_aware_sets_unread_flag_for_forum_with_new_thread(self):
  58. """make_read_aware sets unread flag on forum with new thread"""
  59. self.forum.last_post_on = cutoff_date() + timedelta(days=1)
  60. forumstracker.make_read_aware(self.user, self.forums)
  61. self.assertFalse(self.forum.is_read)
  62. def test_sync_record_for_empty_forum(self):
  63. """sync_record sets read flag on empty forum"""
  64. add_acl(self.user, self.forums)
  65. forumstracker.sync_record(self.user, self.forum)
  66. self.user.forumread_set.get(forum=self.forum)
  67. forumstracker.make_read_aware(self.user, self.forums)
  68. self.assertTrue(self.forum.is_read)
  69. def test_sync_record_for_forum_with_old_thread_and_reply(self):
  70. """
  71. sync_record sets read flag on forum with old thread,
  72. then changes flag to unread when new reply is posted
  73. """
  74. self.post_thread(cutoff_date() - timedelta(days=1))
  75. add_acl(self.user, self.forums)
  76. forumstracker.sync_record(self.user, self.forum)
  77. self.user.forumread_set.get(forum=self.forum)
  78. forumstracker.make_read_aware(self.user, self.forums)
  79. self.assertTrue(self.forum.is_read)
  80. thread = self.post_thread(cutoff_date() + timedelta(days=1))
  81. forumstracker.sync_record(self.user, self.forum)
  82. forumstracker.make_read_aware(self.user, self.forums)
  83. self.assertFalse(self.forum.is_read)
  84. def test_sync_record_for_forum_with_new_thread(self):
  85. """
  86. sync_record sets read flag on forum with old thread,
  87. then keeps flag to unread when new reply is posted
  88. """
  89. self.post_thread(cutoff_date() + timedelta(days=1))
  90. add_acl(self.user, self.forums)
  91. forumstracker.sync_record(self.user, self.forum)
  92. self.user.forumread_set.get(forum=self.forum)
  93. forumstracker.make_read_aware(self.user, self.forums)
  94. self.assertFalse(self.forum.is_read)
  95. self.post_thread(cutoff_date() + timedelta(days=1))
  96. forumstracker.sync_record(self.user, self.forum)
  97. forumstracker.make_read_aware(self.user, self.forums)
  98. self.assertFalse(self.forum.is_read)
  99. def test_sync_record_for_forum_with_deleted_threads(self):
  100. """unread forum reverts to read after its emptied"""
  101. self.post_thread(cutoff_date() + timedelta(days=1))
  102. self.post_thread(cutoff_date() + timedelta(days=1))
  103. self.post_thread(cutoff_date() + timedelta(days=1))
  104. add_acl(self.user, self.forums)
  105. forumstracker.sync_record(self.user, self.forum)
  106. forumstracker.make_read_aware(self.user, self.forums)
  107. self.assertFalse(self.forum.is_read)
  108. self.forum.thread_set.all().delete()
  109. self.forum.synchronize()
  110. self.forum.save()
  111. forumstracker.make_read_aware(self.user, self.forums)
  112. self.assertTrue(self.forum.is_read)
  113. def test_sync_record_for_forum_with_many_threads(self):
  114. """sync_record sets unread flag on forum with many threads"""
  115. self.post_thread(cutoff_date() + timedelta(days=1))
  116. self.post_thread(cutoff_date() - timedelta(days=1))
  117. self.post_thread(cutoff_date() + timedelta(days=1))
  118. self.post_thread(cutoff_date() - timedelta(days=1))
  119. add_acl(self.user, self.forums)
  120. forumstracker.sync_record(self.user, self.forum)
  121. self.user.forumread_set.get(forum=self.forum)
  122. forumstracker.make_read_aware(self.user, self.forums)
  123. self.assertFalse(self.forum.is_read)
  124. self.post_thread(cutoff_date() + timedelta(days=1))
  125. forumstracker.sync_record(self.user, self.forum)
  126. forumstracker.make_read_aware(self.user, self.forums)
  127. self.assertFalse(self.forum.is_read)