예제 #1
0
파일: helpers.py 프로젝트: mgax/tinymail
 def get_message_headers(uid_list):
     name = state['name']
     message_headers = {}
     for uid in uid_list:
         i = folders[name]['index'][uid]
         message_headers[uid] = folders[name]['headers'][i]
     return defer(message_headers)
예제 #2
0
 def test_callback(self):
     cb = callback.defer('ok')
     self.assertTrue(isinstance(cb, callback.Callback))
     self.assertEqual(cb.result, 'ok')
     self.assertEqual(self.calls, [])
     cb.add(self.call)
     self.assertEqual(self.calls, ['ok'])
예제 #3
0
def test_defer():
    cb = defer('ok')
    assert isinstance(cb, Callback)
    assert cb.result == 'ok'
    calls = []
    cb.add(calls.append)
    assert calls == ['ok']
예제 #4
0
 def write(self, data):
     if isinstance(data, unicode):
         data = data.encode(self.write_encoding)
     self._check_closed()
     if data == "":
         # twisted won't ever tell us we flushed writing ""
         return defer(None)
     self.writing = True
     self._stack_conn.write(data)
     cb = self.flush()
     self._queue_timeout(cb)
     return cb
예제 #5
0
파일: __init__.py 프로젝트: niallo/monocle
 def write(self, data):
     if isinstance(data, unicode):
         data = data.encode(self.write_encoding)
     self._check_closed()
     if data == "":
         # twisted won't ever tell us we flushed writing ""
         return defer(None)
     self.writing = True
     self._stack_conn.write(data)
     cb = self.flush()
     self._queue_timeout(cb)
     return cb
예제 #6
0
파일: helpers.py 프로젝트: mgax/tinymail
 def copy_messages(src_uids, dst_folder_name):
     src_folder = folders[state['name']]
     dst_folder = folders[dst_folder_name]
     next_uid = max([0] + dst_folder['index'].keys()) + 1
     next_index = max([0] + dst_folder['index'].values()) + 1
     uid_map = {}
     for uid in src_uids:
         uid_map[uid] = next_uid
         i = src_folder['index'][uid]
         dst_folder['flags'][next_uid] = src_folder['flags'][uid]
         dst_folder['index'][next_uid] = next_index
         dst_folder['headers'][next_index] = src_folder['headers'][i]
         next_uid += 1; next_index += 1
     return defer({'UIDVALIDITY': dst_folder['uidvalidity'],
                   'uid_map': uid_map})
예제 #7
0
    def test_load_full_message(self):
        from tinymail.account import message_updated
        account = _account_for_test()
        mime_message = "Subject: hi\r\n\r\nHello world!"

        with mock_worker(fol1={6: None}) as worker:
            account.perform_update()
            message = account.get_folder('fol1')._messages[6]
            worker.get_message_body.return_value = defer(mime_message)
            worker.close_mailbox.reset_mock()
            with listen_for(message_updated) as caught_signals:
                message.load_full()

        self.assertEqual(message.raw_full, mime_message)
        self.assertEqual(caught_signals, [(message, {})])
        worker.close_mailbox.assert_called_once_with()
예제 #8
0
파일: helpers.py 프로젝트: mgax/tinymail
 def select_mailbox(name, readonly=True):
     state['name'] = name
     return defer({'MESSAGES': len(folders[name]['flags']),
                   'UIDVALIDITY': folders[name]['uidvalidity']})
예제 #9
0
파일: helpers.py 프로젝트: mgax/tinymail
def mock_worker(**imap_spec):
    from mock import Mock, patch
    from monocle.callback import defer
    from tinymail.imap_worker import ImapWorker

    worker = Mock(spec=ImapWorker)
    worker.done = Mock() # `done` is implemented by `AsyncWorkerProxy`
    state = {}

    folders = {}
    for name, mbox_spec in imap_spec.iteritems():
        folder = folders[name] = {'flags': {}, 'headers': {}, 'index': {}}
        folder['uidvalidity'] = mbox_spec.pop('UIDVALIDITY', 123456)
        for i, (uid, msg_spec) in enumerate(mbox_spec.iteritems()):
            if msg_spec is None:
                msg_spec = (uid, set(), "PLACEHOLDER HEADER")
            folder['flags'][uid] = msg_spec[1]
            folder['index'][uid] = i
            folder['headers'][i] = msg_spec[2]

    worker.connect.return_value = defer(None)

    worker.get_mailbox_names.return_value = defer(list(folders))

    def select_mailbox(name, readonly=True):
        state['name'] = name
        return defer({'MESSAGES': len(folders[name]['flags']),
                      'UIDVALIDITY': folders[name]['uidvalidity']})
    worker.select_mailbox = select_mailbox

    worker.get_message_flags = lambda: defer(folders[state['name']]['flags'])

    def get_message_headers(uid_list):
        name = state['name']
        message_headers = {}
        for uid in uid_list:
            i = folders[name]['index'][uid]
            message_headers[uid] = folders[name]['headers'][i]
        return defer(message_headers)
    worker.get_message_headers.side_effect = get_message_headers

    def copy_messages(src_uids, dst_folder_name):
        src_folder = folders[state['name']]
        dst_folder = folders[dst_folder_name]
        next_uid = max([0] + dst_folder['index'].keys()) + 1
        next_index = max([0] + dst_folder['index'].values()) + 1
        uid_map = {}
        for uid in src_uids:
            uid_map[uid] = next_uid
            i = src_folder['index'][uid]
            dst_folder['flags'][next_uid] = src_folder['flags'][uid]
            dst_folder['index'][next_uid] = next_index
            dst_folder['headers'][next_index] = src_folder['headers'][i]
            next_uid += 1; next_index += 1
        return defer({'UIDVALIDITY': dst_folder['uidvalidity'],
                      'uid_map': uid_map})
    worker.copy_messages.side_effect = copy_messages

    worker.change_flag.return_value = defer(None)
    worker.close_mailbox.return_value = defer(None)
    worker.disconnect.return_value = defer(None)
    worker.copy_messages.return_value = defer(None)

    with patch('tinymail.account._new_imap_worker', Mock(return_value=worker)):
        yield worker