Browse Source

#410: tests for goto views

Rafał Pitoń 10 years ago
parent
commit
2662a2b3e8

+ 0 - 1
misago/threads/goto.py

@@ -115,7 +115,6 @@ def moderated(user, thread):
     try:
     try:
         first_moderated = qs.filter(is_moderated=True)[:1][0]
         first_moderated = qs.filter(is_moderated=True)[:1][0]
     except IndexError:
     except IndexError:
-        raise Exception('blam!')
         return last(user, thread)
         return last(user, thread)
 
 
     return get_post_link(posts, qs, thread, first_moderated)
     return get_post_link(posts, qs, thread, first_moderated)

+ 14 - 7
misago/threads/models/post.py

@@ -37,6 +37,13 @@ class Post(models.Model):
     def __unicode__(self):
     def __unicode__(self):
         return '%s...' % self.original[10:].strip()
         return '%s...' % self.original[10:].strip()
 
 
+    def get_absolute_url(self):
+        return reverse(self.thread.get_url_name('post'), kwargs={
+            'thread_slug': self.thread.slug,
+            'thread_id': self.thread.id,
+            'post_id': self.id
+        })
+
     def delete(self, *args, **kwargs):
     def delete(self, *args, **kwargs):
         from misago.threads.signals import delete_post
         from misago.threads.signals import delete_post
         delete_post.send(sender=self)
         delete_post.send(sender=self)
@@ -72,6 +79,13 @@ class Post(models.Model):
         self.thread = new_thread
         self.thread = new_thread
         move_post.send(sender=self)
         move_post.send(sender=self)
 
 
+    def get_absolute_url(self):
+        return reverse(self.thread.get_url_name('post'), kwargs={
+            'thread_slug': self.thread.slug,
+            'thread_id': self.thread.id,
+            'post_id': self.id
+        })
+
     @property
     @property
     def short(self):
     def short(self):
         if self.is_valid:
         if self.is_valid:
@@ -85,10 +99,3 @@ class Post(models.Model):
     @property
     @property
     def is_valid(self):
     def is_valid(self):
         return is_post_valid(self)
         return is_post_valid(self)
-
-    def get_absolute_url(self):
-        return reverse(self.thread.get_url_name('post'), kwargs={
-            'thread_slug': self.thread.slug,
-            'thread_id': self.thread.id,
-            'post_id': self.id
-        })

+ 6 - 5
misago/threads/permissions.py

@@ -382,10 +382,11 @@ def can_change_owned_thread(user, target):
 
 
 
 
 def allow_see_post(user, target):
 def allow_see_post(user, target):
-    forum_acl = user.acl['forums'].get(target.forum_id, {})
-    if not forum_acl.get('can_review_moderated_content'):
-        if user.is_anonymous() or user.pk != target.poster_id:
-            raise Http404()
+    if target.is_moderated:
+        forum_acl = user.acl['forums'].get(target.forum_id, {})
+        if not forum_acl.get('can_review_moderated_content'):
+            if user.is_anonymous() or user.pk != target.poster_id:
+                raise Http404()
 can_see_post = return_boolean(allow_see_post)
 can_see_post = return_boolean(allow_see_post)
 
 
 
 
@@ -477,7 +478,7 @@ def exclude_invisible_posts(queryset, user, forum):
             condition_author = Q(poster=user.id)
             condition_author = Q(poster=user.id)
             condition = Q(is_moderated=False)
             condition = Q(is_moderated=False)
             queryset = queryset.filter(condition_author | condition)
             queryset = queryset.filter(condition_author | condition)
-        elif not forum.acl['can_review_moderated_content']:
+        else:
             queryset = queryset.filter(is_moderated=False)
             queryset = queryset.filter(is_moderated=False)
 
 
     return queryset
     return queryset

+ 0 - 2
misago/threads/tests/test_goto.py

@@ -134,7 +134,6 @@ class GotoTests(AuthenticatedUserTestCase):
 
 
         # add reported post
         # add reported post
         reported_post = reply_thread(self.thread, is_reported=True)
         reported_post = reply_thread(self.thread, is_reported=True)
-        self.thread.has_reported_posts = True
 
 
         # add 24 posts
         # add 24 posts
         [reply_thread(self.thread) for p in xrange(24)]
         [reply_thread(self.thread) for p in xrange(24)]
@@ -166,7 +165,6 @@ class GotoTests(AuthenticatedUserTestCase):
 
 
         # add moderated post
         # add moderated post
         moderated_post = reply_thread(self.thread, is_moderated=True)
         moderated_post = reply_thread(self.thread, is_moderated=True)
-        self.thread.has_moderated_posts = True
 
 
         # add 24 posts
         # add 24 posts
         [reply_thread(self.thread) for p in xrange(24)]
         [reply_thread(self.thread) for p in xrange(24)]

+ 118 - 0
misago/threads/tests/test_goto_views.py

@@ -0,0 +1,118 @@
+from misago.acl import add_acl
+from misago.acl.testutils import override_acl
+from misago.forums.models import Forum
+from misago.users.testutils import AuthenticatedUserTestCase
+
+from misago.threads import goto
+from misago.threads.testutils import post_thread, reply_thread
+
+
+class GotoViewsTests(AuthenticatedUserTestCase):
+    def setUp(self):
+        super(GotoViewsTests, self).setUp()
+
+        self.forum = Forum.objects.all_forums().filter(role="forum")[:1][0]
+        self.forum.labels = []
+
+        self.thread = post_thread(self.forum)
+        add_acl(self.user, self.forum)
+        add_acl(self.user, self.thread)
+
+    def override_acl(self, new_acl):
+        new_acl.update({'can_see': True, 'can_browse': True})
+
+        forums_acl = self.user.acl
+        forums_acl['visible_forums'].append(self.forum.pk)
+        forums_acl['forums'][self.forum.pk].update(new_acl)
+        override_acl(self.user, forums_acl)
+
+    def test_goto_last(self):
+        """thread_last link points to last post in thread"""
+        response = self.client.get(self.thread.get_last_reply_url())
+        self.assertEqual(response.status_code, 302)
+        self.assertTrue(
+            response['location'].endswith(goto.last(self.user, self.thread)))
+
+        # add 36 posts to thread
+        [reply_thread(self.thread) for p in xrange(36)]
+
+        response = self.client.get(self.thread.get_last_reply_url())
+        self.assertEqual(response.status_code, 302)
+        self.assertTrue(
+            response['location'].endswith(goto.last(self.user, self.thread)))
+
+    def test_goto_new(self):
+        """thread_new link points to first unread post in thread"""
+        # add 32 posts to thread
+        [reply_thread(self.thread) for p in xrange(32)]
+
+        # read thread
+        response = self.client.get(self.thread.get_last_reply_url())
+        response = self.client.get(response['location'])
+
+        # add unread posts
+        unread_post = reply_thread(self.thread)
+        [reply_thread(self.thread) for p in xrange(32)]
+
+        unread_post_link = goto.new(self.user, self.thread)
+
+        response = self.client.get(self.thread.get_new_reply_url())
+        self.assertEqual(response.status_code, 302)
+        self.assertTrue(response['location'].endswith(unread_post_link))
+
+    def test_goto_reported(self):
+        """thread_reported link points to first reported post in thread"""
+        # add 32 posts to thread
+        [reply_thread(self.thread) for p in xrange(32)]
+
+        # add reported post to thread
+        reported_post = reply_thread(self.thread, is_reported=True)
+
+        # add 32 more posts to thread
+        [reply_thread(self.thread) for p in xrange(32)]
+
+        # see reported post link
+        self.override_acl({'can_see_reports': 1})
+        reported_post_link = goto.post(self.user, self.thread, reported_post)
+
+        self.override_acl({'can_see_reports': 1})
+        response = self.client.get(self.thread.get_reported_reply_url())
+        self.assertEqual(response.status_code, 302)
+        self.assertTrue(response['location'].endswith(reported_post_link))
+
+    def test_goto_moderated(self):
+        """thread_moderated link points to first moderated post in thread"""
+        # add 32 posts to thread
+        [reply_thread(self.thread) for p in xrange(32)]
+
+        # add moderated post to thread
+        moderated_post = reply_thread(self.thread, is_moderated=True)
+
+        # add 32 more posts to thread
+        [reply_thread(self.thread) for p in xrange(32)]
+
+        # see moderated post link
+        self.override_acl({'can_review_moderated_content': 1})
+        moderated_post_link = goto.post(self.user, self.thread, moderated_post)
+
+        response = self.client.get(self.thread.get_moderated_reply_url())
+        self.assertEqual(response.status_code, 302)
+        self.assertTrue(response['location'].endswith(moderated_post_link))
+
+    def test_goto_post(self):
+        """thread_post link points to specific post in thread"""
+        # add 32 posts to thread
+        [reply_thread(self.thread) for p in xrange(32)]
+
+        # add target post to thread
+        target_post = reply_thread(self.thread)
+
+        # add 32 more posts to thread
+        [reply_thread(self.thread) for p in xrange(32)]
+
+        # see post link
+        post_link = goto.post(self.user, self.thread, target_post)
+
+        response = self.client.get(target_post.get_absolute_url())
+        self.assertEqual(response.status_code, 302)
+        self.assertTrue(response['location'].endswith(post_link))

+ 4 - 3
misago/threads/urls.py

@@ -15,14 +15,15 @@ urlpatterns = patterns('',
 
 
 
 
 from misago.threads.views.threads import (ThreadView, GotoLastView,
 from misago.threads.views.threads import (ThreadView, GotoLastView,
-                                          GotoNewView, GotoPostView)
+                                          GotoNewView, GotoReportedView,
+                                          GotoModeratedView, GotoPostView)
 urlpatterns += patterns('',
 urlpatterns += patterns('',
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/$', ThreadView.as_view(), name='thread'),
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/$', ThreadView.as_view(), name='thread'),
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/(?P<page>\d+)/$', ThreadView.as_view(), name='thread'),
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/(?P<page>\d+)/$', ThreadView.as_view(), name='thread'),
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/last/$', GotoLastView.as_view(), name='thread_last'),
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/last/$', GotoLastView.as_view(), name='thread_last'),
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/new/$', GotoNewView.as_view(), name='thread_new'),
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/new/$', GotoNewView.as_view(), name='thread_new'),
-    url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/reported/$', GotoNewView.as_view(), name='thread_reported'),
-    url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/moderated/$', GotoNewView.as_view(), name='thread_moderated'),
+    url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/reported/$', GotoReportedView.as_view(), name='thread_reported'),
+    url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/moderated/$', GotoModeratedView.as_view(), name='thread_moderated'),
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/post-(?P<post_id>\d+)/$', GotoPostView.as_view(), name='thread_post'),
     url(r'^thread/(?P<thread_slug>[\w\d-]+)-(?P<thread_id>\d+)/post-(?P<post_id>\d+)/$', GotoPostView.as_view(), name='thread_post'),
 )
 )