예제 #1
0
        public async Task should_start()
        {
            var(message, _) = await MessageInitializerCache <BatchReceived> .InitializeMessage(
                new
            {
                BatchId         = NewId.NextGuid(),
                Timestamp       = DateTime.UtcNow,
                BatchAction     = BatchAction.CancelOrders,
                ActiveThreshold = 5,
                OrderIds        = new Guid[] { Guid.NewGuid(), Guid.NewGuid() }
            });

            await _testHarness.InputQueueSendEndpoint.Send(message);

            var sagaId = await _sagaRepository.ShouldContainSagaInState(message.BatchId, _stateMachine, x => x.Started, _testHarness.TestTimeout);

            sagaId.HasValue.Should().BeTrue();

            var saga = _sagaRepository[sagaId.Value];

            saga.Instance.CorrelationId.Should().Be(message.BatchId);
            saga.Instance.CreateTimestamp.Should().Be(message.Timestamp);
            saga.Instance.UpdateTimestamp.Should().Be(message.Timestamp);
            saga.Instance.Action.Should().Be(message.Action);
            saga.Instance.ProcessingOrderIds.Values.Should().BeEquivalentTo(message.OrderIds);
        }
    private async Task SetupStateMachine(
        Guid sagaId,
        Guid customerId,
        String toState)
    {
        if (String.IsNullOrEmpty(toState))
        {
            return;
        }
        await MoveStateMachineForward(BuildStartMessage(), x => x.AwaitingDetails);

        var awaitingDetailsId = await _Repository.ShouldContainSagaInState(
            sagaId, _Machine, x => x.AwaitingDetails, _TestTimeout);

        Assert.IsNotNull(awaitingDetailsId, "Error, expected state machine in AwaitingDetails state");
        if (toState == _Machine.AwaitingDetails.Name)
        {
            return;
        }
        // ...and more stuff to move to later states, depending on
        // where I want my test's starting point to be...
        async Task MoveStateMachineForward <T>(
            T message,
            Func <ProcessStateMachine, Automatonymous.State> targetState)
            where T : class
        {
            await InputQueueSendEndpoint.Send(message);

            var foundSagaId = await _Repository.ShouldContainSagaInState(
                sagaId, _Machine, targetState, _TestTimeout);

            Assert.IsTrue(foundSagaId.HasValue);
        }

        IStartProcess BuildStartMessage()
        {
            return(new StartProcessMessage(sagaId, customerId));
        }
    }