def test_threading_limit(db, folder_sync_engine, monkeypatch): """Test that custom threading doesn't produce arbitrarily long threads, which eventually break things.""" from inbox.models import Message, Thread, Account # Shorten bound to make test faster MAX_THREAD_LENGTH = 10 monkeypatch.setattr( 'inbox.mailsync.backends.imap.generic.MAX_THREAD_LENGTH', MAX_THREAD_LENGTH) namespace_id = folder_sync_engine.namespace_id account = db.session.query(Account).get(folder_sync_engine.account_id) account.inbox_folder = Folder(account=account, name='Inbox', canonical_name='inbox') folder = account.inbox_folder msg = MockRawMessage([]) for i in range(3 * MAX_THREAD_LENGTH): m = Message() m.namespace_id = namespace_id m.received_date = datetime.datetime.utcnow() m.references = [] m.size = 0 m.sanitized_body = '' m.snippet = '' m.subject = 'unique subject' uid = ImapUid(message=m, account=account, msg_uid=2222 + i, folder=folder) folder_sync_engine.add_message_attrs(db.session, uid, msg, folder) db.session.add(m) db.session.commit() new_threads = db.session.query(Thread). \ filter(Thread.subject == 'unique subject').all() assert len(new_threads) == 3 assert all(len(thread.messages) == MAX_THREAD_LENGTH for thread in new_threads)
def test_threading_limit(db, folder_sync_engine, monkeypatch): """Test that custom threading doesn't produce arbitrarily long threads, which eventually break things.""" from inbox.models import Message, Thread # Shorten bound to make test faster MAX_THREAD_LENGTH = 10 monkeypatch.setattr( 'inbox.mailsync.backends.imap.generic.MAX_THREAD_LENGTH', MAX_THREAD_LENGTH) namespace_id = folder_sync_engine.namespace_id msg = MockRawMessage([]) for i in range(3 * MAX_THREAD_LENGTH): m = Message() m.namespace_id = namespace_id m.received_date = datetime.datetime.utcnow() m.references = [] m.size = 0 m.body = '' m.from_addr = [("Karim Hamidou", "*****@*****.**")] m.to_addr = [("Eben Freeman", "*****@*****.**")] m.snippet = '' m.subject = 'unique subject' db.session.add(m) folder_sync_engine.add_message_to_thread(db.session, m, msg) db.session.commit() new_threads = db.session.query(Thread). \ filter(Thread.subject == 'unique subject').all() assert len(new_threads) == 3 assert all(len(thread.messages) == MAX_THREAD_LENGTH for thread in new_threads)
def add_fake_message(db_session, namespace_id, thread=None, from_addr=None, to_addr=None, cc_addr=None, bcc_addr=None, received_date=None, subject='', body='', snippet=''): from inbox.models import Message from inbox.contacts.process_mail import update_contacts_from_message m = Message() m.namespace_id = namespace_id m.from_addr = from_addr or [] m.to_addr = to_addr or [] m.cc_addr = cc_addr or [] m.bcc_addr = bcc_addr or [] m.received_date = received_date or datetime.utcnow() m.size = 0 m.is_read = False m.is_starred = False m.body = body m.snippet = snippet m.subject = subject if thread: thread.messages.append(m) update_contacts_from_message(db_session, m, thread.namespace) db_session.add(m) db_session.commit() return m
def test_threading_limit(db, folder_sync_engine, monkeypatch): """Test that custom threading doesn't produce arbitrarily long threads, which eventually break things.""" from inbox.models import Message, Thread, Account # Shorten bound to make test faster MAX_THREAD_LENGTH = 10 monkeypatch.setattr( 'inbox.mailsync.backends.imap.generic.MAX_THREAD_LENGTH', MAX_THREAD_LENGTH) namespace_id = folder_sync_engine.namespace_id account = db.session.query(Account).get(folder_sync_engine.account_id) folder = MockFolder('inbox', 'inbox') msg = MockRawMessage(None) for _ in range(3 * MAX_THREAD_LENGTH): m = Message() m.namespace_id = namespace_id m.received_date = datetime.datetime.utcnow() m.references = [] m.size = 0 m.sanitized_body = '' m.snippet = '' m.subject = 'unique subject' uid = MockImapUID(m, account) folder_sync_engine.add_message_attrs(db.session, uid, msg, folder) db.session.add(m) db.session.commit() new_threads = db.session.query(Thread). \ filter(Thread.subject == 'unique subject').all() assert len(new_threads) == 3 assert all( len(thread.messages) == MAX_THREAD_LENGTH for thread in new_threads)
def add_fake_message(db_session, namespace_id, thread=None, from_addr=None, to_addr=None, cc_addr=None, bcc_addr=None, received_date=None, subject='', body='', snippet='', add_sent_category=False): from inbox.models import Message, Category from inbox.contacts.process_mail import update_contacts_from_message m = Message() m.namespace_id = namespace_id m.from_addr = from_addr or [] m.to_addr = to_addr or [] m.cc_addr = cc_addr or [] m.bcc_addr = bcc_addr or [] m.received_date = received_date or datetime.utcnow() m.size = 0 m.is_read = False m.is_starred = False m.body = body m.snippet = snippet m.subject = subject if thread: thread.messages.append(m) update_contacts_from_message(db_session, m, thread.namespace) db_session.add(m) db_session.commit() if add_sent_category: category = Category.find_or_create( db_session, namespace_id, 'sent', 'sent', type_='folder') if category not in m.categories: m.categories.add(category) db_session.commit() return m
def add_fake_message(db_session, namespace_id, thread=None, from_addr=None, to_addr=None, cc_addr=None, bcc_addr=None, received_date=None, subject=None): from inbox.models import Message from inbox.contacts.process_mail import update_contacts_from_message m = Message() m.namespace_id = namespace_id m.from_addr = from_addr or [] m.to_addr = to_addr or [] m.cc_addr = cc_addr or [] m.bcc_addr = bcc_addr or [] m.received_date = received_date or datetime.utcnow() m.size = 0 m.sanitized_body = '' m.snippet = '' m.subject = subject or '' if thread: thread.messages.append(m) update_contacts_from_message(db_session, m, thread.namespace) db_session.add(m) db_session.commit() return m
def add_fake_message( db_session, namespace_id, thread=None, from_addr=None, to_addr=None, cc_addr=None, bcc_addr=None, received_date=None, subject="", body="", snippet="", g_msgid=None, add_sent_category=False, ): from inbox.contacts.processing import update_contacts_from_message from inbox.models import Category, Message m = Message() m.namespace_id = namespace_id m.from_addr = from_addr or [] m.to_addr = to_addr or [] m.cc_addr = cc_addr or [] m.bcc_addr = bcc_addr or [] m.received_date = received_date or datetime.utcnow() m.size = 0 m.is_read = False m.is_starred = False m.body = body m.snippet = snippet m.subject = subject m.g_msgid = g_msgid if thread: thread.messages.append(m) update_contacts_from_message(db_session, m, thread.namespace.id) db_session.add(m) db_session.commit() if add_sent_category: category = Category.find_or_create(db_session, namespace_id, "sent", "sent", type_="folder") if category not in m.categories: m.categories.add(category) db_session.commit() return m
def add_fake_message(namespace_id, thread, to_email, received_date, subject, db_session): """ One-off helper function to add 'fake' messages to the datastore.""" m = Message() m.namespace_id = namespace_id m.from_addr = [('', to_email)] m.received_date = received_date m.subject = subject m.size = 0 m.sanitized_body = '' m.snippet = '' m.thread = thread update_contacts_from_message(db_session, m, thread.namespace) db_session.add(m) db_session.commit()
def add_fake_message(db_session, thread, from_addr=None, to_addr=None, cc_addr=None, bcc_addr=None): m = Message() m.namespace_id = NAMESPACE_ID m.from_addr = from_addr or [] m.to_addr = to_addr or [] m.cc_addr = cc_addr or [] m.bcc_addr = bcc_addr or [] m.received_date = datetime.utcnow() m.size = 0 m.sanitized_body = '' m.snippet = '' m.thread = thread update_contacts_from_message(db_session, m, thread.namespace) db_session.add(m) db_session.commit() return m
def add_fake_message(db_session, namespace_id, thread=None, from_addr=None, to_addr=None, cc_addr=None, bcc_addr=None, received_date=None, subject='', body='', snippet='', add_sent_category=False): from inbox.models import Message, Category from inbox.contacts.process_mail import update_contacts_from_message m = Message() m.namespace_id = namespace_id m.from_addr = from_addr or [] m.to_addr = to_addr or [] m.cc_addr = cc_addr or [] m.bcc_addr = bcc_addr or [] m.received_date = received_date or datetime.utcnow() m.size = 0 m.is_read = False m.is_starred = False m.body = body m.snippet = snippet m.subject = subject if thread: thread.messages.append(m) update_contacts_from_message(db_session, m, thread.namespace) db_session.add(m) db_session.commit() if add_sent_category: category = Category.find_or_create(db_session, namespace_id, 'sent', 'sent', type_='folder') if category not in m.categories: m.categories.add(category) db_session.commit() return m
def test_soft_delete(db, config): from inbox.models import Folder, Message from inbox.models.backends.imap import ImapUid f = Folder(name='DOES NOT EXIST', account_id=ACCOUNT_ID) db.session.add(f) db.session.flush() m = Message() m.namespace_id = NAMESPACE_ID m.thread_id = 1 m.received_date = datetime.datetime.utcnow() m.size = 0 m.sanitized_body = "" m.snippet = "" u = ImapUid(message=m, account_id=ACCOUNT_ID, folder_id=f.id, msg_uid=9999, extra_flags="") db.session.add_all([m, u]) f.mark_deleted() u.mark_deleted() db.session.commit() m_id = m.id # bypass custom query method to confirm creation db.new_session(ignore_soft_deletes=False) f = db.session.query(Folder).filter_by(name='DOES NOT EXIST').one() assert f, "Can't find Folder object" assert f.deleted_at is not None, "Folder not marked as deleted" db.new_session(ignore_soft_deletes=True) with pytest.raises(NoResultFound): db.session.query(Folder).filter(Folder.name == 'DOES NOT EXIST').one() count = db.session.query(Folder).filter( Folder.name == 'DOES NOT EXIST').count() assert count == 0, "Shouldn't find any deleted folders!" m = db.session.query(Message).filter_by(id=m_id).one() assert not m.imapuids, "imapuid was deleted!"
def add_fake_message(db_session, namespace_id, thread, from_addr=None, to_addr=None, cc_addr=None, bcc_addr=None, received_date=None, subject=None): from inbox.models import Message from inbox.contacts.process_mail import update_contacts_from_message m = Message() m.namespace_id = namespace_id m.from_addr = from_addr or [] m.to_addr = to_addr or [] m.cc_addr = cc_addr or [] m.bcc_addr = bcc_addr or [] m.received_date = received_date or datetime.utcnow() m.size = 0 m.sanitized_body = '' m.snippet = '' m.subject = subject or '' m.thread = thread update_contacts_from_message(db_session, m, thread.namespace) db_session.add(m) db_session.commit() return m
def test_threading_limit(db, folder_sync_engine, monkeypatch): """Test that custom threading doesn't produce arbitrarily long threads, which eventually break things.""" from inbox.models import Message, Thread, Account # Shorten bound to make test faster MAX_THREAD_LENGTH = 10 monkeypatch.setattr( 'inbox.mailsync.backends.imap.generic.MAX_THREAD_LENGTH', MAX_THREAD_LENGTH) namespace_id = folder_sync_engine.namespace_id account = db.session.query(Account).get(folder_sync_engine.account_id) account.namespace.create_canonical_tags() account.inbox_folder = Folder(account=account, name='Inbox', canonical_name='inbox') folder = account.inbox_folder msg = MockRawMessage([]) for i in range(3 * MAX_THREAD_LENGTH): m = Message() m.namespace_id = namespace_id m.received_date = datetime.datetime.utcnow() m.references = [] m.size = 0 m.sanitized_body = '' m.from_addr = [("Karim Hamidou", "*****@*****.**")] m.to_addr = [("Eben Freeman", "*****@*****.**")] m.snippet = '' m.subject = 'unique subject' uid = ImapUid(message=m, account=account, msg_uid=2222 + i, folder=folder) folder_sync_engine.add_message_attrs(db.session, uid, msg) db.session.add(m) db.session.commit() new_threads = db.session.query(Thread). \ filter(Thread.subject == 'unique subject').all() assert len(new_threads) == 3 assert all(len(thread.messages) == MAX_THREAD_LENGTH for thread in new_threads)