//[Repeat(10)]
        public async Task Return_AcceptedAtRouteResult_And_have_correct_PaymentStatus_When_Processing_PaymentRequest_timeout()
        {
            var           requestId        = Guid.NewGuid();
            var           paymentRequest   = TestsUtils.BuildPaymentRequest(requestId, MerchantsRepository.Amazon);
            var           gatewayPaymentId = Guid.NewGuid();
            IGenerateGuid guidGenerator    = new GuidGeneratorForTesting(gatewayPaymentId);

            var bankPaymentId = Guid.Parse("3ec8c76c-7dc2-4769-96f8-7e0649ecdfc0");

            var timeoutTolerance         = TimeSpan.FromMilliseconds(80);
            var delayBiggerThanTolerance = timeoutTolerance * 5;

            var delayProvider = Substitute.For <IProvideBankResponseTime>();

            delayProvider.Delays().Returns(delayBiggerThanTolerance,   //timeout
                                           delayBiggerThanTolerance,   //timeout
                                           delayBiggerThanTolerance,   //timeout
                                           timeoutTolerance.Divide(20) // NO TIMEOUT
                                           );

            var knowBufferAndReprocessPaymentRequest = Substitute.For <IKnowBufferAndReprocessPaymentRequest>();
            var circuitBreakerRepository             = new CircuitBreakerRepository();

            var cqrs = await PaymentCQRS.Build(BankPaymentStatus.Accepted,
                                               new BankPaymentIdGeneratorForTests(bankPaymentId),
                                               new AlwaysSuccessBankConnectionBehavior(),
                                               delayProvider,
                                               PaymentCQRS.TimeoutProviderForBankResponseWaiting(timeoutTolerance),
                                               knowBufferAndReprocessPaymentRequest,
                                               circuitBreakerRepository);

            var actionResult = await cqrs.RequestsController.ProceedPaymentRequest(paymentRequest, guidGenerator, cqrs.PaymentRequestsMemory, cqrs.PaymentProcessor);

            Check.That(actionResult).IsInstanceOf <AcceptedAtRouteResult>();

            PaymentDto payment = (await cqrs.PaymentReadController.GetPaymentInfo(gatewayPaymentId)).Value;

            Check.That(payment.RequestId).IsEqualTo(requestId);
            Check.That(payment.GatewayPaymentId).IsEqualTo(gatewayPaymentId);

            Check.That(payment.Status).IsEqualTo(PaymentStatus.Pending); // circuit breaker should open
            Check.That(payment.Approved).IsNull();
            Check.That(payment.AcquiringBankPaymentId).IsNull();

            knowBufferAndReprocessPaymentRequest.ReceivedWithAnyArgs(1).Buffer(default, default);
 public CircuitBreakerMessageReceivedTrigger(CircuitBreakerRepository circuitBreakerRepository)
 {
     _circuitBreakerRepository = circuitBreakerRepository;
 }
 public CircuitBreakerOpenTimeoutTimerTrigger(ICircuitBreakerStateService circuitBreakerStateService, CircuitBreakerRepository circuitBreakerRepository)
 {
     _circuitBreakerStateService = circuitBreakerStateService;
     _circuitBreakerRepository   = circuitBreakerRepository;
 }