def test_index_deletions(self):
    old_entity = self.get_new_entity_proto(*self.BASIC_ENTITY)

    # No deletions should occur when the entity doesn't change.
    db_batch = flexmock()
    db_batch.should_receive('valid_data_version').and_return(True)
    dd = DatastoreDistributed(db_batch, None)
    self.assertListEqual([], dd.index_deletions(old_entity, old_entity))

    # When a property changes, the previous index entries should be deleted.
    new_entity = entity_pb.EntityProto()
    new_entity.MergeFrom(old_entity)
    new_entity.property_list()[0].value().set_stringvalue('updated content')

    deletions = dd.index_deletions(old_entity, new_entity)
    self.assertEqual(len(deletions), 2)
    self.assertEqual(deletions[0]['table'], dbconstants.ASC_PROPERTY_TABLE)
    self.assertEqual(deletions[1]['table'], dbconstants.DSC_PROPERTY_TABLE)

    prop = old_entity.add_property()
    prop.set_name('author')
    value = prop.mutable_value()
    value.set_stringvalue('author1')

    prop = new_entity.add_property()
    prop.set_name('author')
    value = prop.mutable_value()
    value.set_stringvalue('author1')

    # When given an index, an entry should be removed from the composite table.
    composite_index = entity_pb.CompositeIndex()
    composite_index.set_id(123)
    composite_index.set_app_id('guestbook')
    definition = composite_index.mutable_definition()
    definition.set_entity_type('Greeting')
    prop1 = definition.add_property()
    prop1.set_name('content')
    prop1.set_direction(datastore_pb.Query_Order.ASCENDING)
    prop2 = definition.add_property()
    prop2.set_name('author')
    prop1.set_direction(datastore_pb.Query_Order.ASCENDING)
    deletions = dd.index_deletions(old_entity, new_entity, (composite_index,))
    self.assertEqual(len(deletions), 3)
    self.assertEqual(deletions[0]['table'], dbconstants.ASC_PROPERTY_TABLE)
    self.assertEqual(deletions[1]['table'], dbconstants.DSC_PROPERTY_TABLE)
    self.assertEqual(deletions[2]['table'], dbconstants.COMPOSITE_TABLE)

    # No composite deletions should occur when the entity type differs.
    definition.set_entity_type('TestEntity')
    deletions = dd.index_deletions(old_entity, new_entity, (composite_index,))
    self.assertEqual(len(deletions), 2)