Browse Source

fix #910: handle readtracker data on threads and posts move/split/merge

Rafał Pitoń 7 years ago
parent
commit
686c456fd9

+ 29 - 0
misago/threads/tests/test_thread_merge_api.py

@@ -2,6 +2,7 @@ from django.urls import reverse
 
 from misago.acl.testutils import override_acl
 from misago.categories.models import Category
+from misago.readtracker import poststracker
 from misago.threads import testutils
 from misago.threads.models import Poll, PollVote, Thread
 
@@ -293,6 +294,34 @@ class ThreadMergeApiTests(ThreadsApiTestCase):
         with self.assertRaises(Thread.DoesNotExist):
             Thread.objects.get(pk=self.thread.pk)
 
+    def test_merge_threads_keep_Reads(self):
+        """api keeps both threads readtrackers after merge"""
+        self.override_acl({'can_merge_threads': 1})
+
+        self.override_other_acl({'can_merge_threads': 1})
+
+        other_thread = testutils.post_thread(self.category_b)
+
+        poststracker.save_read(self.user, self.thread.first_post)
+        poststracker.save_read(self.user, other_thread.first_post)
+
+        response = self.client.post(
+            self.api_link, {
+                'other_thread': other_thread.get_absolute_url(),
+            }
+        )
+        self.assertContains(response, other_thread.get_absolute_url(), status_code=200)
+
+        # posts reads are kept
+        postread_set = self.user.postread_set.order_by('post_id')
+
+        self.assertEqual(
+            list(postread_set.values_list('post_id', flat=True)),
+            [self.thread.first_post_id, other_thread.first_post_id]
+        )
+        self.assertEqual(postread_set.filter(thread=other_thread).count(), 2)
+        self.assertEqual(postread_set.filter(category=self.category_b).count(), 2)
+
     def test_merge_threads_kept_poll(self):
         """api merges two threads successfully, keeping poll from old thread"""
         self.override_acl({'can_merge_threads': 1})

+ 14 - 0
misago/threads/tests/test_threads_merge_api.py

@@ -5,6 +5,7 @@ from django.urls import reverse
 from misago.acl import add_acl
 from misago.acl.testutils import override_acl
 from misago.categories.models import Category
+from misago.readtracker import poststracker
 from misago.threads import testutils
 from misago.threads.serializers.moderation import THREADS_LIMIT
 from misago.threads.models import Poll, PollVote, Post, Thread
@@ -731,6 +732,9 @@ class ThreadsMergeApiTests(ThreadsApiTestCase):
 
         thread = testutils.post_thread(category=self.category)
 
+        poststracker.save_read(self.user, self.thread.first_post)
+        poststracker.save_read(self.user, thread.first_post)
+
         response = self.client.post(
             self.api_link,
             json.dumps({
@@ -768,6 +772,16 @@ class ThreadsMergeApiTests(ThreadsApiTestCase):
         # are old threads gone?
         self.assertEqual([t.pk for t in Thread.objects.all()], [new_thread.pk])
 
+        # posts reads are kept
+        postread_set = self.user.postread_set.order_by('post_id')
+
+        self.assertEqual(
+            list(postread_set.values_list('post_id', flat=True)),
+            [self.thread.first_post_id, thread.first_post_id]
+        )
+        self.assertEqual(postread_set.filter(thread=new_thread).count(), 2)
+        self.assertEqual(postread_set.filter(category=self.category).count(), 2)
+
     def test_merge_threads_kept_poll(self):
         """api merges two threads successfully, keeping poll from old thread"""
         self.override_acl({'can_merge_threads': True})