def test_thread_deletion_with_short_ttl(db, default_account, default_namespace, marked_deleted_message, thread, folder): handler = DeleteHandler( account_id=default_account.id, namespace_id=default_namespace.id, provider_name=default_account.provider, uid_accessor=lambda m: m.imapuids, message_ttl=0, thread_ttl=120, ) delete_time = marked_deleted_message.deleted_at handler.check(delete_time + timedelta(seconds=1)) handler.gc_deleted_threads(delete_time + timedelta(seconds=1)) db.session.expire_all() with pytest.raises(ObjectDeletedError): marked_deleted_message.id thread.id assert thread.deleted_at is not None handler.check(thread.deleted_at + timedelta(seconds=121)) handler.gc_deleted_threads(thread.deleted_at + timedelta(seconds=121)) db.session.expire_all() with pytest.raises(ObjectDeletedError): marked_deleted_message.id with pytest.raises(ObjectDeletedError): thread.id
def test_deletion_creates_revision(db, default_account, default_namespace, marked_deleted_message, thread, folder): message_id = marked_deleted_message.id thread_id = thread.id handler = DeleteHandler( account_id=default_account.id, namespace_id=default_namespace.id, provider_name=default_account.provider, uid_accessor=lambda m: m.imapuids, message_ttl=0, ) handler.check(marked_deleted_message.deleted_at + timedelta(seconds=1)) db.session.commit() latest_message_transaction = (db.session.query(Transaction).filter( Transaction.record_id == message_id, Transaction.object_type == "message", Transaction.namespace_id == default_namespace.id, ).order_by(desc(Transaction.id)).first()) assert latest_message_transaction.command == "delete" latest_thread_transaction = (db.session.query(Transaction).filter( Transaction.record_id == thread_id, Transaction.object_type == "thread", Transaction.namespace_id == default_namespace.id, ).order_by(desc(Transaction.id)).first()) assert latest_thread_transaction.command == "update"
def test_thread_deletion_with_short_ttl(db, default_account, default_namespace, marked_deleted_message, thread, folder): handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, provider_name=default_account.provider, uid_accessor=lambda m: m.imapuids, message_ttl=0, thread_ttl=120) delete_time = marked_deleted_message.deleted_at handler.check(delete_time + timedelta(seconds=1)) handler.gc_deleted_threads(delete_time + timedelta(seconds=1)) db.session.expire_all() with pytest.raises(ObjectDeletedError): marked_deleted_message.id thread.id assert thread.deleted_at is not None handler.check(thread.deleted_at + timedelta(seconds=121)) handler.gc_deleted_threads(thread.deleted_at + timedelta(seconds=121)) db.session.expire_all() with pytest.raises(ObjectDeletedError): marked_deleted_message.id with pytest.raises(ObjectDeletedError): thread.id
def test_non_orphaned_messages_get_unmarked(db, default_account, default_namespace, marked_deleted_message, thread, folder, imapuid): handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, uid_accessor=lambda m: m.imapuids, message_ttl=0) handler.check(marked_deleted_message.deleted_at + timedelta(seconds=1)) db.session.expire_all() # message actually has an imapuid associated, so check that the # DeleteHandler unmarked it. assert marked_deleted_message.deleted_at is None
def test_deletion_with_short_ttl(db, default_account, default_namespace, marked_deleted_message, thread, folder): handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, uid_accessor=lambda m: m.imapuids, message_ttl=0) handler.check(marked_deleted_message.deleted_at + timedelta(seconds=1)) db.session.expire_all() # Check that objects were actually deleted with pytest.raises(ObjectDeletedError): marked_deleted_message.id with pytest.raises(ObjectDeletedError): thread.id
def test_non_orphaned_messages_get_unmarked(db, default_account, default_namespace, message, thread, folder, imapuid): message.deleted_at = datetime.utcnow() db.session.commit() handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, uid_accessor=lambda m: m.imapuids, message_ttl=0) handler.check() # message actually has an imapuid associated, so check that the # DeleteHandler unmarked it. assert message.deleted_at is None
def test_deletion_deferred_with_longer_ttl(db, default_account, default_namespace, message, thread, folder, imapuid): msg_uid = imapuid.msg_uid handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, uid_accessor=lambda m: m.imapuids, message_ttl=1) remove_deleted_uids(default_account.id, db.session, [msg_uid], folder.id) handler.check() # Would raise ObjectDeletedError if objects were deleted message.id thread.id
def test_deletion_deferred_with_longer_ttl(db, default_account, default_namespace, marked_deleted_message, thread, folder): handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, uid_accessor=lambda m: m.imapuids, message_ttl=5) db.session.commit() handler.check(marked_deleted_message.deleted_at + timedelta(seconds=1)) # Would raise ObjectDeletedError if objects were deleted marked_deleted_message.id thread.id
def test_deletion_with_short_ttl(db, default_account, default_namespace, message, thread, folder, imapuid): msg_uid = imapuid.msg_uid handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, uid_accessor=lambda m: m.imapuids, message_ttl=0) remove_deleted_uids(default_account.id, db.session, [msg_uid], folder.id) handler.check() # Check that objects were actually deleted with pytest.raises(ObjectDeletedError): message.id with pytest.raises(ObjectDeletedError): thread.id
def test_threads_only_deleted_when_no_messages_left(db, default_account, default_namespace, message, thread, folder, imapuid): msg_uid = imapuid.msg_uid handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, uid_accessor=lambda m: m.imapuids, message_ttl=0) # Add another message onto the thread add_fake_message(db.session, default_namespace.id, thread) remove_deleted_uids(default_account.id, db.session, [msg_uid], folder.id) handler.check() # Check that the orphaned message was deleted. with pytest.raises(ObjectDeletedError): message.id # Would raise ObjectDeletedError if thread was deleted. thread.id
def test_threads_only_deleted_when_no_messages_left(db, default_account, default_namespace, marked_deleted_message, thread, folder): handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, uid_accessor=lambda m: m.imapuids, message_ttl=0) # Add another message onto the thread add_fake_message(db.session, default_namespace.id, thread) handler.check(marked_deleted_message.deleted_at + timedelta(seconds=1)) db.session.expire_all() # Check that the orphaned message was deleted. with pytest.raises(ObjectDeletedError): marked_deleted_message.id # Would raise ObjectDeletedError if thread was deleted. thread.id
def test_deletion_creates_revision(db, default_account, default_namespace, marked_deleted_message, thread, folder): message_id = marked_deleted_message.id thread_id = thread.id handler = DeleteHandler(account_id=default_account.id, namespace_id=default_namespace.id, uid_accessor=lambda m: m.imapuids, message_ttl=0) handler.check(marked_deleted_message.deleted_at + timedelta(seconds=1)) db.session.commit() latest_message_transaction = db.session.query(Transaction). \ filter(Transaction.record_id == message_id, Transaction.object_type == 'message', Transaction.namespace_id == default_namespace.id). \ order_by(desc(Transaction.id)).first() assert latest_message_transaction.command == 'delete' latest_thread_transaction = db.session.query(Transaction). \ filter(Transaction.record_id == thread_id, Transaction.object_type == 'thread', Transaction.namespace_id == default_namespace.id). \ order_by(desc(Transaction.id)).first() assert latest_thread_transaction.command == 'delete'