public async Task MonitoringCoinTransactionJobUnitTest_TransactionIsInBlockchainSenhdEvent()
        {
            string operationId             = "OpId-2";
            QueueTriggeringContext context = new QueueTriggeringContext(DateTimeOffset.UtcNow);
            CoinTransactionMessage coinTransactionMessage = new CoinTransactionMessage()
            {
                PutDateTime     = DateTime.UtcNow,
                TransactionHash = _commitedTransactionHash,
                OperationId     = operationId
            };

            #region ArrangeMocks
            ICoinTransaction coinTransaction = new CoinTransaction()
            {
                ConfirmationLevel = 1,
                TransactionHash   = _commitedTransactionHash
            };
            ICoinEvent coinEvent = new CoinEvent(operationId,
                                                 _commitedTransactionHash, "from", "to", "1000000000000000000", CoinEventType.TransferStarted, "contractAddress", true);
            _ethereumTransactionService.Setup(x => x.IsTransactionInPool(_commitedTransactionHash)).Returns(Task.FromResult(false));
            _coinTransactionService.Setup(x => x.ProcessTransaction(coinTransactionMessage)).Returns(Task.FromResult <ICoinTransaction>(coinTransaction));
            _coinEventService.Setup(x => x.GetCoinEvent(_commitedTransactionHash)).Returns(Task.FromResult <ICoinEvent>(coinEvent));
            _coinEventService.Setup(x => x.PublishEvent(coinEvent, It.IsAny <bool>())).Returns(Task.FromResult(0)).Verifiable();

            #endregion

            MonitoringCoinTransactionJob job = GetJob();
            await job.Execute(coinTransactionMessage, context);

            _coinEventService.Verify(x => x.PublishEvent(coinEvent, It.IsAny <bool>()), Times.Once);
        }
        public async Task MonitoringCoinTransactionJobUnitTest_LostTransactionProcessing()
        {
            string operationId             = "OpId-3";
            QueueTriggeringContext context = new QueueTriggeringContext(DateTimeOffset.UtcNow);
            CoinTransactionMessage coinTransactionMessage = new CoinTransactionMessage()
            {
                PutDateTime     = DateTime.UtcNow,
                TransactionHash = _lostTransactionHash,
                OperationId     = operationId
            };

            #region ArrangeMocks

            ICoinEvent coinEvent = new CoinEvent(operationId,
                                                 _lostTransactionHash, "from", "to", "1000000000000000000", CoinEventType.TransferStarted, "contractAddress", true);
            _ethereumTransactionService.Setup(x => x.IsTransactionInPool(_lostTransactionHash)).Returns(Task.FromResult(false));
            _coinTransactionService.Setup(x => x.ProcessTransaction(coinTransactionMessage)).Returns(Task.FromResult <ICoinTransaction>(null));
            _coinEventService.Setup(x => x.GetCoinEvent(_lostTransactionHash)).Returns(Task.FromResult <ICoinEvent>(coinEvent));
            _coinEventService.Setup(x => x.PublishEvent(coinEvent, It.IsAny <bool>())).Returns(Task.FromResult(0)).Verifiable();
            _pendingOperationService.Setup(x => x.RefreshOperationByIdAsync(operationId)).Returns(Task.FromResult(0)).Verifiable();

            #endregion

            MonitoringCoinTransactionJob job = GetJob();
            await job.Execute(coinTransactionMessage, context);

            _coinEventService.Verify(x => x.PublishEvent(coinEvent, It.IsAny <bool>()), Times.Never);
            _pendingOperationService.Verify(x => x.RefreshOperationByIdAsync(operationId), Times.Once);
        }
        public async Task MonitoringCoinTransactionJobUnitTest_SkipTransactionThatIsStillInMemoryPool()
        {
            string operationId             = "OpId-1";
            QueueTriggeringContext context = new QueueTriggeringContext(DateTimeOffset.UtcNow);
            CoinTransactionMessage coinTransactionMessage = new CoinTransactionMessage()
            {
                PutDateTime     = DateTime.UtcNow,
                TransactionHash = _memoryPoolTransactionHash,
                OperationId     = operationId
            };

            #region ArrangeMocks

            _ethereumTransactionService.Setup(x => x.IsTransactionInPool(_memoryPoolTransactionHash)).Returns(Task.FromResult(true));
            _coinTransactionService.Setup(x => x.ProcessTransaction(coinTransactionMessage)).Verifiable();

            #endregion

            MonitoringCoinTransactionJob job = GetJob();
            await job.Execute(coinTransactionMessage, context);

            _coinTransactionService.Verify(x => x.ProcessTransaction(coinTransactionMessage), Times.Never);
        }