Example #1
0
 def test_nonmember_unauthorized_write(self):
     login(self.portal, 'alice_lindstrom')
     su1 = StatusUpdate('test #foo')
     su2 = StatusUpdate('test #foo', self.workspace)
     self.tool.add(su1)
     # should raise, since Alice is not a member of the workspace
     self.assertRaises(Unauthorized, self.tool.add, su2)
 def test_delete_microblog_context_and_content(self):
     su1 = StatusUpdate('test', content_context=self.document)
     self.container.add(su1)
     su2 = StatusUpdate('foobar', microblog_context=self.microblog_context)
     self.container.add(su2)
     self.portal.manage_delObjects([self.ws_id])
     self.assertEqual([], (list(self.container.values())))
Example #3
0
 def test_member_allowed_write(self):
     login(self.portal, 'allan_neece')
     su1 = StatusUpdate('test #foo')
     su2 = StatusUpdate('test #foo', self.workspace)
     self.tool.add(su1)
     # should NOT raise Unauthorized
     self.tool.add(su2)
 def test_delete_content_replies(self):
     su1 = StatusUpdate('test', content_context=self.document)
     self.container.add(su1)
     su2 = StatusUpdate('foobar', thread_id=su1.id)
     self.container.add(su2)
     self.microblog_context.manage_delObjects([self.doc_id])
     self.assertEqual([], (list(self.container.values())))
    def setUp(self):
        self.portal = self.layer['portal']
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
        workflowTool = getToolByName(self.portal, 'portal_workflow')
        workflowTool.setDefaultChain('simple_publication_workflow')
        workflowTool.updateRoleMappings()
        f1 = api.content.create(self.portal, 'Folder', 'f1', title=u'Folder 1')
        alsoProvides(f1, IMicroblogContext)
        f1.reindexObject()
        f2 = api.content.create(self.portal, 'Folder', 'f2', title=u'Folder 2')
        alsoProvides(f2, IMicroblogContext)
        f2.reindexObject()

        api.content.transition(f2, 'publish')
        self.assertEqual(api.content.get_state(f1), 'private')
        self.assertEqual(api.content.get_state(f2), 'published')

        tool = queryUtility(IMicroblogTool)
        self.su1 = su1 = StatusUpdate('test #foo', f1)
        tool.add(su1)
        self.su2 = su2 = StatusUpdate('test #foo', f2)
        tool.add(su2)
        # the tool is queued
        tool.flush_queue()

        # set up new user
        api.user.create('*****@*****.**', username='******', password='******')
Example #6
0
 def test_thread_microblog_context(self):
     self.portal.invokeFactory('Folder', 'f1', title=u"Folder 1")
     f1 = self.portal['f1']
     alsoProvides(f1, IMicroblogContext)
     su1 = StatusUpdate('foo', microblog_context=f1)
     self.container.add(su1)
     su2 = StatusUpdate('foo', thread_id=su1.id)
     self.assertEqual(f1, su2.microblog_context)
Example #7
0
 def test_reply_to_contentupdate_is_human_update(self):
     self.portal.invokeFactory('Folder', 'f1', title=u"Folder 1")
     f1 = self.portal['f1']
     alsoProvides(f1, IMicroblogContext)
     doc = api.content.create(
         container=f1,
         type='Document',
         title='My document',
     )
     su1 = StatusUpdate('', content_context=doc)
     self.container.add(su1)
     su2 = StatusUpdate('', thread_id=su1.id)
     self.assertTrue(su2.is_human_update)
Example #8
0
 def test_url_microblog_context(self):
     self.portal.invokeFactory('Folder', 'f1', title=u"Folder 1")
     f1 = self.portal['f1']
     alsoProvides(f1, IMicroblogContext)
     su = StatusUpdate('foo bar', microblog_context=f1)
     self.assertEqual(su.absolute_url(),
                      '{}/@@post'.format(f1.absolute_url()))
Example #9
0
 def test_creator_delete(self):
     login(self.portal, 'user_steve')
     su = StatusUpdate('foo')
     self.container.add(su)
     self.container.delete(su.id)
     with self.assertRaises(KeyError):
         self.container.get(su.id)
Example #10
0
 def test_attachments(self):
     su = StatusUpdate('foo bar')
     su.add_attachment('data.dat', 'XXXX')
     self.assertEqual(len(su.attachments.keys()), 1)
     self.assertEqual(su.attachments['data.dat'].file.data, 'XXXX')
     su.remove_attachment('data.dat')
     self.assertEqual(len(su.attachments.keys()), 0)
Example #11
0
    def test_workspace_tile(self):
        ''' This will test the existence of the workspaces.tile
        and its functionality
        '''
        tile = api.content.get_view('workspaces.tile', self.portal,
                                    self.request)
        su = StatusUpdate('Proposal draft V1.0 # This is a mock!!!', **{
            'microblog_context': self.workspace,
        })
        su.id = 123456789L
        su.creator = 'charlotte_holzer'
        su.date = DateTime('2008/02/14 18:43')
        mb = queryUtility(IMicroblogTool)
        mb.add(su)
        workspaces = tile.workspaces(include_activities=True)
        self.assertEqual(len(workspaces), 1)

        demo_ws = workspaces[0]

        activities = demo_ws['activities']
        self.assertEqual(len(activities), 1)
        self.assertDictEqual(
            activities[0], {
                'object': 'Proposal draft V1.0 # This is a mock!!!',
                'subject': 'charlotte_holzer',
                'time': {
                    'datetime': '2008-02-14',
                    'title': '14 February 2008, 18:43'
                },
                'verb': 'posted'
            })
Example #12
0
 def test_anon_cannot_delete(self):
     logout()
     su = StatusUpdate('foo')
     self.container.add(su)
     login(self.portal, 'user_jane')
     with self.assertRaises(Unauthorized):
         self.container.delete(su.id)
    def test_like_status_update(self):
        # test statusupdate
        su = StatusUpdate('Some cool news!')
        container = piapi.microblog.get_microblog()
        container.add(su)
        update_id = str(su.id)

        self.request.form['like_button'] = 'like'
        self.request["REQUEST_METHOD"] = "POST"
        view = api.content.get_view('toggle_like_statusupdate',
                                    self.portal, self.request)
        self.assertRaises(KeyError, view)
        view = view.publishTraverse(self.request, update_id)

        # Toggle like for statusupdate on
        output = view()
        self.assertIn('(1)', output)
        self.assertIn('Unlike', output)
        user_likes = self.util.get_likes("update", self.user_id)

        self.assertTrue(
            self.util.is_liked("update", update_id, self.user_id))
        self.assertEqual(len(user_likes), 1)

        # Toggle like for statusupdate off
        output = view()
        user_likes = self.util.get_likes("update", self.user_id)
        self.assertEqual(len(user_likes), 0)
        self.assertIn('(0)', output)
        self.assertIn('Like', output)
 def test_add_multi_portal(self):
     portal = api.portal.get()
     self.assertIsNotNone(portal)
     portal_request = portal.REQUEST
     tool = queryUtility(IMicroblogTool)
     for i in xrange(0, 10):
         su = StatusUpdate('Test {}'.format(str(i + 1)))
         tool.add(su)
     # running in sync mode, no need to sleep
     self.assertEqual(len(request_subscriber.messages), 10)
     self.assertIn(('Test 1', portal_request.getURL()),
                   request_subscriber.messages)
     self.assertIn(('Test 2', portal_request.getURL()),
                   request_subscriber.messages)
     self.assertIn(('Test 3', portal_request.getURL()),
                   request_subscriber.messages)
     self.assertIn(('Test 4', portal_request.getURL()),
                   request_subscriber.messages)
     self.assertIn(('Test 5', portal_request.getURL()),
                   request_subscriber.messages)
     self.assertIn(('Test 6', portal_request.getURL()),
                   request_subscriber.messages)
     self.assertIn(('Test 7', portal_request.getURL()),
                   request_subscriber.messages)
     self.assertIn(('Test 8', portal_request.getURL()),
                   request_subscriber.messages)
     self.assertIn(('Test 9', portal_request.getURL()),
                   request_subscriber.messages)
     self.assertIn(('Test 10', portal_request.getURL()),
                   request_subscriber.messages)
Example #15
0
    def test_status_update(self):
        ''' Let's try to create a status_update and inspect the created adapter
        '''
        with api.env.adopt_user('test_user_adapters_'):
            su = StatusUpdate(u'Test à')
            pm = api.portal.get_tool('ploneintranet_microblog')
            pm.add(su)

        pin = api.portal.get_tool('ploneintranet_notifications')
        message = pin.get_user_queue(api.user.get('test_user_adapters_'))[-1]

        self.assertEqual(message.predicate, 'STATUS_UPDATE')

        self.assertDictEqual(
            message.actors[0], {
                'fullname': 'Kelly Sj\xc3\xb6gren',
                'userid': 'test_user_adapters_',
                'email': '*****@*****.**'
            })

        self.assertIsInstance(message.obj['id'], long)
        self.assertEqual(message.obj['title'], u'Test \xe0')
        self.assertEqual(message.obj['url'], 'plone/@@stream/network')
        self.assertEqual(message.obj['read'], False)
        self.assertIsInstance(message.obj['message_last_modification_date'],
                              datetime)
Example #16
0
 def test_edit_sets_edited(self):
     su = StatusUpdate('foo')
     self.assertEqual(su.edited, None)
     su.edit('bar')
     self.assertEqual(str(su.edited.__class__),
                      "<class 'DateTime.DateTime.DateTime'>")
     self.assertNotEqual(su.edited, su.date)
 def test_add_multi_portal(self):
     portal = api.portal.get()
     self.assertIsNotNone(portal)
     portal_path = '/'.join(portal.getPhysicalPath())
     tool = queryUtility(IMicroblogTool)
     for i in xrange(0, 10):
         su = StatusUpdate('Test {}'.format(str(i + 1)))
         if i == 5:
             time.sleep(1)
         # Next message triggers queue flush
         tool.add(su)
     # Here we need to sleep for some time to give the thread timer
     # queue committer in ploneintranet.microblog
     # time to commit the statuses.
     time.sleep(2)
     self.assertEqual(
         portal_subscriber.messages,
         [
             ('Test 1', portal_path),
             ('Test 2', portal_path),
             ('Test 3', portal_path),
             ('Test 4', portal_path),
             ('Test 5', portal_path),
             ('Test 6', portal_path),
             ('Test 7', portal_path),
             ('Test 8', portal_path),
             ('Test 9', portal_path),
             ('Test 10', portal_path)
         ]
     )
Example #18
0
 def test_mentions_mapping(self):
     su = StatusUpdate('foo', mention_ids=['user_steve', ])
     self.container.add(su)
     found = [x for x in self.container._mentions_mapping.get('user_steve')]
     self.assertIn(su.id, found)
     self.container.delete(su.id)
     found = [x for x in self.container._mentions_mapping.get('user_steve')]
     self.assertNotIn(su.id, found)
Example #19
0
 def test_mentions(self):
     test_user = api.user.create(email='*****@*****.**',
                                 username='******',
                                 properties={'fullname': 'Test User'})
     userid = test_user.getId()
     fullname = test_user.getProperty('fullname')
     su = StatusUpdate('foo', mention_ids=[userid])
     self.assertEqual(su.mentions, {userid: fullname})
Example #20
0
 def test_nonmember_secured_read(self):
     login(self.portal, 'allan_neece')
     su = StatusUpdate('test #foo', self.workspace)
     self.tool.add(su)
     logout()
     login(self.portal, 'alice_lindstrom')
     # silently filters all you're not allowed to see
     self.assertFalse(su.id in self.tool.keys())
Example #21
0
 def test_nonmember_unauthorized_get(self):
     login(self.portal, 'allan_neece')
     su = StatusUpdate('test #foo', self.workspace)
     self.tool.add(su)
     logout()
     login(self.portal, 'alice_lindstrom')
     # should raise, since Alice is not a member of the workspace
     self.assertRaises(Unauthorized, self.tool.get, su.id)
Example #22
0
 def test_tag_mapping(self):
     su = StatusUpdate('foo', tags=['foo', 'bar'])
     self.container.add(su)
     found = [x for x in self.container._tag_mapping.get('bar')]
     self.assertIn(su.id, found)
     self.container.delete(su.id)
     found = [x for x in self.container._tag_mapping.get('bar')]
     self.assertNotIn(su.id, found)
    def test_attachments(self):
        su = StatusUpdate('foo bar')
        attachments = IAttachmentStorage(su)

        f = ATFile('data.dat')
        attachments.add(f)
        self.assertEqual([k for k in attachments.keys()], [f.getId()])
        attachments.remove(f.getId())
        self.assertEqual(len(attachments.keys()), 0)
Example #24
0
 def test_user_mapping(self):
     login(self.portal, 'user_steve')
     su = StatusUpdate('foo')
     self.container.add(su)
     found = [x for x in self.container._user_mapping.get('user_steve')]
     self.assertIn(su.id, found)
     self.container.delete(su.id)
     found = [x for x in self.container._user_mapping.get('user_steve')]
     self.assertNotIn(su.id, found)
Example #25
0
def create(
    text,
    microblog_context=None,
    thread_id=None,
    mention_ids=None,
    tags=None,
    user=None,
    userid=None,
    time=None,
):
    """Create a status update (post).

    :param text: [required] text of the post
    :type text: Unicode object

    :param microblog_context: Container of the post
    :type microblog_context: Content object

    :param user: User who should post. By default the current user posts.
    :type user: user object

    :param userid: userid of the user who should post.
    :type userid: string

    :param time: time when the post should happen. By default the current time.
    :type time: datetime object

    :returns: Newly created statusupdate
    :rtype: StatusUpdate object
    """
    status_obj = StatusUpdate(
        text=text,
        microblog_context=microblog_context,
        thread_id=thread_id,
        mention_ids=mention_ids,
        tags=tags
    )
    # By default the post is done by the current user
    # Passing a userid or user allows to post as a different user
    if user is None and userid is not None:
        user = api.user.get(userid=userid)
    if user is not None:
        status_obj.userid = user.getId()
        status_obj.creator = user.getUserName()

    # By default the post happens now
    # Passing a time (as a datetime-object) the id and the date can be set
    if time is not None:
        assert(isinstance(time, datetime))
        delta = time - datetime.utcfromtimestamp(0)
        status_obj.id = long(delta.total_seconds() * 1e6)
        status_obj.date = DateTime(time)

    status_id = status_obj.id
    microblog = queryUtility(IMicroblogTool)
    microblog.add(status_obj)
    return microblog.get(status_id)
Example #26
0
 def test_normal_contentupdate_not_is_human_update(self):
     self.portal.invokeFactory('Folder', 'f1', title=u"Folder 1")
     f1 = self.portal['f1']
     alsoProvides(f1, IMicroblogContext)
     doc = api.content.create(
         container=f1,
         type='Document',
         title='My document',
     )
     su1 = StatusUpdate('', content_context=doc)
     self.assertFalse(su1.is_human_update)
Example #27
0
 def test_content_context_init_sets_microblog_context(self):
     self.portal.invokeFactory('Folder', 'f1', title=u"Folder 1")
     f1 = self.portal['f1']
     alsoProvides(f1, IMicroblogContext)
     doc = api.content.create(
         container=f1,
         type='Document',
         title='My document',
     )
     su1 = StatusUpdate('foo', content_context=doc)
     self.assertEqual(f1, su1.microblog_context)
Example #28
0
 def test_url_content_context(self):
     self.portal.invokeFactory('Folder', 'f1', title=u"Folder 1")
     f1 = self.portal['f1']
     alsoProvides(f1, IMicroblogContext)
     doc = api.content.create(
         container=f1,
         type='Document',
         title='My document',
     )
     su = StatusUpdate('foo bar', content_context=doc)
     self.assertEqual(su.absolute_url(),
                      '{}/view'.format(doc.absolute_url()))
Example #29
0
 def test_extracted_contentupdate_is_human_update(self):
     self.portal.invokeFactory('Folder', 'f1', title=u"Folder 1")
     f1 = self.portal['f1']
     alsoProvides(f1, IMicroblogContext)
     doc = api.content.create(
         container=f1,
         type='Document',
         title='My document',
     )
     su1 = StatusUpdate('I have some text. That makes me human',
                        content_context=doc)
     self.assertTrue(su1.is_human_update)
Example #30
0
 def test_thread_content_context(self):
     doc = api.content.create(
         container=self.portal,
         type='Document',
         title='My document',
     )
     api.content.transition(doc, to_state='published')
     found = [x for x in self.container.values()]
     su1 = found[0]
     su2 = StatusUpdate('foo', thread_id=su1.id)
     self.assertEqual(None, su2.microblog_context)
     self.assertEqual(doc, su2.content_context)