def send_to(context, request, to, people_list, store_sent=False, thread_id=None): user = authenticated_userid(request) now = str(datetime.utcnow()) is_reply = False if request.POST.get('thread_id'): is_reply = True subject = request.POST.get('subject') or '(empty subject)' payload = request.POST.get('payload', '') if thread_id is None: # We don't have a thread id. We try to get it from a post variable # (reply) or we create it (new thread). thread_id = request.POST.get('thread_id') if thread_id is None: thread_id = MailboxTool.new_thread_id() mbt = MailboxTool() # FIXME not sure if this is actually used # unread = mbt.get_unread(context, user, 'inbox') # return_data['unread'] = unread msg = MboxMessage(payload.encode('utf-8')) msg['Message-Id'] = MailboxTool.new_message_id() if not is_reply: msg['Subject'] = subject # We'll setup the subject automatically if it's a reply msg['From'] = user msg['To'] = to msg['Date'] = now msg['X-oc-thread-id'] = thread_id msg['X-people-list'] = ','.join(people_list) site = find_site(context) to_profile = request.api.find_profile(to) from_profile = request.api.find_profile(user) if is_reply: mbt.send_reply(site, thread_id, user, to_profile, msg, store_sent=store_sent) else: mbt.send_message(site, user, to_profile, msg, store_sent=store_sent) eventinfo = _MBoxEvent() eventinfo['content'] = msg eventinfo['content_type'] = 'MBoxMessage' eventinfo['context_url'] = from_profile.__name__ eventinfo.mfrom = from_profile.__name__ eventinfo.mfrom_name = from_profile.__name__ eventinfo.mto = [to_profile.email] eventinfo.message = msg alert_user(to_profile, eventinfo) return thread_id
class TestMailbox(unittest.TestCase): def setUp(self): self.mbt = MailboxTool() self.log = LogCapture() def zztest_send_get_message(self): site, from_, to, msg, thread_id, msg_id, _, subject, payload, now = get_data() self.mbt.send_message(site, from_, to, msg) raw_msg, msg = self.mbt.get_message(site, from_, 'sent', thread_id, msg_id) self.assertEquals(raw_msg.message_id, msg_id) self.assertEquals(raw_msg.flags, []) self.assertEquals(msg['Message-Id'], msg_id) self.assertEquals(msg['Subject'], subject) self.assertEquals(msg['From'], from_) self.assertEquals(msg['To'], ', '.join(to)) self.assertEquals(msg['Date'], now) self.assertEquals(msg['X-oc-thread-id'], thread_id) transaction.commit() def zztest_delete_message(self): site, from_, to, msg, thread_id, msg_id, _, subject, payload, now = get_data() self.mbt.send_message(site, from_, to, msg) self.mbt.delete_message(site, from_, 'sent', thread_id, msg_id) try: self.mbt.get_message(site, from_, 'sent', thread_id, msg_id) except NoSuchThreadException: pass else: raise transaction.commit() def zztest_set_message_flags(self): site, from_, to, msg, thread_id, msg_id, flags, subject, payload, now = get_data() self.mbt.send_message(site, from_, to, msg) self.mbt.set_message_flags(site, from_, 'sent', thread_id, msg_id, flags) raw_msg, msg = self.mbt.get_message(site, from_, 'sent', thread_id, msg_id) self.assertEquals(raw_msg.flags, flags) raw_msg, msg = self.mbt.get_message(site, from_, 'sent', thread_id, msg_id) transaction.commit() def zztest_get_queues(self): site, from_, to, msg, thread_id, msg_id, _, subject, payload, now = get_data() self.mbt.send_message(site, from_, to, msg) queues = self.mbt.get_queues(site, from_, 'sent') for queue in queues: self.assertTrue(isinstance(queue, Queue)) transaction.commit()
class MBoxViewTestCase(unittest.TestCase): def setUp(self): self.mbt = MailboxTool() self.log = LogCapture() self.context = DummyModel() self.context['mailboxes'] = DummyModel() self.context.users = DummyUsers() self.bob = DummyProfile() self.bob.__name__ = 'bob' self.alice = DummyProfile() self.alice.__name__ = 'alice' def tearDown(self): cleanUp() def _get_mbox_request(self, mbox_type, key='mbox_type'): request = DummyRequest() request.params[key] = mbox_type return request def test_per_page(self): self.assertEquals(PER_PAGE, 20) def test_json_response(self): success = uuid.uuid4().hex error_msg = uuid.uuid4().hex response = _json_response(success, error_msg) self.assertTrue(isinstance(response, Response)) self.assertEquals(response.content_type, 'application/x-json') given_body = sorted(JSONDecoder().decode(response.body).items()) expected_body = [('error_msg', error_msg), ('success', success)] self.assertEquals(given_body, expected_body) def test_get_mbox_type(self): mbox_type = _get_mbox_type(self._get_mbox_request('inbox')) self.assertEquals(mbox_type, 'inbox') mbox_type = _get_mbox_type(self._get_mbox_request('sent')) self.assertEquals(mbox_type, 'sent') # Unrecognized mbox type, should revert to default inbox. mbox_type = _get_mbox_type(self._get_mbox_request(uuid.uuid4().hex)) self.assertEquals(mbox_type, DEFAULT_MBOX_TYPE) # Unrecognized key, should revert to default inbox. mbox_type = _get_mbox_type(self._get_mbox_request('inbox', key=uuid.uuid4().hex)) self.assertEquals(mbox_type, DEFAULT_MBOX_TYPE) def test_show_mbox(self): _people_url = uuid.uuid4().hex _firstname = uuid.uuid4().hex _lastname = uuid.uuid4().hex _country = uuid.uuid4().hex class _DummyAPI(object): static_url = '/foo/bar' def find_profile(*ignored_args, **ignored_kwargs): class _Dummy(object): firstname = _firstname lastname = _lastname country = _country organization = uuid.uuid4().hex thumb_url = lambda _profile, _request: '/test-thumb.jpg' return _Dummy() people_url = _people_url with Replacer() as r: r.replace('opencore.views.mbox.authenticated_userid', _authenticated_user_id) r.replace('opencore.views.mbox._get_profile_details', lambda context, request, user: {}) site, from_, _, msg, thread_id, _, _, _, payload, _ = get_data() to = find_profiles(site)['admin'] self.mbt.send_message(site, from_, to, msg, should_commit=True) site, _ = open_root(get_default_config()) request = DummyRequest() request.params['thread_id'] = thread_id request.api = _DummyAPI() response = show_mbox_thread(site, request) self.assertTrue(isinstance(response['api'], _DummyAPI)) self.assertTrue(len(response['messages']), 1) message = response['messages'][0] flags = message['flags'] if flags: self.assertEquals(flags, ['READ']) self.assertEquals(message['from'], 'admin') self.assertEquals(message['from_country'], _country) self.assertEquals(message['from_firstname'], _firstname) self.assertEquals(message['from_lastname'], _lastname) self.assertEquals(message['from_photo'], '/test-thumb.jpg') self.assertEquals(message['payload'], payload) self.assertTrue(len(message['payload']) > 20) self.assertTrue(len(message['queue_id']) > 20) self.assertTrue(len(message['to_data']) == 2) to_data = message['to_data'] for to_datum in to_data: self.assertEquals(to_datum['country'], _country) self.assertEquals(to_datum['firstname'], _firstname) self.assertEquals(to_datum['lastname'], _lastname) name = to_datum['name'] self.assertTrue(name in ('joe', 'sarah')) self.assertEquals(to_datum['photo_url'], '/test-thumb.jpg') def test_add_message(self): subject = uuid.uuid4().hex payload = uuid.uuid4().hex site, _ = open_root(get_default_config()) to = find_profiles(site)['sarah'] with Replacer() as r: r.replace('opencore.views.mbox.authenticated_userid', _authenticated_user_id) r.replace('opencore.views.mbox._get_profile_details', lambda context, request, user: {}) request = DummyRequest(method='POST') request.api = DummyAPI() request.api.find_profile = (lambda userid: self.bob if userid == 'bob' else self.alice) request.POST = MultiDict([ ('to[]', 'bob'), ('subject', subject), ('payload', payload), ]) response = add_message(site, request) self.assertTrue("mbox_thread" in response.location) transaction.commit() def test_add_message_multiple_recipients(self): subject = uuid.uuid4().hex payload = uuid.uuid4().hex with Replacer() as r: r.replace('opencore.views.mbox.authenticated_userid', _authenticated_user_id) r.replace('opencore.views.mbox._get_profile_details', lambda context, request, user: {}) request = DummyRequest(method='POST') request.POST = MultiDict([ ('to[]', 'bob'), ('to[]', 'alice'), ('subject', subject), ('payload', payload), ]) request.api = DummyAPI() request.api.find_profile = (lambda userid: self.bob if userid == 'bob' else self.alice) response = add_message(self.context, request) # Mailboxes have been created self.assertTrue('bob.inbox' in self.context['mailboxes']) self.assertTrue('alice.inbox' in self.context['mailboxes']) # Queues have been created bob_inbox = self.context['mailboxes']['bob.inbox'] alice_inbox = self.context['mailboxes']['alice.inbox'] self.assertEquals(len(bob_inbox), 1) self.assertEquals(len(alice_inbox), 1) # Redirect to new message self.assertEquals( 'http://example.com/mbox_thread.html?' + urlencode({'thread_id': alice_inbox[0].id}) + '#last-message', response.location) r.restore() transaction.commit() def test_delete_message(self): api = uuid.uuid4().hex with Replacer() as r: r.replace('opencore.views.mbox.authenticated_userid', _authenticated_user_id) site, from_, _, msg, thread_id, msg_id, _, _, _, _ = get_data() to = find_profiles(site)['admin'] self.mbt.send_message(site, from_, to, msg, should_commit=True) request = DummyRequest() request.api = api request.params['thread_id'] = thread_id request.params['message_id'] = msg_id delete_message(site, request) transaction.commit() try: raw_msg, msg = self.mbt.get_message(site, from_, 'inbox', thread_id, msg_id) except NoSuchThreadException: pass else: raise Exception('Expected a NoSuchThreadException here') def test_mark_message_read(self): api = uuid.uuid4().hex with Replacer() as r: r.replace('opencore.views.mbox.authenticated_userid', _authenticated_user_id) site, from_, _, msg, thread_id, msg_id, _, _, _, _ = get_data() to = find_profiles(site)['admin'] self.mbt.send_message(site, from_, to, msg, should_commit=True) request = DummyRequest() request.api = api request.params['thread_id'] = thread_id request.params['message_id'] = msg_id mark_message_read(site, request) transaction.commit() raw_msg, msg = self.mbt.get_message(site, from_, 'inbox', thread_id, msg_id) self.assertEquals(raw_msg.flags, ['READ']) def test_get_unread(self): api = uuid.uuid4().hex user_name = 'admin' with Replacer() as r: r.replace('opencore.views.mbox.authenticated_userid', _authenticated_user_id) site, from_, _, msg, thread_id, msg_id, _, _, _, _ = get_data() to = find_profiles(site)[user_name] self.mbt.send_message(site, from_, to, msg, should_commit=True) request = DummyRequest() request.api = api request.params['thread_id'] = thread_id request.params['message_id'] = msg_id mark_message_read(site, request) transaction.commit() self.mbt.send_message(site, from_, to, msg, should_commit=True) transaction.commit() unread = self.mbt.get_unread(site, user_name) self.assertTrue(unread >= 0) def test_format_date(self): orig = '2011-05-31 13:59:50' expected = '31 May at 13:59' site, from_, _, msg, thread_id, msg_id, _, _, _, _ = get_data() given = _format_date(site, orig) self.assertEquals(expected, given)
def send(self, mfrom, profile, msg): root = find_site(profile) mbt = MailboxTool() mbt.send_message(root, mfrom, profile, msg)