public async Task When_a_two_messages_starting_a_saga_arrive_simultanously_one_of_them_fails()
        {
            var context1     = CreateMessageContext();
            var context2     = CreateMessageContext();
            var transaction1 = await outboxPersister.BeginTransaction(context1);

            var session1 = new OutboxEventStoreSynchronizedStorageSession(connection, (EventStoreOutboxTransaction)transaction1);

            var sagaData = CreateNewSagaData();
            await persister.Save(sagaData, new SagaCorrelationProperty(CorrelationPropName, sagaData.StringProperty), session1, context1);

            var transaction2 = await outboxPersister.BeginTransaction(context2);

            var session2 = new OutboxEventStoreSynchronizedStorageSession(connection, (EventStoreOutboxTransaction)transaction2);

            try
            {
                await persister.Save(sagaData, new SagaCorrelationProperty(CorrelationPropName, sagaData.StringProperty), session2, context2);

                Assert.Fail("Expected exception");
            }
            catch (Exception ex)
            {
                StringAssert.StartsWith("Append failed due to WrongExpectedVersion.", ex.Message);
            }
        }
        async Task SimulateProcessingMessage(SagaData sagaData, Action <SagaData> action, bool commitOutboxTransaction, ContextBag context)
        {
            var outboxTransaction = await outboxPersister.BeginTransaction(context);

            var session = new OutboxEventStoreSynchronizedStorageSession(connection, (EventStoreOutboxTransaction)outboxTransaction);

            sagaData = await persister.Get <SagaData>(CorrelationPropName, sagaData.StringProperty, session, context);

            action(sagaData);
            await persister.Update(sagaData, session, context);

            if (commitOutboxTransaction)
            {
                await outboxTransaction.Commit();
            }
        }
        public async Task When_a_two_messages_starting_a_saga_arrive_sequentially_both_succeed()
        {
            var context1 = CreateMessageContext();
            var context2 = CreateMessageContext();
            var sagaData = CreateNewSagaData();

            var transaction1 = await outboxPersister.BeginTransaction(context1);

            var session1 = new OutboxEventStoreSynchronizedStorageSession(connection, (EventStoreOutboxTransaction)transaction1);
            await persister.Save(sagaData, new SagaCorrelationProperty(CorrelationPropName, sagaData.StringProperty), session1, context1);

            await transaction1.Commit();

            var transaction2 = await outboxPersister.BeginTransaction(context2);

            var session2   = new OutboxEventStoreSynchronizedStorageSession(connection, (EventStoreOutboxTransaction)transaction2);
            var loadedData = await persister.Get <SagaData>(CorrelationPropName, sagaData.StringProperty, session2, context2);

            await persister.Update(loadedData, session2, context2);

            await transaction2.Commit();
        }