public async Task SendsToIndexInBatches() { var indexer = new Mock <IFunctionIndexer <TestFunctionMessageDto> >(); var handler = new FunctionIndexTransactionHandler <TestFunctionMessageDto>(indexer.Object, logsPerIndexBatch: 2); var transaction1 = new Mock <TransactionWithReceipt>(); var transaction2 = new Mock <TransactionWithReceipt>(); var dto1 = new TestFunctionMessageDto(); var dto2 = new TestFunctionMessageDto(); transaction1.Setup(t => t.IsForFunction <TestFunctionMessageDto>()).Returns(true); transaction2.Setup(t => t.IsForFunction <TestFunctionMessageDto>()).Returns(true); transaction1.Setup(t => t.Decode <TestFunctionMessageDto>()).Returns(dto1); transaction2.Setup(t => t.Decode <TestFunctionMessageDto>()).Returns(dto2); var indexedFunctionCalls = CaptureCallsToIndexer(indexer); await handler.HandleTransactionAsync(transaction1.Object); Assert.Empty(indexedFunctionCalls); Assert.Equal(1, handler.Pending); await handler.HandleTransactionAsync(transaction2.Object); Assert.Equal(2, indexedFunctionCalls.Count); Assert.Equal(0, handler.Pending); }
public async Task IndexingTransferFunctions() { using (var azureSearchService = new AzureSearchService(AzureSearchServiceName, _azureSearchApiKey)) { await azureSearchService.DeleteIndexAsync(AzureTransferIndexName); using (var azureFunctionMessageIndexer = await azureSearchService.GetOrCreateFunctionIndex <TransferFunction>(indexName: AzureTransferIndexName)) { var transferHandler = new FunctionIndexTransactionHandler <TransferFunction>(azureFunctionMessageIndexer); var web3 = new Web3.Web3("https://rinkeby.infura.io/v3/25e7b6dfc51040b3bfc0e47317d38f60"); var blockchainProxy = new BlockchainProxyService(web3); var handlers = new HandlerContainer { TransactionHandler = transferHandler }; var blockProcessor = BlockProcessorFactory.Create(blockchainProxy, handlers); var processingStrategy = new ProcessingStrategy(blockProcessor); var blockchainProcessor = new BlockchainProcessor(processingStrategy); var blockRange = new BlockRange(3146684, 3146694); await blockchainProcessor.ProcessAsync(blockRange); await Task.Delay(TimeSpan.FromSeconds(5)); //ensure we have written the expected docs to the index Assert.Equal(3, await azureFunctionMessageIndexer.DocumentCountAsync()); } await azureSearchService.DeleteIndexAsync(AzureTransferIndexName); } }
public async Task <FunctionIndexTransactionHandler <TFunctionMessage> > CreateFunctionHandlerAsync <TFunctionMessage, TSearchDocument>( Index index, IFunctionMessageToSearchDocumentMapper <TFunctionMessage, TSearchDocument> mapper) where TFunctionMessage : FunctionMessage, new() where TSearchDocument : class, new() { var functionIndexer = await AzureSearchService.CreateFunctionIndexer <TFunctionMessage, TSearchDocument>(index, mapper); var functionHandler = new FunctionIndexTransactionHandler <TFunctionMessage>(functionIndexer); return(functionHandler); }
public async Task <FunctionIndexTransactionHandler <TFunctionMessage> > CreateFunctionHandlerAsync <TFunctionMessage, TSearchDocument>( string indexName, IFunctionMessageToSearchDocumentMapper <TFunctionMessage, TSearchDocument> mapper) where TFunctionMessage : FunctionMessage, new() where TSearchDocument : class, IHasId, new() { var functionIndexer = await _elasticSearchService.CreateFunctionIndexer <TFunctionMessage, TSearchDocument>(indexName, mapper); var functionHandler = new FunctionIndexTransactionHandler <TFunctionMessage>(functionIndexer); return(functionHandler); }
public async Task WillIgnoreLogsThatDoNotMatchTheEvent() { var indexer = new Mock <IFunctionIndexer <TestFunctionMessageDto> >(); var handler = new FunctionIndexTransactionHandler <TestFunctionMessageDto>(indexer.Object, logsPerIndexBatch: 1); var transaction1 = new Mock <TransactionWithReceipt>(); transaction1.Setup(t => t.IsForFunction <TestFunctionMessageDto>()).Returns(false); var indexedFunctionCalls = CaptureCallsToIndexer(indexer); await handler.HandleTransactionAsync(transaction1.Object); Assert.Empty(indexedFunctionCalls); Assert.Equal(0, handler.Pending); }
public async Task IndexingTransferFunctions() { using (var azureSearchService = new AzureSearchService(AzureSearchServiceName, _azureSearchApiKey)) { await azureSearchService.DeleteIndexAsync(AzureTransferIndexName); try { using (var azureFunctionMessageIndexer = await azureSearchService.CreateFunctionIndexer <TransferFunction>( indexName: AzureTransferIndexName)) { var transferHandler = new FunctionIndexTransactionHandler <TransferFunction>(azureFunctionMessageIndexer); var web3 = new Web3.Web3(TestConfiguration.BlockchainUrls.Infura.Rinkeby); var blockchainProxy = new BlockchainProxyService(web3); var handlers = new HandlerContainer { TransactionHandler = transferHandler }; var blockProcessor = BlockProcessorFactory.Create(blockchainProxy, handlers); var processingStrategy = new ProcessingStrategy(blockProcessor); var blockchainProcessor = new BlockchainProcessor(processingStrategy); var blockRange = new BlockRange(3146684, 3146694); await blockchainProcessor.ProcessAsync(blockRange); await Task.Delay(TimeSpan.FromSeconds(5)); //ensure we have written the expected docs to the index Assert.Equal(3, await azureFunctionMessageIndexer.DocumentCountAsync()); } } finally { await azureSearchService.DeleteIndexAsync(AzureTransferIndexName); } } }
public async Task WhenDisposeIsCalledWillAttemptToIndexPendingItems() { var indexer = new Mock <IFunctionIndexer <TestFunctionMessageDto> >(); var indexedFunctionCalls = CaptureCallsToIndexer(indexer); using (var handler = new FunctionIndexTransactionHandler <TestFunctionMessageDto>(indexer.Object, logsPerIndexBatch: 2)) { var transaction1 = new Mock <TransactionWithReceipt>(); var dto1 = new TestFunctionMessageDto(); transaction1.Setup(t => t.IsForFunction <TestFunctionMessageDto>()).Returns(true); transaction1.Setup(t => t.Decode <TestFunctionMessageDto>()).Returns(dto1); await handler.HandleTransactionAsync(transaction1.Object); Assert.Equal(1, handler.Pending); } //calling dispose should cause app to process remaining pending items Assert.Single(indexedFunctionCalls); }