public async Task StartHere()
        {
            ElasticClient elasticClient = CreateElasticClient();

            using (var processor = new ElasticEventIndexingProcessor(elasticClient, BlockchainUrl))
            {
                await ClearDown(processor);

                try
                {
                    // subscribe to transfer events
                    var transferEventProcessor = await processor.AddAsync <TransferEvent_ERC20>(TransferIndexName);

                    var blocksProcessed = await processor.ProcessAsync(3146684, 3146694);

                    Assert.Equal((ulong)11, blocksProcessed);
                    Assert.Equal(19, transferEventProcessor.Indexer.Indexed);

                    await Task.Delay(TimeSpan.FromSeconds(5)); // allow time for indexing

                    Assert.Equal(19, await transferEventProcessor.Indexer.DocumentCountAsync());
                }
                finally
                {
                    await ClearDown(processor);
                }
            }
        }
        public async Task StoringCustomSearchDocuments_UsingMapper()
        {
            ElasticClient elasticClient = CreateElasticClient();

            using (var processor = new ElasticEventIndexingProcessor(elasticClient, BlockchainUrl))
            {
                await ClearDown(processor);

                try
                {
                    var mapper = new CustomEventToSearchDocumentMapper();

                    // subscribe to transfer events
                    // inject a mapper to translate the event DTO to a search document DTO
                    var transferEventProcessor = await processor
                                                 .AddAsync <TransferEvent_ERC20, CustomTransferSearchDocumentDto>(
                        TransferIndexName, mapper);

                    var blocksProcessed = await processor.ProcessAsync(3146684, 3146694);

                    Assert.Equal((ulong)11, blocksProcessed);
                    Assert.Equal(19, transferEventProcessor.Indexer.Indexed);
                }
                finally
                {
                    await ClearDown(processor);
                }
            }
        }
        private static async Task ClearDown(ElasticEventIndexingProcessor processor)
        {
            #region test preparation
            await processor.ClearProgress();

            await processor.SearchService.DeleteIndexAsync(TransferIndexName);

            #endregion
        }