示例#1
0
        public RiskControlSagaTests()
        {
            _logFactory          = LogFactory.Create().AddUnbufferedConsole();
            _chaosKittyMock      = new Mock <IChaosKitty>();
            _eventsPublisherMock = new Mock <IEventPublisher>();
            _commandSender       = new Mock <ICommandSender>();
            _cashoutRiskControlRepositoryMock = new Mock <ICashoutRiskControlRepository>();
            _batchRepositoryMock = new Mock <ICashoutsBatchRepository>();
            _closedBatchedCashoutsRepositoryMock = new Mock <IClosedBatchedCashoutRepository>();
            _activeCashoutsBatchIdRepositoryMock = new Mock <IActiveCashoutsBatchIdRepository>();
            _assetsServiceMock = new Mock <IAssetsServiceWithCache>();
            _walletsClientMock = new Mock <IBlockchainWalletsClient>();
            _cqrsSettings      = new CqrsSettings
            {
                RabbitConnectionString = "fake-connection-string",
                RetryDelay             = TimeSpan.FromSeconds(30)
            };
            _blockchainConfigurationProvider = new BlockchainConfigurationsProvider
                                               (
                _logFactory,
                new Dictionary <string, BlockchainConfiguration>
            {
                { "Bitcoin", new BlockchainConfiguration("HotWallet", false, null) }
            }
                                               );

            _asset = new Asset
            {
                Id = "LykkeBTC",
                BlockchainIntegrationLayerId      = "Bitcoin",
                BlockchainIntegrationLayerAssetId = "BTC"
            };

            _aggregate = null;

            _cashoutRiskControlRepositoryMock
            .Setup(x => x.GetOrAddAsync(
                       It.IsAny <Guid>(),
                       It.IsAny <Func <CashoutRiskControlAggregate> >()))
            .ReturnsAsync((Guid opId, Func <CashoutRiskControlAggregate> factory) => _aggregate ?? (_aggregate = factory()));

            _cashoutRiskControlRepositoryMock
            .Setup(x => x.SaveAsync(It.IsAny <CashoutRiskControlAggregate>()))
            .Callback((CashoutRiskControlAggregate agg) => _aggregate = agg)
            .Returns(Task.CompletedTask);

            _cashoutRiskControlRepositoryMock
            .Setup(x => x.TryGetAsync(It.IsAny <Guid>()))
            .ReturnsAsync((Guid opId) => opId == _aggregate?.OperationId ? _aggregate : null);

            _assetsServiceMock
            .Setup(x => x.TryGetAssetAsync(
                       It.Is <string>(p => p == "LykkeBTC"),
                       It.IsAny <CancellationToken>()))
            .ReturnsAsync(() => _asset);

            _walletsClientMock
            .Setup(x => x.TryGetClientIdAsync(
                       It.Is <string>(p => p == "Bitcoin"),
                       It.IsAny <string>()))
            .ReturnsAsync((Guid?)null);

            _startCashoutCommandsHandler = new StartCashoutCommandsHandler(_logFactory, _blockchainConfigurationProvider, _assetsServiceMock.Object, new Mock <IHttpClientFactory>().Object);

            _notifyCashoutFailedCommandsHandler = new NotifyCashoutFailedCommandsHandler();

            _acceptCashoutCommandsHandler = new AcceptCashoutCommandsHandler(
                _chaosKittyMock.Object,
                _batchRepositoryMock.Object,
                _closedBatchedCashoutsRepositoryMock.Object,
                _activeCashoutsBatchIdRepositoryMock.Object,
                _blockchainConfigurationProvider,
                _walletsClientMock.Object,
                _cqrsSettings,
                false);

            _saga = new RiskControlSaga(_chaosKittyMock.Object, _cashoutRiskControlRepositoryMock.Object);

            _eventsPublisherMock.Setup(x => x.PublishEvent(It.IsAny <ValidationStartedEvent>()))
            .Callback((object evt) => _saga.Handle((ValidationStartedEvent)evt, _commandSender.Object));

            _eventsPublisherMock.Setup(x => x.PublishEvent(It.IsAny <OperationAcceptedEvent>()))
            .Callback((object evt) => _saga.Handle((OperationAcceptedEvent)evt, _commandSender.Object));

            _eventsPublisherMock.Setup(x => x.PublishEvent(It.IsAny <OperationRejectedEvent>()))
            .Callback((object evt) => _saga.Handle((OperationRejectedEvent)evt, _commandSender.Object));

            _commandSender
            .Setup(x => x.SendCommand(
                       It.IsAny <AcceptCashoutCommand>(),
                       It.Is <string>(v => v == BlockchainCashoutProcessorBoundedContext.Name),
                       It.IsAny <uint>()))
            .Callback((AcceptCashoutCommand cmd, string bc, uint _) => _acceptCashoutCommandsHandler.Handle(cmd, _eventsPublisherMock.Object));

            _commandSender
            .Setup(x => x.SendCommand(
                       It.IsAny <NotifyCashoutFailedCommand>(),
                       It.Is <string>(v => v == BlockchainCashoutProcessorBoundedContext.Name),
                       It.IsAny <uint>()))
            .Callback((NotifyCashoutFailedCommand cmd, string bc, uint _) => _notifyCashoutFailedCommandsHandler.Handle(cmd, _eventsPublisherMock.Object));
        }
        public StartCashoutCommandsHandlerTests()
        {
            var logFactory = LogFactory.Create().AddUnbufferedConsole();

            _eventsPublisherMock = new Mock <IEventPublisher>();
            _batchRepositoryMock = new Mock <ICashoutsBatchRepository>();
            _closedBatchedCashoutsRepositoryMock = new Mock <IClosedBatchedCashoutRepository>();

            var activeCashoutsBatchIdRepositoryMock = new Mock <IActiveCashoutsBatchIdRepository>();
            var assetsServiceMock = new Mock <IAssetsServiceWithCache>();
            var walletsClient     = new Mock <IBlockchainWalletsClient>();

            _cqrsSettings = new CqrsSettings
            {
                RabbitConnectionString = "fake-connection-string",
                RetryDelay             = TimeSpan.FromSeconds(30)
            };

            _countTreshold = 10;

            var ageThreshold = TimeSpan.FromMinutes(10);

            var blockchainConfigurationProvider = new BlockchainConfigurationsProvider
                                                  (
                logFactory,
                new Dictionary <string, BlockchainConfiguration>
            {
                {
                    "Bitcoin",
                    new BlockchainConfiguration
                    (
                        "HotWallet",
                        false,
                        new CashoutsAggregationConfiguration
                        (
                            ageThreshold,
                            _countTreshold
                        ))
                }
            }
                                                  );

            _handler = new AcceptCashoutCommandsHandler
                       (
                new SilentChaosKitty(),
                _batchRepositoryMock.Object,
                _closedBatchedCashoutsRepositoryMock.Object,
                activeCashoutsBatchIdRepositoryMock.Object,
                blockchainConfigurationProvider,
                walletsClient.Object,
                _cqrsSettings,
                false
                       );

            var activeCashoutsBatchId = ActiveCashoutBatchId.Create(CashoutsBatchAggregate.GetNextId());

            _batch = CashoutsBatchAggregate.Start
                     (
                activeCashoutsBatchId.BatchId,
                "Bitcoin",
                "LykkeBTC",
                "BTC",
                "HotWallet",
                10,
                TimeSpan.FromMinutes(10)
                     );

            var asset = new Asset
            {
                Id = "LykkeBTC",
                BlockchainIntegrationLayerId      = "Bitcoin",
                BlockchainIntegrationLayerAssetId = "BTC"
            };

            _batchRepositoryMock
            .Setup
            (
                x => x.GetOrAddAsync
                (
                    It.Is <Guid>(p => p == _batch.BatchId),
                    It.IsAny <Func <CashoutsBatchAggregate> >()
                )
            )
            .ReturnsAsync(() => _batch);

            _closedBatchedCashoutsRepositoryMock
            .Setup(x => x.IsCashoutClosedAsync(It.Is <Guid>(p => p == _batch.BatchId)))
            .ReturnsAsync(false);

            activeCashoutsBatchIdRepositoryMock
            .Setup
            (
                x => x.GetActiveOrNextBatchId
                (
                    It.Is <string>(p => p == "Bitcoin"),
                    It.Is <string>(p => p == "BTC"),
                    It.Is <string>(p => p == "HotWallet"),
                    It.Is <Func <Guid> >(p => p == CashoutsBatchAggregate.GetNextId)
                )
            )
            .ReturnsAsync(() => activeCashoutsBatchId);

            assetsServiceMock
            .Setup
            (
                x => x.TryGetAssetAsync
                (
                    It.Is <string>(p => p == "LykkeBTC"),
                    It.IsAny <CancellationToken>()
                )
            )
            .ReturnsAsync(() => asset);

            walletsClient
            .Setup
            (
                x => x.TryGetClientIdAsync
                (
                    It.Is <string>(p => p == "Bitcoin"),
                    It.IsAny <string>()
                )
            )
            .ReturnsAsync((Guid?)null);
        }