Пример #1
0
    def test_autowatch_reply(self, get_current):
        get_current.return_value.domain = "testserver"

        u = UserFactory()
        t1 = ThreadFactory(is_locked=False)
        t2 = ThreadFactory(is_locked=False)
        assert not NewPostEvent.is_notifying(u, t1)
        assert not NewPostEvent.is_notifying(u, t2)

        self.client.login(username=u.username, password="******")
        s = Setting.objects.create(user=u,
                                   name="kbforums_watch_after_reply",
                                   value="True")
        data = {"content": "some content"}
        post(self.client,
             "wiki.discuss.reply",
             data,
             args=[t1.document.slug, t1.pk])
        assert NewPostEvent.is_notifying(u, t1)

        s.value = "False"
        s.save()
        post(self.client,
             "wiki.discuss.reply",
             data,
             args=[t2.document.slug, t2.pk])
        assert not NewPostEvent.is_notifying(u, t2)
Пример #2
0
 def test_delete_last_and_only_post_in_thread(self):
     """Deleting the only post in a thread should delete the thread"""
     t = ThreadFactory(title="test")
     p = t.new_post(creator=t.creator, content="test")
     eq_(1, t.post_set.count())
     p.delete()
     eq_(0, Thread.objects.filter(pk=t.id).count())
Пример #3
0
 def test_delete_last_and_only_post_in_thread(self):
     """Deleting the only post in a thread should delete the thread"""
     t = ThreadFactory(title="test")
     p = t.new_post(creator=t.creator, content="test")
     eq_(1, t.post_set.count())
     p.delete()
     eq_(0, Thread.objects.filter(pk=t.id).count())
Пример #4
0
    def setUp(self):
        super(KBSaveDateTestCase, self).setUp()

        self.user = UserFactory()
        self.doc = DocumentFactory()
        self.thread = ThreadFactory(
            created=datetime.datetime(2010, 1, 12, 9, 48, 23))
Пример #5
0
    def test_autowatch_reply(self, get_current):
        get_current.return_value.domain = 'testserver'

        u = UserFactory()
        t1 = ThreadFactory(is_locked=False)
        t2 = ThreadFactory(is_locked=False)
        assert not NewPostEvent.is_notifying(u, t1)
        assert not NewPostEvent.is_notifying(u, t2)

        self.client.login(username=u.username, password='******')
        s = Setting.objects.create(user=u,
                                   name='kbforums_watch_after_reply',
                                   value='True')
        data = {'content': 'some content'}
        post(self.client,
             'wiki.discuss.reply',
             data,
             args=[t1.document.slug, t1.pk])
        assert NewPostEvent.is_notifying(u, t1)

        s.value = 'False'
        s.save()
        post(self.client,
             'wiki.discuss.reply',
             data,
             args=[t2.document.slug, t2.pk])
        assert not NewPostEvent.is_notifying(u, t2)
Пример #6
0
 def test_post_absolute_url(self):
     t = ThreadFactory()
     p = t.new_post(creator=t.creator, content="foo")
     url_ = reverse(
         "wiki.discuss.posts", locale=p.thread.document.locale, args=[p.thread.document.slug, p.thread.id]
     )
     exp_ = urlparams(url_, hash="post-%s" % p.id)
     eq_(exp_, p.get_absolute_url())
Пример #7
0
 def test_posts_sort(self):
     """Ensure that posts are being sorted properly by date/time."""
     t = ThreadFactory()
     t.new_post(creator=t.creator, content='foo')
     time.sleep(1)
     p2 = t.new_post(creator=t.creator, content='foo')
     given_ = PostsFeed().items(t)[0].id
     eq_(p2.id, given_)
Пример #8
0
 def test_post_absolute_url(self):
     t = ThreadFactory()
     p = t.new_post(creator=t.creator, content='foo')
     url_ = reverse('wiki.discuss.posts',
                    locale=p.thread.document.locale,
                    args=[p.thread.document.slug, p.thread.id])
     exp_ = urlparams(url_, hash='post-%s' % p.id)
     eq_(exp_, p.get_absolute_url())
Пример #9
0
 def test_posts_sort(self):
     """Ensure that posts are being sorted properly by date/time."""
     t = ThreadFactory()
     t.new_post(creator=t.creator, content='foo')
     time.sleep(1)
     p2 = t.new_post(creator=t.creator, content='foo')
     given_ = PostsFeed().items(t)[0].id
     eq_(p2.id, given_)
Пример #10
0
 def test_links_nofollow(self):
     """Links posted should have rel=nofollow."""
     u = UserFactory()
     t = ThreadFactory()
     t.new_post(creator=u, content="linking http://test.org")
     response = get(self.client, "wiki.discuss.posts", args=[t.document.slug, t.pk])
     doc = pq(response.content)
     eq_("nofollow", doc("ol.posts div.content a")[0].attrib["rel"])
Пример #11
0
 def test_links_nofollow(self):
     """Links posted should have rel=nofollow."""
     u = UserFactory()
     t = ThreadFactory()
     t.new_post(creator=u, content='linking http://test.org')
     response = get(self.client, 'wiki.discuss.posts',
                    args=[t.document.slug, t.pk])
     doc = pq(response.content)
     eq_('nofollow', doc('ol.posts div.content a')[0].attrib['rel'])
Пример #12
0
 def test_links_nofollow(self):
     """Links posted should have rel=nofollow."""
     u = UserFactory()
     t = ThreadFactory()
     t.new_post(creator=u, content='linking http://test.org')
     response = get(self.client,
                    'wiki.discuss.posts',
                    args=[t.document.slug, t.pk])
     doc = pq(response.content)
     eq_('nofollow', doc('ol.posts div.content a')[0].attrib['rel'])
Пример #13
0
 def setUp(self):
     super(ThreadPermissionsTests, self).setUp()
     self.doc = DocumentFactory()
     self.u = UserFactory()
     self.thread = ThreadFactory(document=self.doc, creator=self.u)
     self.post = self.thread.new_post(creator=self.thread.creator,
                                      content='foo')
     # Login for testing 403s
     u2 = UserFactory()
     self.client.login(username=u2.username, password='******')
Пример #14
0
 def setUp(self):
     super(KBBelongsTestCase, self).setUp()
     u = UserFactory()
     self.doc = DocumentFactory(title='spam')
     self.doc_2 = DocumentFactory(title='eggs')
     self.thread = ThreadFactory(creator=u, document=self.doc, is_locked=False)
     self.thread_2 = ThreadFactory(creator=u, document=self.doc_2, is_locked=False)
     permissions = ('sticky_thread', 'lock_thread', 'delete_thread', 'delete_post')
     for permission in permissions:
         add_permission(u, self.thread, permission)
     self.post = self.thread.new_post(creator=self.thread.creator, content='foo')
     self.client.login(username=u.username, password='******')
Пример #15
0
 def test_last_thread_post_link_has_post_id(self):
     """Make sure the last post url links to the last post (#post-<id>)."""
     u = UserFactory()
     t = ThreadFactory()
     t.new_post(creator=u, content='foo')
     p2 = t.new_post(creator=u, content='bar')
     response = get(self.client, 'wiki.discuss.threads',
                    args=[t.document.slug])
     doc = pq(response.content)
     last_post_link = doc('ol.threads div.last-post a:not(.username)')[0]
     href = last_post_link.attrib['href']
     eq_(href.split('#')[1], 'post-%d' % p2.id)
Пример #16
0
    def test_last_thread_post_link_has_post_id(self):
        """Make sure the last post url links to the last post (#post-<id>)."""
        u = UserFactory()
        t = ThreadFactory()
        t.new_post(creator=u, content="foo")
        p2 = t.new_post(creator=u, content="bar")
        response = get(self.client, "wiki.discuss.threads", args=[t.document.slug])

        doc = pq(response.content)
        last_post_link = doc("tr.threads td.last-post a:not(.username)")[0]
        href = last_post_link.attrib["href"]
        eq_(href.split("#")[1], "post-%d" % p2.id)
Пример #17
0
    def test_edit_thread_template(self):
        """The edit-post template should render."""
        u = UserFactory()
        self.client.login(username=u.username, password='******')

        t = ThreadFactory(creator=u, is_locked=False)
        p = t.new_post(creator=u, content='foo')
        res = get(self.client, 'wiki.discuss.edit_post',
                  args=[p.thread.document.slug, p.thread.id, p.id])

        doc = pq(res.content)
        eq_(len(doc('form.edit-post')), 1)
Пример #18
0
    def test_edit_thread_template(self):
        """The edit-post template should render."""
        u = UserFactory()
        self.client.login(username=u.username, password='******')

        t = ThreadFactory(creator=u, is_locked=False)
        p = t.new_post(creator=u, content='foo')
        res = get(self.client,
                  'wiki.discuss.edit_post',
                  args=[p.thread.document.slug, p.thread.id, p.id])

        doc = pq(res.content)
        eq_(len(doc('form.edit-post')), 1)
Пример #19
0
 def test_last_thread_post_link_has_post_id(self):
     """Make sure the last post url links to the last post (#post-<id>)."""
     u = UserFactory()
     t = ThreadFactory()
     t.new_post(creator=u, content='foo')
     p2 = t.new_post(creator=u, content='bar')
     response = get(self.client,
                    'wiki.discuss.threads',
                    args=[t.document.slug])
     doc = pq(response.content)
     last_post_link = doc('ol.threads div.last-post a:not(.username)')[0]
     href = last_post_link.attrib['href']
     eq_(href.split('#')[1], 'post-%d' % p2.id)
Пример #20
0
    def test_last_post_updated(self):
        """Adding/Deleting the last post in a thread should
        update the last_post field
        """
        t = ThreadFactory()
        u = UserFactory()

        # add a new post, then check that last_post is updated
        new_post = t.new_post(creator=u, content="test")
        eq_(t.last_post.id, new_post.id)

        # delete the new post, then check that last_post is updated
        new_post.delete()
        self.assertIsNone(t.last_post.id)
Пример #21
0
    def test_last_post_updated(self):
        """Adding/Deleting the last post in a thread should
        update the last_post field
        """
        t = ThreadFactory()
        u = UserFactory()

        # add a new post, then check that last_post is updated
        new_post = t.new_post(creator=u, content="test")
        eq_(t.last_post.id, new_post.id)

        # delete the new post, then check that last_post is updated
        new_post.delete()
        self.assertIsNone(t.last_post.id)
Пример #22
0
 def test_flag_kbforum_post(self):
     u = UserFactory()
     t = ThreadFactory()
     p = t.new_post(creator=u, content="foo")
     f = FlaggedObject(content_object=p, reason="spam", creator_id=u.id)
     f.save()
     # Make sure flagit queue page works
     u2 = UserFactory()
     add_permission(u2, FlaggedObject, "can_moderate")
     self.client.login(username=u2.username, password="******")
     response = get(self.client, "flagit.queue")
     eq_(200, response.status_code)
     doc = pq(response.content)
     eq_(1, len(doc("#flagged-queue li")))
Пример #23
0
    def test_watch_other_thread_then_reply(self):
        """Watching a different thread than the one we're replying to shouldn't
        notify."""
        u_b = UserFactory(username='******')
        _t = ThreadFactory()
        self._toggle_watch_thread_as(u_b.username, _t, turn_on=True)
        u = UserFactory()
        t2 = ThreadFactory()
        self.client.login(username=u.username, password='******')
        post(self.client,
             'wiki.discuss.reply', {'content': 'a post'},
             args=[t2.document.slug, t2.id])

        assert not mail.outbox
Пример #24
0
    def test_edit_post(self):
        """Changing post content works."""
        u = UserFactory()
        self.client.login(username=u.username, password='******')

        d = DocumentFactory()
        t = ThreadFactory(document=d)
        p = t.new_post(creator=u, content='foo')
        post(self.client,
             'wiki.discuss.edit_post', {'content': 'Some new content'},
             args=[d.slug, t.id, p.id])
        edited_p = t.post_set.get(pk=p.id)

        eq_('Some new content', edited_p.content)
Пример #25
0
    def test_edit_post(self):
        """Changing post content works."""
        u = UserFactory()
        self.client.login(username=u.username, password='******')

        d = DocumentFactory()
        t = ThreadFactory(document=d)
        p = t.new_post(creator=u, content='foo')
        post(self.client, 'wiki.discuss.edit_post',
             {'content': 'Some new content'},
             args=[d.slug, t.id, p.id])
        edited_p = t.post_set.get(pk=p.id)

        eq_('Some new content', edited_p.content)
Пример #26
0
 def test_flag_kbforum_post(self):
     u = UserFactory()
     t = ThreadFactory()
     p = t.new_post(creator=u, content='foo')
     f = FlaggedObject(content_object=p, reason='spam', creator_id=u.id)
     f.save()
     # Make sure flagit queue page works
     u2 = UserFactory()
     add_permission(u2, FlaggedObject, 'can_moderate')
     self.client.login(username=u2.username, password='******')
     response = get(self.client, 'flagit.queue')
     eq_(200, response.status_code)
     doc = pq(response.content)
     eq_(1, len(doc('#flagged-queue li')))
Пример #27
0
    def test_watch_thread_then_reply(self, get_current):
        """The event fires and sends emails when watching a thread."""
        get_current.return_value.domain = 'testserver'
        u = UserFactory(username='******')
        u_b = UserFactory(username='******')
        d = DocumentFactory(title='an article title')
        _t = ThreadFactory(title='Sticky Thread', document=d, is_sticky=True)
        t = self._toggle_watch_thread_as(u_b.username, _t, turn_on=True)
        self.client.login(username=u.username, password='******')
        post(self.client,
             'wiki.discuss.reply', {'content': 'a post'},
             args=[t.document.slug, t.id])

        p = Post.objects.all().order_by('-id')[0]
        attrs_eq(mail.outbox[0],
                 to=[u_b.email],
                 subject='Re: an article title - Sticky Thread')
        starts_with(
            mail.outbox[0].body, REPLY_EMAIL % {
                'user': u.profile.name,
                'document_slug': d.slug,
                'thread_id': t.id,
                'post_id': p.id,
            })

        self._toggle_watch_thread_as(u_b.username, _t, turn_on=False)
Пример #28
0
    def test_edit_post_errors(self):
        """Changing post content works."""
        u = UserFactory()
        self.client.login(username=u.username, password='******')

        t = ThreadFactory(creator=u, is_locked=False)
        p = t.new_post(creator=u, content='foo')
        response = post(self.client,
                        'wiki.discuss.edit_post', {'content': 'wha?'},
                        args=[t.document.slug, t.id, p.id])

        doc = pq(response.content)
        errors = doc('ul.errorlist li a')
        eq_(
            errors[0].text, 'Your message is too short (4 characters). ' +
            'It must be at least 5 characters.')
Пример #29
0
    def test_watch_both_then_new_post(self, get_current):
        """Watching both and replying to a thread should send ONE email."""
        get_current.return_value.domain = 'testserver'

        u = UserFactory()
        d = DocumentFactory(title='an article title')
        f = self._toggle_watch_kbforum_as(u.username, d, turn_on=True)
        t = ThreadFactory(title='Sticky Thread', document=d)
        self._toggle_watch_thread_as(u.username, t, turn_on=True)
        u2 = UserFactory(username='******')
        self.client.login(username=u2.username, password='******')
        post(self.client,
             'wiki.discuss.reply', {'content': 'a post'},
             args=[f.slug, t.id])

        eq_(1, len(mail.outbox))
        p = Post.objects.all().order_by('-id')[0]
        attrs_eq(mail.outbox[0],
                 to=[u.email],
                 subject='Re: an article title - Sticky Thread')
        starts_with(
            mail.outbox[0].body, REPLY_EMAIL % {
                'user': u2.profile.name,
                'document_slug': d.slug,
                'thread_id': t.id,
                'post_id': p.id,
            })

        self._toggle_watch_kbforum_as(u.username, d, turn_on=False)
        self._toggle_watch_thread_as(u.username, t, turn_on=False)
Пример #30
0
    def test_watch_all_then_new_post(self, get_current):
        """Watching document + thread + locale and reply to thread."""
        get_current.return_value.domain = 'testserver'

        u = UserFactory()
        _d = DocumentFactory(title='an article title')
        d = self._toggle_watch_kbforum_as(u.username, _d, turn_on=True)
        t = ThreadFactory(title='Sticky Thread', document=d)
        self._toggle_watch_thread_as(u.username, t, turn_on=True)
        self.client.login(username=u.username, password='******')
        post(self.client, 'wiki.discuss.watch_locale', {'watch': 'yes'})

        # Reply as jsocol to document d.
        u2 = UserFactory(username='******')
        self.client.login(username=u2.username, password='******')
        post(self.client,
             'wiki.discuss.reply', {'content': 'a post'},
             args=[d.slug, t.id])

        # Only ONE email was sent. As expected.
        eq_(1, len(mail.outbox))
        p = Post.objects.all().order_by('-id')[0]
        attrs_eq(mail.outbox[0],
                 to=[u.email],
                 subject='Re: an article title - Sticky Thread')
        starts_with(
            mail.outbox[0].body, REPLY_EMAIL % {
                'user': u2.profile.name,
                'document_slug': d.slug,
                'thread_id': t.id,
                'post_id': p.id,
            })
Пример #31
0
    def test_watch_forum(self):
        """Watch then unwatch a forum."""
        u = UserFactory()
        self.client.login(username=u.username, password='******')

        d = DocumentFactory()
        post(self.client, 'wiki.discuss.watch_forum', {'watch': 'yes'},
             args=[d.slug])
        assert NewThreadEvent.is_notifying(u, d)
        # NewPostEvent is not notifying.
        t = ThreadFactory(document=d)
        p = t.new_post(creator=t.creator, content='test')
        assert not NewPostEvent.is_notifying(u, p)

        post(self.client, 'wiki.discuss.watch_forum', {'watch': 'no'}, args=[d.slug])
        assert not NewThreadEvent.is_notifying(u, d)
Пример #32
0
    def test_watch_thread_then_reply(self, get_current):
        """The event fires and sends emails when watching a thread."""
        get_current.return_value.domain = "testserver"
        u = UserFactory(username="******")
        u_b = UserFactory(username="******")
        d = DocumentFactory(title="an article title")
        _t = ThreadFactory(title="Sticky Thread", document=d, is_sticky=True)
        t = self._toggle_watch_thread_as(u_b.username, _t, turn_on=True)
        self.client.login(username=u.username, password="******")
        post(self.client,
             "wiki.discuss.reply", {"content": "a post"},
             args=[t.document.slug, t.id])

        p = Post.objects.all().order_by("-id")[0]
        attrs_eq(mail.outbox[0],
                 to=[u_b.email],
                 subject="Re: an article title - Sticky Thread")
        starts_with(
            mail.outbox[0].body,
            REPLY_EMAIL % {
                "user": u.profile.name,
                "document_slug": d.slug,
                "thread_id": t.id,
                "post_id": p.id,
            },
        )

        self._toggle_watch_thread_as(u_b.username, _t, turn_on=False)
Пример #33
0
 def test_edit_locked_thread_403(self):
     """Editing a locked thread returns 403."""
     t = ThreadFactory(document=self.doc, creator=self.u, is_locked=True)
     response = get(self.client,
                    'wiki.discuss.edit_thread',
                    args=[self.doc.slug, t.id])
     eq_(403, response.status_code)
Пример #34
0
    def test_edit_post_errors(self):
        """Changing post content works."""
        u = UserFactory()
        self.client.login(username=u.username, password='******')

        t = ThreadFactory(creator=u, is_locked=False)
        p = t.new_post(creator=u, content='foo')
        response = post(self.client, 'wiki.discuss.edit_post',
                        {'content': 'wha?'},
                        args=[t.document.slug, t.id, p.id])

        doc = pq(response.content)
        errors = doc('ul.errorlist li a')
        eq_(errors[0].text,
            'Your message is too short (4 characters). ' +
            'It must be at least 5 characters.')
Пример #35
0
 def test_locale_discussions_ignores_sticky(self):
     """Sticky flag is ignored in locale discussions view"""
     u = UserFactory()
     d = DocumentFactory()
     t = ThreadFactory(title="Sticky Thread", is_sticky=True, document=d)
     t.new_post(creator=u, content="foo")
     t2 = ThreadFactory(title="A thread with a very very long", is_sticky=False, document=d)
     t2.new_post(creator=u, content="bar")
     time.sleep(1)
     t2.new_post(creator=u, content="last")
     self.client.login(username=u.username, password="******")
     response = post(self.client, "wiki.locale_discussions")
     eq_(200, response.status_code)
     doc = pq(response.content)
     title = doc(".threads .title a:first").text()
     assert title.startswith("A thread with a very very long")
Пример #36
0
    def test_watch_all_then_new_post(self, get_current):
        """Watching document + thread + locale and reply to thread."""
        get_current.return_value.domain = "testserver"

        u = UserFactory()
        _d = DocumentFactory(title="an article title")
        d = self._toggle_watch_kbforum_as(u.username, _d, turn_on=True)
        t = ThreadFactory(title="Sticky Thread", document=d)
        self._toggle_watch_thread_as(u.username, t, turn_on=True)
        self.client.login(username=u.username, password="******")
        post(self.client, "wiki.discuss.watch_locale", {"watch": "yes"})

        # Reply as jsocol to document d.
        u2 = UserFactory(username="******")
        self.client.login(username=u2.username, password="******")
        post(self.client,
             "wiki.discuss.reply", {"content": "a post"},
             args=[d.slug, t.id])

        # Only ONE email was sent. As expected.
        eq_(1, len(mail.outbox))
        p = Post.objects.all().order_by("-id")[0]
        attrs_eq(mail.outbox[0],
                 to=[u.email],
                 subject="Re: an article title - Sticky Thread")
        starts_with(
            mail.outbox[0].body,
            REPLY_EMAIL % {
                "user": u2.profile.name,
                "document_slug": d.slug,
                "thread_id": t.id,
                "post_id": p.id,
            },
        )
Пример #37
0
    def test_watch_both_then_new_post(self, get_current):
        """Watching both and replying to a thread should send ONE email."""
        get_current.return_value.domain = "testserver"

        u = UserFactory()
        d = DocumentFactory(title="an article title")
        f = self._toggle_watch_kbforum_as(u.username, d, turn_on=True)
        t = ThreadFactory(title="Sticky Thread", document=d)
        self._toggle_watch_thread_as(u.username, t, turn_on=True)
        u2 = UserFactory(username="******")
        self.client.login(username=u2.username, password="******")
        post(self.client,
             "wiki.discuss.reply", {"content": "a post"},
             args=[f.slug, t.id])

        eq_(1, len(mail.outbox))
        p = Post.objects.all().order_by("-id")[0]
        attrs_eq(mail.outbox[0],
                 to=[u.email],
                 subject="Re: an article title - Sticky Thread")
        starts_with(
            mail.outbox[0].body,
            REPLY_EMAIL % {
                "user": u2.profile.name,
                "document_slug": d.slug,
                "thread_id": t.id,
                "post_id": p.id,
            },
        )

        self._toggle_watch_kbforum_as(u.username, d, turn_on=False)
        self._toggle_watch_thread_as(u.username, t, turn_on=False)
Пример #38
0
    def test_edit_post(self):
        """Changing post content works."""
        u = UserFactory()
        self.client.login(username=u.username, password="******")

        d = DocumentFactory()
        t = ThreadFactory(document=d)
        p = t.new_post(creator=u, content="foo")
        post(
            self.client,
            "wiki.discuss.edit_post",
            {"content": "Some new content"},
            args=[d.slug, t.id, p.id],
        )
        edited_p = t.post_set.get(pk=p.id)

        eq_("Some new content", edited_p.content)
Пример #39
0
 def test_threads_sort(self):
     """Ensure that threads are being sorted properly by date/time."""
     d = DocumentFactory()
     t = ThreadFactory(document=d)
     t.new_post(creator=t.creator, content='foo')
     time.sleep(1)
     t2 = ThreadFactory(document=d)
     t2.new_post(creator=t2.creator, content='foo')
     given_ = ThreadsFeed().items(d)[0].id
     eq_(t2.id, given_)
Пример #40
0
 def test_locale_discussions_ignores_sticky(self):
     """Sticky flag is ignored in locale discussions view"""
     u = UserFactory()
     d = DocumentFactory()
     t = ThreadFactory(title='Sticky Thread', is_sticky=True, document=d)
     t.new_post(creator=u, content='foo')
     t2 = ThreadFactory(title='A thread with a very very long',
                        is_sticky=False,
                        document=d)
     t2.new_post(creator=u, content='bar')
     time.sleep(1)
     t2.new_post(creator=u, content='last')
     self.client.login(username=u.username, password='******')
     response = post(self.client, 'wiki.locale_discussions')
     eq_(200, response.status_code)
     doc = pq(response.content)
     title = doc('ol.threads li div.title a:first').text()
     assert title.startswith('A thread with a very very long')
Пример #41
0
 def setUp(self):
     super(ThreadPermissionsTests, self).setUp()
     self.doc = DocumentFactory()
     self.u = UserFactory()
     self.thread = ThreadFactory(document=self.doc, creator=self.u)
     self.post = self.thread.new_post(creator=self.thread.creator, content='foo')
     # Login for testing 403s
     u2 = UserFactory()
     self.client.login(username=u2.username, password='******')
Пример #42
0
 def test_long_title_truncated_in_crumbs(self):
     """A very long thread title gets truncated in the breadcrumbs"""
     d = DocumentFactory()
     t = ThreadFactory(title='A thread with a very very very very very' * 5,
                       document=d)
     response = get(self.client, 'wiki.discuss.posts', args=[d.slug, t.id])
     doc = pq(response.content)
     crumb = doc('#breadcrumbs li:last-child')
     eq_(crumb.text(), 'A thread with a very very very very...')
Пример #43
0
 def test_locale_discussions_ignores_sticky(self):
     """Sticky flag is ignored in locale discussions view"""
     u = UserFactory()
     d = DocumentFactory()
     t = ThreadFactory(title='Sticky Thread', is_sticky=True, document=d)
     t.new_post(creator=u, content='foo')
     t2 = ThreadFactory(title='A thread with a very very long', is_sticky=False, document=d)
     t2.new_post(creator=u, content='bar')
     time.sleep(1)
     t2.new_post(creator=u, content='last')
     self.client.login(username=u.username, password='******')
     response = post(self.client, 'wiki.locale_discussions')
     eq_(200, response.status_code)
     doc = pq(response.content)
     title = doc('ol.threads li div.title a:first').text()
     assert title.startswith('A thread with a very very long')
Пример #44
0
 def test_threads_sort(self):
     """Ensure that threads are being sorted properly by date/time."""
     d = DocumentFactory()
     t = ThreadFactory(document=d)
     t.new_post(creator=t.creator, content='foo')
     time.sleep(1)
     t2 = ThreadFactory(document=d)
     t2.new_post(creator=t2.creator, content='foo')
     given_ = ThreadsFeed().items(d)[0].id
     eq_(t2.id, given_)
Пример #45
0
 def test_thread_absolute_url(self):
     t = ThreadFactory()
     exp_ = reverse("wiki.discuss.posts", locale=t.document.locale, args=[t.document.slug, t.id])
     eq_(exp_, t.get_absolute_url())
Пример #46
0
class KBBelongsTestCase(KBForumTestCase):
    """
    Mixing and matching thread, forum, and post data in URLs should fail.
    """

    def setUp(self):
        super(KBBelongsTestCase, self).setUp()
        u = UserFactory()
        self.doc = DocumentFactory(title='spam')
        self.doc_2 = DocumentFactory(title='eggs')
        self.thread = ThreadFactory(creator=u, document=self.doc, is_locked=False)
        self.thread_2 = ThreadFactory(creator=u, document=self.doc_2, is_locked=False)
        permissions = ('sticky_thread', 'lock_thread', 'delete_thread', 'delete_post')
        for permission in permissions:
            add_permission(u, self.thread, permission)
        self.post = self.thread.new_post(creator=self.thread.creator, content='foo')
        self.client.login(username=u.username, password='******')

    def test_posts_thread_belongs_to_document(self):
        """Posts view - thread belongs to document."""
        r = get(self.client, 'wiki.discuss.posts',
                args=[self.doc_2.slug, self.thread.id])
        eq_(404, r.status_code)

    def test_reply_thread_belongs_to_document(self):
        """Reply action - thread belongs to document."""
        r = post(self.client, 'wiki.discuss.reply', {},
                 args=[self.doc_2.slug, self.thread.id])
        eq_(404, r.status_code)

    def test_locked_thread_belongs_to_document(self):
        """Lock action - thread belongs to document."""
        r = post(self.client, 'wiki.discuss.lock_thread', {},
                 args=[self.doc_2.slug, self.thread.id])
        eq_(404, r.status_code)

    def test_sticky_thread_belongs_to_document(self):
        """Sticky action - thread belongs to document."""
        r = post(self.client, 'wiki.discuss.sticky_thread', {},
                 args=[self.doc_2.slug, self.thread.id])
        eq_(404, r.status_code)

    def test_edit_thread_belongs_to_document(self):
        """Edit thread action - thread belongs to document."""
        r = get(self.client, 'wiki.discuss.edit_thread',
                args=[self.doc_2.slug, self.thread.id])
        eq_(404, r.status_code)

    def test_delete_thread_belongs_to_document(self):
        """Delete thread action - thread belongs to document."""
        r = get(self.client, 'wiki.discuss.delete_thread',
                args=[self.doc_2.slug, self.thread.id])
        eq_(404, r.status_code)

    def test_edit_post_belongs_to_thread_and_document(self):
        """
        Edit post action - post belongs to thread and thread belongs to
        forum.
        """
        r = get(self.client, 'wiki.discuss.edit_post',
                args=[self.doc_2.slug, self.thread.id, self.post.id])
        eq_(404, r.status_code)

        r = get(self.client, 'wiki.discuss.edit_post',
                args=[self.doc.slug, self.thread_2.id, self.post.id])
        eq_(404, r.status_code)

    def test_delete_post_belongs_to_thread_and_document(self):
        """
        Delete post action - post belongs to thread and thread belongs to
        forum.
        """
        r = get(self.client, 'wiki.discuss.delete_post',
                args=[self.doc_2.slug, self.thread.id, self.post.id])
        eq_(404, r.status_code)

        r = get(self.client, 'wiki.discuss.delete_post',
                args=[self.doc.slug, self.thread_2.id, self.post.id])
        eq_(404, r.status_code)
Пример #47
0
class KBSaveDateTestCase(KBForumTestCase):
    """
    Test that Thread and Post save methods correctly handle created
    and updated dates.
    """

    delta = datetime.timedelta(milliseconds=3000)

    def setUp(self):
        super(KBSaveDateTestCase, self).setUp()

        self.user = UserFactory()
        self.doc = DocumentFactory()
        self.thread = ThreadFactory(created=datetime.datetime(2010, 1, 12, 9, 48, 23))

    def assertDateTimeAlmostEqual(self, a, b, delta, msg=None):
        """
        Assert that two datetime objects are within `range` (a timedelta).
        """
        diff = abs(a - b)
        assert diff < abs(delta), msg or "%s ~= %s" % (a, b)

    def test_save_thread_no_created(self):
        """Saving a new thread should behave as if auto_add_now was set."""
        t = self.doc.thread_set.create(title="foo", creator=self.user)
        t.save()
        now = datetime.datetime.now()
        self.assertDateTimeAlmostEqual(now, t.created, self.delta)

    def test_save_thread_created(self):
        """
        Saving a new thread that already has a created date should respect
        that created date.
        """
        created = datetime.datetime(1992, 1, 12, 9, 48, 23)
        t = self.doc.thread_set.create(title="foo", creator=self.user, created=created)
        t.save()
        eq_(created, t.created)

    def test_save_old_thread_created(self):
        """Saving an old thread should not change its created date."""
        t = ThreadFactory()
        created = t.created
        t.save()
        eq_(created, t.created)

    def test_save_new_post_no_timestamps(self):
        """
        Saving a new post should behave as if auto_add_now was set on
        created and auto_now set on updated.
        """
        p = self.thread.new_post(creator=self.user, content="bar")
        now = datetime.datetime.now()
        self.assertDateTimeAlmostEqual(now, p.created, self.delta)
        self.assertDateTimeAlmostEqual(now, p.updated, self.delta)

    def test_save_old_post_no_timestamps(self):
        """
        Saving an existing post should update the updated date.
        """
        now = datetime.datetime.now()

        p = self.thread.new_post(creator=self.user, content="bar")
        self.assertDateTimeAlmostEqual(now, p.updated, self.delta)

        p.content = "baz"
        p.updated_by = self.user
        p.save()

        self.assertDateTimeAlmostEqual(now, p.updated, self.delta)

    def test_save_new_post_timestamps(self):
        """
        Saving a new post should not allow you to override auto_add_now- and
        auto_now-like functionality.
        """
        created_ = datetime.datetime(1992, 1, 12, 10, 12, 32)
        p = PostFactory(thread=self.thread, creator=self.user, created=created_, updated=created_)

        now = datetime.datetime.now()
        self.assertDateTimeAlmostEqual(now, p.created, self.delta)
        self.assertDateTimeAlmostEqual(now, p.updated, self.delta)

    def test_content_parsed_sanity(self):
        """The content_parsed field is populated."""
        p = PostFactory(content="yet another post")
        eq_("<p>yet another post\n</p>", p.content_parsed)
Пример #48
0
    def setUp(self):
        super(KBSaveDateTestCase, self).setUp()

        self.user = UserFactory()
        self.doc = DocumentFactory()
        self.thread = ThreadFactory(created=datetime.datetime(2010, 1, 12, 9, 48, 23))
Пример #49
0
 def test_save_old_thread_created(self):
     """Saving an old thread should not change its created date."""
     t = ThreadFactory()
     created = t.created
     t.save()
     eq_(created, t.created)
Пример #50
0
class ThreadPermissionsTests(KBForumTestCase):

    def setUp(self):
        super(ThreadPermissionsTests, self).setUp()
        self.doc = DocumentFactory()
        self.u = UserFactory()
        self.thread = ThreadFactory(document=self.doc, creator=self.u)
        self.post = self.thread.new_post(creator=self.thread.creator, content='foo')
        # Login for testing 403s
        u2 = UserFactory()
        self.client.login(username=u2.username, password='******')

    def tearDown(self):
        self.client.logout()
        super(ThreadPermissionsTests, self).tearDown()

    def test_edit_thread_403(self):
        """Editing a thread without permissions returns 403."""
        response = get(self.client, 'wiki.discuss.edit_thread',
                       args=[self.doc.slug, self.thread.id])
        eq_(403, response.status_code)

    def test_edit_locked_thread_403(self):
        """Editing a locked thread returns 403."""
        t = ThreadFactory(document=self.doc, creator=self.u, is_locked=True)
        response = get(self.client, 'wiki.discuss.edit_thread',
                       args=[self.doc.slug, t.id])
        eq_(403, response.status_code)

    def test_delete_thread_403(self):
        """Deleting a thread without permissions returns 403."""
        response = get(self.client, 'wiki.discuss.delete_thread',
                       args=[self.doc.slug, self.thread.id])
        eq_(403, response.status_code)

    def test_sticky_thread_405(self):
        """Marking a thread sticky with a HTTP GET returns 405."""
        response = get(self.client, 'wiki.discuss.sticky_thread',
                       args=[self.doc.slug, self.thread.id])
        eq_(405, response.status_code)

    def test_sticky_thread_403(self):
        """Marking a thread sticky without permissions returns 403."""
        response = post(self.client, 'wiki.discuss.sticky_thread',
                        args=[self.doc.slug, self.thread.id])
        eq_(403, response.status_code)

    def test_locked_thread_403(self):
        """Marking a thread locked without permissions returns 403."""
        response = post(self.client, 'wiki.discuss.lock_thread',
                        args=[self.doc.slug, self.thread.id])
        eq_(403, response.status_code)

    def test_locked_thread_405(self):
        """Marking a thread locked via a GET instead of a POST request."""
        response = get(self.client, 'wiki.discuss.lock_thread',
                       args=[self.doc.slug, self.thread.id])
        eq_(405, response.status_code)

    def test_post_edit_403(self):
        """Editing a post without permissions returns 403."""
        response = get(self.client, 'wiki.discuss.edit_post',
                       args=[self.doc.slug, self.thread.id, self.post.id])
        eq_(403, response.status_code)

    def test_post_delete_403(self):
        """Deleting a post without permissions returns 403."""
        response = get(self.client, 'wiki.discuss.delete_post',
                       args=[self.doc.slug, self.thread.id, self.post.id])
        eq_(403, response.status_code)