예제 #1
0
        public static async Task <Guid?> ShouldContainSagaInState <TStateMachine, TInstance>(this ISagaRepository <TInstance> repository, Guid correlationId,
                                                                                             TStateMachine machine, Func <TStateMachine, State> stateSelector, TimeSpan timeout)
            where TStateMachine : SagaStateMachine <TInstance>
            where TInstance : class, SagaStateMachineInstance
        {
            var querySagaRepository = repository as IQuerySagaRepository <TInstance>;

            if (querySagaRepository == null)
            {
                throw new ArgumentException("The repository must support querying", nameof(repository));
            }

            var state = stateSelector(machine);

            DateTime giveUpAt = DateTime.Now + timeout;
            var      query    = new SagaQuery <TInstance>(x => x.CorrelationId == correlationId && machine.GetState(x).Result.Equals(state));

            while (DateTime.Now < giveUpAt)
            {
                Guid saga = (await querySagaRepository.Find(query).ConfigureAwait(false)).FirstOrDefault();
                if (saga != Guid.Empty)
                {
                    return(saga);
                }

                await Task.Delay(10).ConfigureAwait(false);
            }

            return(default);
예제 #2
0
        bool ISagaQueryFactory <TSaga, TMessage> .TryCreateQuery(ConsumeContext <TMessage> context, out ISagaQuery <TSaga> query)
        {
            Expression <Func <TSaga, bool> > expression = new SagaFilterExpressionConverter <TSaga, TMessage>(context.Message)
                                                          .Convert(_filterExpression);

            query = new SagaQuery <TSaga>(expression);
            return(true);
        }
        bool ISagaQueryFactory <TInstance, TData> .TryCreateQuery(ConsumeContext <TData> context, out ISagaQuery <TInstance> query)
        {
            Expression <Func <TInstance, bool> > filter = new EventCorrelationExpressionConverter <TInstance, TData>(context)
                                                          .Convert(_correlationExpression);

            query = new SagaQuery <TInstance>(filter);
            return(true);
        }
        public void GivenAMongoDbQuerySagaRepository_WhenFindingSaga()
        {
            _correlationId = Guid.NewGuid();

            SagaRepository.InsertSaga(new SimpleSaga {CorrelationId = _correlationId}).GetAwaiter().GetResult();

            var repository = new MongoDbQuerySagaRepository<SimpleSaga>(SagaRepository.Instance);

            ISagaQuery<SimpleSaga> query = new SagaQuery<SimpleSaga>(x => x.CorrelationId == _correlationId);

            _result = repository.Find(query).GetAwaiter().GetResult();
        }
        public async Task GivenAMongoDbQuerySagaRepository_WhenFindingSaga()
        {
            _correlationId = Guid.NewGuid();

            await SagaRepository.InsertSaga(new SimpleSaga { CorrelationId = _correlationId });

            var repository = new MongoDbQuerySagaRepository <SimpleSaga>(SagaRepository.Instance);

            ISagaQuery <SimpleSaga> query = new SagaQuery <SimpleSaga>(x => x.CorrelationId == _correlationId);

            _result = await repository.Find(query);
        }
예제 #6
0
        bool ISagaQueryFactory <TInstance, TData> .TryCreateQuery(ConsumeContext <TData> context, out ISagaQuery <TInstance> query)
        {
            if (_selector.TryGetProperty(context, out var propertyValue))
            {
                Expression <Func <TInstance, bool> > filterExpression = CreateExpression(propertyValue);

                query = new SagaQuery <TInstance>(filterExpression);
                return(true);
            }

            query = default;
            return(false);
        }
예제 #7
0
        public void GivenAMongoDbQuerySagaRepository_WhenFindingSaga()
        {
            _correlationId = Guid.NewGuid();

            SagaRepository.InsertSaga(new SimpleSaga {
                CorrelationId = _correlationId
            }).GetAwaiter().GetResult();

            var repository = new MongoDbQuerySagaRepository <SimpleSaga>(SagaRepository.Instance);

            ISagaQuery <SimpleSaga> query = new SagaQuery <SimpleSaga>(x => x.CorrelationId == _correlationId);

            _result = repository.Find(query).GetAwaiter().GetResult();
        }
        public void GivenADocumentDbQuerySagaRepository_WhenFindingSaga()
        {
            _correlationId = Guid.NewGuid();

            SagaRepository.Instance.InsertSaga(new SimpleSaga {
                CorrelationId = _correlationId
            }).GetAwaiter().GetResult();

            var repository = new DocumentDbSagaRepository <SimpleSaga>(SagaRepository.Instance.Client, SagaRepository.DatabaseName);

            ISagaQuery <SimpleSaga> query = new SagaQuery <SimpleSaga>(x => x.CorrelationId == _correlationId);

            _result = repository.Find(query).GetAwaiter().GetResult();
        }
예제 #9
0
        public async Task Query_Passes_With_Json_Property_Attribute()
        {
            // Arrange
            var correlationId = Guid.NewGuid();

            _ids.Add(correlationId);
            SagaRepository.Instance.InsertSaga(new SimpleSagaResource {
                CorrelationId = correlationId
            }, false).GetAwaiter().GetResult();
            ISagaQuery <SimpleSagaResource> query = new SagaQuery <SimpleSagaResource>(x => x.CorrelationId == correlationId);

            // Act
            var repository = new DocumentDbSagaRepository <SimpleSagaResource>(SagaRepository.Instance.Client, SagaRepository.DatabaseName);
            var result     = repository.Find(query).GetAwaiter().GetResult();

            // Assert
            Assert.That(result.Single(), Is.EqualTo(correlationId));
        }
예제 #10
0
        public async Task Query_Fails_With_Json_Resolver_Rename()
        {
            // Arrange
            var correlationId = Guid.NewGuid();

            _ids.Add(correlationId);
            SagaRepository.Instance.InsertSaga(new SimpleSaga {
                CorrelationId = correlationId
            }, true).GetAwaiter().GetResult();
            ISagaQuery <SimpleSaga> query = new SagaQuery <SimpleSaga>(x => x.CorrelationId == correlationId);

            // Act
            var repository = new DocumentDbSagaRepository <SimpleSaga>(SagaRepository.Instance.Client, SagaRepository.DatabaseName, JsonSerializerSettingsExtensions.GetSagaRenameSettings <SimpleSaga>());
            var result     = repository.Find(query).GetAwaiter().GetResult();

            // Assert
            Assert.That(result.Any(), Is.False);
        }
예제 #11
0
        public async Task Query_Other_Property_Passes_With_Json_Resolver_Rename()
        {
            // Arrange
            var correlationId = Guid.NewGuid();

            _ids.Add(correlationId);
            var username = Guid.NewGuid().ToString(); // wouldn't actually be a guid, but used this for uniqueness

            SagaRepository.Instance.InsertSaga(new SimpleSaga {
                CorrelationId = correlationId, Username = username
            }, true).GetAwaiter().GetResult();
            ISagaQuery <SimpleSaga> query = new SagaQuery <SimpleSaga>(x => x.Username == username);

            // Act
            var repository = new DocumentDbSagaRepository <SimpleSaga>(SagaRepository.Instance.Client, SagaRepository.DatabaseName, JsonSerializerSettingsExtensions.GetSagaRenameSettings <SimpleSaga>());
            var result     = repository.Find(query).GetAwaiter().GetResult();

            // Assert
            Assert.That(result.Single(), Is.EqualTo(correlationId)); // So it does find it
        }
        public static async Task <Guid?> ShouldContainSaga <TSaga>(this IQuerySagaRepository <TSaga> repository,
                                                                   Expression <Func <TSaga, bool> > filter,
                                                                   TimeSpan timeout)
            where TSaga : class, ISaga
        {
            DateTime giveUpAt = DateTime.Now + timeout;

            var query = new SagaQuery <TSaga>(filter);

            while (DateTime.Now < giveUpAt)
            {
                var sagas = (await repository.Where(query.FilterExpression).ConfigureAwait(false)).ToList();
                if (sagas.Count > 0)
                {
                    return(sagas.Single());
                }

                await Task.Delay(10).ConfigureAwait(false);
            }

            return(default(Guid?));
        }
예제 #13
0
        /// <summary>
        /// Waits until a saga exists with the specified correlationId
        /// </summary>
        /// <param name="correlationId"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        public async Task <Guid?> Exists(Guid correlationId, TimeSpan?timeout = default)
        {
            if (QuerySagaRepository == null)
            {
                throw new InvalidOperationException("The repository does not support Query operations");
            }

            var giveUpAt = DateTime.Now + (timeout ?? TestTimeout);

            var query = new SagaQuery <TSaga>(x => x.CorrelationId == correlationId);

            while (DateTime.Now < giveUpAt)
            {
                var saga = (await QuerySagaRepository.Find(query).ConfigureAwait(false)).FirstOrDefault();
                if (saga != Guid.Empty)
                {
                    return(saga);
                }

                await Task.Delay(10).ConfigureAwait(false);
            }

            return(default);
예제 #14
0
        /// <summary>
        /// Waits until at least one saga exists matching the specified filter
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        public async Task <IList <Guid> > Match(Expression <Func <TSaga, bool> > filter, TimeSpan?timeout = default(TimeSpan?))
        {
            if (_querySagaRepository == null)
            {
                throw new InvalidOperationException("The repository does not support Query operations");
            }

            var giveUpAt = DateTime.Now + (timeout ?? _testTimeout);

            var query = new SagaQuery <TSaga>(filter);

            while (DateTime.Now < giveUpAt)
            {
                List <Guid> sagas = (await _querySagaRepository.Where(query.FilterExpression).ConfigureAwait(false)).ToList();
                if (sagas.Count > 0)
                {
                    return(sagas);
                }

                await Task.Delay(10).ConfigureAwait(false);
            }

            return(new List <Guid>());
        }