test_counters.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. from datetime import timedelta
  2. from time import time
  3. from django.core.urlresolvers import reverse
  4. from django.utils import timezone
  5. from django.utils.translation import ugettext as _
  6. from misago.forums.models import Forum
  7. from misago.readtracker.models import ThreadRead
  8. from misago.users.testutils import AuthenticatedUserTestCase
  9. from misago.threads.counts import (NewThreadsCount,
  10. sync_user_unread_private_threads_count)
  11. from misago.threads import testutils
  12. class TestNewThreadsCount(AuthenticatedUserTestCase):
  13. def setUp(self):
  14. super(TestNewThreadsCount, self).setUp()
  15. self.forum = Forum.objects.all_forums().filter(role="forum")[:1][0]
  16. def test_cast_to_int(self):
  17. """counter is castable to int"""
  18. counter = NewThreadsCount(self.user, {})
  19. self.assertEqual(int(counter), 0)
  20. threads = [testutils.post_thread(self.forum) for t in xrange(42)]
  21. counter = NewThreadsCount(self.user, {})
  22. self.assertEqual(int(counter), 42)
  23. def test_cast_to_bool(self):
  24. """counter is castable to bool"""
  25. counter = NewThreadsCount(self.user, {})
  26. self.assertFalse(counter)
  27. threads = [testutils.post_thread(self.forum) for t in xrange(42)]
  28. counter = NewThreadsCount(self.user, {})
  29. self.assertTrue(counter)
  30. def test_is_cache_valid(self):
  31. """is_cache_valid returns valid value for different caches"""
  32. counter = NewThreadsCount(self.user, {})
  33. self.assertTrue(counter.is_cache_valid({
  34. 'expires': time() + 15,
  35. 'user': self.user.pk
  36. }))
  37. self.assertFalse(counter.is_cache_valid({
  38. 'expires': time() - 15,
  39. 'user': self.user.pk
  40. }))
  41. self.assertFalse(counter.is_cache_valid({
  42. 'expires': time() + 15,
  43. 'user': self.user.pk + 1
  44. }))
  45. def test_get_expiration_timestamp(self):
  46. """get_expiration_timestamp returns greater time than current one"""
  47. counter = NewThreadsCount(self.user, {})
  48. self.assertTrue(counter.get_expiration_timestamp() > time())
  49. def test_get_current_count_dict(self):
  50. """get_current_count_dict returns valid count of new threads"""
  51. counter = NewThreadsCount(self.user, {})
  52. self.assertEqual(counter.count, 0)
  53. self.assertEqual(counter.get_current_count_dict()['threads'], 0)
  54. # create 10 new threads
  55. threads = [testutils.post_thread(self.forum) for t in xrange(10)]
  56. self.assertEqual(counter.get_current_count_dict()['threads'], 10)
  57. # create new counter
  58. counter = NewThreadsCount(self.user, {})
  59. self.assertEqual(counter.count, 10)
  60. self.assertEqual(counter.get_current_count_dict()['threads'], 10)
  61. def test_set(self):
  62. """set allows for changing count of threads"""
  63. session = {}
  64. counter = NewThreadsCount(self.user, session)
  65. counter.set(128)
  66. self.assertEqual(int(counter), 128)
  67. self.assertEqual(session[counter.name]['threads'], 128)
  68. def test_decrease(self):
  69. """decrease is not allowing for negative threads counts"""
  70. session = {}
  71. counter = NewThreadsCount(self.user, session)
  72. counter.set(128)
  73. counter.decrease()
  74. self.assertEqual(int(counter), 127)
  75. self.assertEqual(session[counter.name]['threads'], 127)
  76. def test_decrease_zero(self):
  77. """decrease is not allowing for negative threads counts"""
  78. session = {}
  79. counter = NewThreadsCount(self.user, session)
  80. counter.decrease()
  81. self.assertEqual(int(counter), 0)
  82. self.assertEqual(session[counter.name]['threads'], 0)
  83. class TestSyncUnreadPrivateThreadsCount(AuthenticatedUserTestCase):
  84. def setUp(self):
  85. super(TestSyncUnreadPrivateThreadsCount, self).setUp()
  86. self.forum = Forum.objects.private_threads()
  87. self.user.sync_unread_private_threads = True
  88. def test_user_with_no_threads(self):
  89. """user with no private threads has 0 unread threads"""
  90. for i in range(5):
  91. # post 5 invisible threads
  92. testutils.post_thread(
  93. self.forum, started_on=timezone.now() - timedelta(days=2))
  94. sync_user_unread_private_threads_count(self.user)
  95. self.assertEqual(self.user.unread_private_threads, 0)
  96. def test_user_with_new_thread(self):
  97. """user has one new private thred"""
  98. for i in range(5):
  99. # post 5 invisible threads
  100. testutils.post_thread(
  101. self.forum, started_on=timezone.now() - timedelta(days=2))
  102. thread = testutils.post_thread(
  103. self.forum, started_on=timezone.now() - timedelta(days=2))
  104. thread.threadparticipant_set.create(user=self.user)
  105. sync_user_unread_private_threads_count(self.user)
  106. self.assertEqual(self.user.unread_private_threads, 1)
  107. def test_user_with_new_thread(self):
  108. """user has one unread private thred"""
  109. for i in range(5):
  110. # post 5 invisible threads
  111. testutils.post_thread(
  112. self.forum, started_on=timezone.now() - timedelta(days=2))
  113. thread = testutils.post_thread(
  114. self.forum, started_on=timezone.now() - timedelta(days=2))
  115. thread.threadparticipant_set.create(user=self.user)
  116. ThreadRead.objects.create(
  117. user=self.user,
  118. forum=self.forum,
  119. thread=thread,
  120. last_read_on=timezone.now() - timedelta(days=3))
  121. sync_user_unread_private_threads_count(self.user)
  122. self.assertEqual(self.user.unread_private_threads, 1)