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())))
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='******')
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)
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)
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()))
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)
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)
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' })
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)
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)
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) ] )
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)
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})
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())
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)
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)
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)
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)
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)
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)
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()))
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)
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)