コード例 #1
0
        public void Should_contain_two_messages_should_be_correlated_by_tag_and_id()
        {
            Guid timeoutId = Guid.NewGuid();

            LocalBus.Publish(new ScheduleTimeout(timeoutId, 10.Seconds(), 1));

            TimeoutSaga firstTimeout = _timeoutSagaRepository.ShouldContainSaga(x => x.TimeoutId == timeoutId && x.Tag == 1);

            firstTimeout.ShouldBeInState(TimeoutSaga.WaitingForTime);

            LocalBus.Publish(new CancelTimeout {
                CorrelationId = timeoutId, Tag = 1
            });

            LocalBus.Publish(new ScheduleTimeout(timeoutId, 10.Seconds(), 2));
            TimeoutSaga secondTimeout = _timeoutSagaRepository.ShouldContainSaga(x => x.TimeoutId == timeoutId && x.Tag == 2);

            secondTimeout.ShouldBeInState(TimeoutSaga.WaitingForTime);

            firstTimeout.ShouldBeInState(TimeoutSaga.Completed);

            Trace.WriteLine("Sagas:");
            foreach (TimeoutSaga saga in _timeoutSagaRepository.Where(x => true))
            {
                Trace.WriteLine("Saga: " + saga.CorrelationId + ", TimeoutId: " + saga.TimeoutId + ", Tag: " + saga.Tag +
                                ", State: " + saga.CurrentState.Name);
            }
        }
コード例 #2
0
        protected Task <Guid?> ShouldContainSaga(Guid correlatedId, State currentState)
        {
            var result = _sagaRepository.ShouldContainSaga(
                x => x.ParentCorrelationId == correlatedId &&
                MassTransitSagaHelper.GetCurrentState(x, _saga).Result == currentState,
                TestTimeout);

            return(result);
        }
コード例 #3
0
            public async Task Should_cancel_when_the_order_is_submitted()
            {
                Task <ConsumeContext <CartRemoved> > handler = ConnectPublishHandler <CartRemoved>();

                var memberNumber = NewId.NextGuid().ToString();

                await InputQueueSendEndpoint.Send <CartItemAdded>(new { MemberNumber = memberNumber });

                Guid?saga = await _repository.ShouldContainSaga(x => x.MemberNumber == memberNumber &&
                                                                GetCurrentState(x) == _machine.Active, TestTimeout);

                Assert.IsTrue(saga.HasValue);

                await InputQueueSendEndpoint.Send <OrderSubmitted>(new { MemberNumber = memberNumber });

                ConsumeContext <CartRemoved> removed = await handler;

                await Task.Delay(3000);
            }
コード例 #4
0
        public async Task Calls_clearingApi()
        {
            var sagaId = Guid.NewGuid();

            _clearingApi.ProcessRequest(Arg.Any <AuthorizationRequest>()).Returns(new AuthorizationResponse());
            var req = await Bus.Request(InputQueueAddress, new AuthorizationRequest { TransactionId = sagaId }, x =>
            {
                x.Handle <AuthorizationResponse>();
                x.Timeout = TestTimeout;
            }, TestCancellationToken);

            await req.Task;

            var saga = await _repository.ShouldContainSaga(x => x.CorrelationId == sagaId, TestTimeout);

            Assert.IsTrue(saga.HasValue);

            _clearingApi.Received().ProcessRequest(Arg.Any <AuthorizationRequest>());
        }
コード例 #5
0
        public async Task Should_properly_map_to_the_instance()
        {
            Guid id = NewId.NextGuid();

            await Bus.Publish <BeginTransaction>(new
            {
                TransactionId = id
            });

            Guid?saga = await _repository.ShouldContainSaga(state => state.TransactionId == id && state.CurrentState == _machine.Active, TestTimeout);

            Assert.IsTrue(saga.HasValue);

            await Bus.Publish <CommitTransaction>(new
            {
                TransactionId = id
            });

            saga = await _repository.ShouldContainSaga(state => state.TransactionId == id && state.CurrentState == _machine.Final, TestTimeout);

            Assert.IsTrue(saga.HasValue);
        }
コード例 #6
0
            public async Task Should_cancel_when_the_order_is_submitted()
            {
                Task <ConsumeContext <CartRemoved> > handler = SubscribeHandler <CartRemoved>();

                CartItemAdded cartItemAdded = new CartItemAddedCommand
                {
                    MemberNumber = Guid.NewGuid().ToString()
                };

                await InputQueueSendEndpoint.Send(cartItemAdded);

                Guid?saga = await _repository.ShouldContainSaga(x => x.MemberNumber == cartItemAdded.MemberNumber &&
                                                                GetCurrentState(x) == _machine.Active, TestTimeout);

                Assert.IsTrue(saga.HasValue);

                await InputQueueSendEndpoint.Send(new OrderSubmittedEvent(cartItemAdded.MemberNumber));

                ConsumeContext <CartRemoved> removed = await handler;

                await Task.Delay(3000);
            }
コード例 #7
0
        public async Task Moves_saga_to_AuthorizationFlow_Pending()
        {
            var newCcDepositRequest = NewCcDepositRequest();
            var req = await Bus.Request(InputQueueAddress, newCcDepositRequest, x =>
            {
                x.Handle <CcDepositResponse>();
                x.Timeout = TestTimeout;
            }, TestCancellationToken);

            await req.Task;

            await _repository.ShouldContainSaga(x => Equals(x.CurrentState, _machine.AuthorizationFlow.Pending), TestTimeout);
        }
コード例 #8
0
        public async Task Should_handle_a_double_state()
        {
            Guid sagaId = Guid.NewGuid();

            await Bus.Publish(new Start
            {
                CorrelationId = sagaId
            });

            Guid?saga = await _repository.ShouldContainSaga(sagaId, TestTimeout);

            Assert.IsTrue(saga.HasValue);

            await Bus.Publish(new Stop
            {
                CorrelationId = sagaId
            });

            saga =
                await _repository.ShouldContainSaga(x => x.CorrelationId == sagaId && Equals(x.CurrentState, _machine.Final), TestTimeout);

            Assert.IsTrue(saga.HasValue);
        }
コード例 #9
0
        public async Task Should_report_from_diagnostic_source()
        {
            _telemetryClient.TrackTrace("Submitting Order");

            var submitted = SubscribeHandler <OrderObserved>();

            await Bus.Publish <SubmitOrder>(new { OrderId = InVar.Id }, x => x.ResponseAddress = Bus.Address);

            var context = await submitted;

            var saga = await _repository.ShouldContainSaga(x => x.CorrelationId == context.Message.OrderId && Equals(x.CurrentState, _machine.PendingApproval),
                                                           TestTimeout);

            Assert.IsTrue(saga.HasValue);
        }
コード例 #10
0
        public async Task Should_receive_the_published_message()
        {
            Task <ConsumeContext <StartupComplete> > messageReceived = SubscribeHandler <StartupComplete>();

            var message = new Start("Joe");

            await InputQueueSendEndpoint.Send(message);

            ConsumeContext <StartupComplete> received = await messageReceived;

            Assert.AreEqual(message.CorrelationId, received.Message.TransactionId);

            Assert.IsTrue(received.InitiatorId.HasValue, "The initiator should be copied from the CorrelationId");

            Assert.AreEqual(received.InitiatorId.Value, message.CorrelationId, "The initiator should be the saga CorrelationId");

            Assert.AreEqual(received.SourceAddress, InputQueueAddress, "The published message should have the input queue source address");

            Guid?saga =
                await _repository.ShouldContainSaga(x => x.CorrelationId == message.CorrelationId && Equals(x.CurrentState, _machine.Running), TestTimeout);

            Assert.IsTrue(saga.HasValue);
        }
コード例 #11
0
 public void A_nice_interface_should_be_available_for_defining_saga_locators()
 {
     _repository.ShouldContainSaga(_sagaId);
 }