public void CreateQueryParameters_WhenFilterExpressionIsNull_ThrowsArgumentNullException <TKey>(TKey defaultValue)
        {
            // Arrange & Act & Assert
            var exception = Assert.Throws <ArgumentNullException>(
                () => FilterExpressionExtensions.CreateQueryParameters <IEntity <TKey>, TKey>(null)
                );

            Assert.NotNull(defaultValue);
            Assert.Equal("filterExpression", exception.ParamName);
        }
예제 #2
0
        public async Task GetAsync_Success <TKey>(
            TKey defaultKey,
            FakeDto <TKey> item,
            FakeDto <TKey> expectedResult)
        {
            // Arrange
            var filterExpression = FilterExpressionExtensions.CreateIdFilterExpression <FakeEntity <TKey>, TKey>(defaultKey);

            var mockRepository = new Mock <IRepository <FakeEntity <TKey>, TKey> >(MockBehavior.Strict);

            mockRepository
            .Setup(
                x => x.GetAsync <FakeDto <TKey> >(
                    It.Is <QueryParameters <FakeEntity <TKey>, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    )
                )
            .ReturnsAsync(item);

            var businessService = new FakeBusinessService <TKey>(
                _mockUnitOfWork.Object,
                _ => mockRepository.Object,
                _mockBusinessMapper.Object,
                _mockLogger.Object
                );

            // Act
            var result = await businessService.GetAsync(defaultKey);

            // Assert
            mockRepository
            .Verify(
                x => x.GetAsync <FakeDto <TKey> >(
                    It.Is <QueryParameters <FakeEntity <TKey>, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    ),
                Times.Once
                );

            Assert.Equal(expectedResult, result, new FakeDtoEqualityComparer <TKey>());
        }
예제 #3
0
        public void GetModel_ById_ReturnsModel <TEntity, TKey>(
            TKey defaultKey,
            TEntity entity,
            object id,
            bool expectedResult)
            where TEntity : class, IEntity <TKey>
        {
            // Arrange
            var model = new FakeModel();

            var filterExpression = FilterExpressionExtensions.CreateIdFilterExpression <TEntity, TKey>((TKey)id);

            var mockRepository = new Mock <IRepository <TEntity, TKey> >(MockBehavior.Strict);

            mockRepository
            .Setup(
                x => x.Get <FakeModel>(
                    It.Is <QueryParameters <TEntity, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    )
                )
            .Returns(model);

            var repository = mockRepository.Object;

            // Act
            var result = repository.Get <FakeModel, TEntity, TKey>((TKey)id);

            // Assert
            if (id != null)
            {
                Assert.IsType(defaultKey.GetType(), id);
            }

            Assert.Equal(
                expectedResult,
                filterExpression.Compile().Invoke(entity)
                );

            Assert.Equal(model, result);
        }
예제 #4
0
        public async Task ExistsAsync_ById_ReturnsEntity <TEntity, TKey>(
            TKey defaultKey,
            TEntity entity,
            object id,
            bool expectedResult)
            where TEntity : class, IEntity <TKey>
        {
            // Arrange
            var filterExpression = FilterExpressionExtensions.CreateIdFilterExpression <TEntity, TKey>((TKey)id);

            var mockRepository = new Mock <IRepository <TEntity, TKey> >(MockBehavior.Strict);

            mockRepository
            .Setup(
                x => x.ExistsAsync(
                    It.Is <QueryParameters <TEntity, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    )
                )
            .ReturnsAsync(true);

            var repository = mockRepository.Object;

            // Act
            var result = await repository.ExistsAsync((TKey)id);

            // Assert
            if (id != null)
            {
                Assert.IsType(defaultKey.GetType(), id);
            }

            Assert.Equal(
                expectedResult,
                filterExpression.Compile().Invoke(entity)
                );

            Assert.True(result);
        }
        public void CreateIdFilterExpression <TEntity, TKey>(
            TKey defaultKey,
            TEntity entity,
            object id,
            bool expectedResult)
            where TEntity : class, IEntity <TKey>
        {
            // Arrange & Act
            var filterExpression = FilterExpressionExtensions.CreateIdFilterExpression <TEntity, TKey>((TKey)id);

            // Assert
            if (id != null)
            {
                Assert.IsType(defaultKey.GetType(), id);
            }

            Assert.Equal(
                expectedResult,
                filterExpression.Compile().Invoke(entity)
                );
        }
        public static ISolrQuery HandleMemberAccess(this MemberExpression memberExpression, MemberContext context)
        {
            if (memberExpression.Type != typeof(bool))
            {
                throw new InvalidOperationException(
                          $"Member '{memberExpression.Member.Name}' must be boolean to be a part of filter");
            }

            if (context.IsAccessToMember(memberExpression))
            {
                return(new SolrQueryByField(context.GetSolrMemberProduct(memberExpression, true),
                                            context.TrueStringSerialized));
            }

            if (memberExpression.IsNullableMember())
            {
                if (memberExpression.Expression.HandleConversion() is MemberExpression inner)
                {
                    if (context.IsAccessToMember(inner))
                    {
                        if (memberExpression.Member.Name == nameof(Nullable <int> .HasValue))
                        {
                            return(new SolrHasValueQuery(context.GetSolrMemberProduct(inner)));
                        }

                        if (memberExpression.Member.Name == nameof(Nullable <int> .Value))
                        {
                            return(new SolrQueryByField(context.GetSolrMemberProduct(inner),
                                                        context.TrueStringSerialized));
                        }
                    }
                }
            }

            // try to calculate values
            return(FilterExpressionExtensions.ConstantToConstant(memberExpression, Expression.Constant(true), (a, b) => (bool)a == (bool)b));
        }
예제 #7
0
        public void Delete_ById_WhenEntityIsNotNull <TEntity, TKey>(
            TKey defaultKey,
            TEntity entity,
            object id,
            bool expectedResult)
            where TEntity : class, IEntity <TKey>
        {
            // Arrange
            var filterExpression = FilterExpressionExtensions.CreateIdFilterExpression <TEntity, TKey>((TKey)id);

            var mockRepository = new Mock <IRepository <TEntity, TKey> >(MockBehavior.Strict);

            mockRepository
            .Setup(
                x => x.Get(
                    It.Is <QueryParameters <TEntity, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    )
                )
            .Returns(entity);

            mockRepository
            .Setup(x => x.Delete(entity));

            var repository = mockRepository.Object;

            // Act
            repository.Delete((TKey)id);

            // Assert
            if (id != null)
            {
                Assert.IsType(defaultKey.GetType(), id);
            }

            Assert.Equal(
                expectedResult,
                filterExpression.Compile().Invoke(entity)
                );

            mockRepository
            .Verify(
                x => x.Get(
                    It.Is <QueryParameters <TEntity, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    ),
                Times.Once
                );

            mockRepository
            .Verify(
                x => x.Delete(entity),
                Times.Once
                );
        }
예제 #8
0
        public async Task EditAsync_WhenNotFound_ReturnsNull <TKey>(
            TKey defaultKey)
        {
            // Arrange
            var item = new FakeEditDto <TKey>
            {
                Id = defaultKey
            };

            Expression <Action <ILogger> > loggerExpressionEdit = x => x.Log(
                LogLevel.Information,
                0,
                It.Is <It.IsAnyType>((v, t) =>
                                     v.ToString() ==
                                     $"Edit item: {item}"
                                     ),
                null,
                It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)
                );

            _mockLogger
            .Setup(x => x.IsEnabled(LogLevel.Information))
            .Returns(true);
            _mockLogger
            .Setup(x => x.IsEnabled(LogLevel.Warning))
            .Returns(true);
            _mockLogger.Setup(loggerExpressionEdit);

            var filterExpression = FilterExpressionExtensions.CreateIdFilterExpression <FakeEntity <TKey>, TKey>(defaultKey);

            var mockRepository = new Mock <IRepository <FakeEntity <TKey>, TKey> >(MockBehavior.Strict);

            mockRepository
            .Setup(
                x => x.GetAsync(
                    It.Is <QueryParameters <FakeEntity <TKey>, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    )
                )
            .ReturnsAsync(() => null);

            Expression <Action <ILogger> > loggerExpressionNotFound = x => x.Log(
                LogLevel.Warning,
                0,
                It.Is <It.IsAnyType>((v, t) =>
                                     v.ToString() ==
                                     $"Item not found: {item.Id}"
                                     ),
                null,
                It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)
                );

            _mockLogger.Setup(loggerExpressionNotFound);

            var businessService = new FakeBusinessService <TKey>(
                _mockUnitOfWork.Object,
                _ => mockRepository.Object,
                _mockBusinessMapper.Object,
                _mockLogger.Object
                );

            // Act
            var result = await businessService.EditAsync(item);

            // Assert
            _mockLogger.Verify(loggerExpressionEdit, Times.Once);

            mockRepository
            .Verify(
                x => x.GetAsync(
                    It.Is <QueryParameters <FakeEntity <TKey>, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    ),
                Times.Once
                );

            _mockLogger.Verify(loggerExpressionNotFound, Times.Once);

            Assert.Null(result);
        }
예제 #9
0
        public async Task EditAsync_Success <TKey>(
            TKey defaultKey,
            FakeEditDto <TKey> item,
            FakeEntity <TKey> entity,
            FakeDto <TKey> expectedResult)
        {
            // Arrange
            Expression <Action <ILogger> > loggerExpressionEdit = x => x.Log(
                LogLevel.Information,
                0,
                It.Is <It.IsAnyType>((v, t) =>
                                     v.ToString() ==
                                     $"Edit item: {item}"
                                     ),
                null,
                It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)
                );

            _mockLogger
            .Setup(x => x.IsEnabled(LogLevel.Information))
            .Returns(true);
            _mockLogger.Setup(loggerExpressionEdit);

            var filterExpression = FilterExpressionExtensions.CreateIdFilterExpression <FakeEntity <TKey>, TKey>(defaultKey);

            var mockRepository = new Mock <IRepository <FakeEntity <TKey>, TKey> >(MockBehavior.Strict);

            mockRepository
            .Setup(
                x => x.GetAsync(
                    It.Is <QueryParameters <FakeEntity <TKey>, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    )
                )
            .ReturnsAsync(entity);

            _mockBusinessMapper
            .Setup(
                x => x.Map(item, entity)
                )
            .Returns(entity);

            mockRepository
            .Setup(
                x => x.Update(entity, false)
                )
            .Returns(entity);

            Expression <Action <ILogger> > loggerExpressionSave = x => x.Log(
                LogLevel.Information,
                0,
                It.Is <It.IsAnyType>((v, t) =>
                                     v.ToString() ==
                                     "Save changes"
                                     ),
                null,
                It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)
                );

            _mockLogger.Setup(loggerExpressionSave);

            _mockUnitOfWork
            .Setup(
                x => x.CommitAsync()
                )
            .ReturnsAsync(1);

            _mockBusinessMapper
            .Setup(
                x => x.Map <FakeEntity <TKey>, FakeDto <TKey> >(entity)
                )
            .Returns(expectedResult);

            var businessService = new FakeBusinessService <TKey>(
                _mockUnitOfWork.Object,
                _ => mockRepository.Object,
                _mockBusinessMapper.Object,
                _mockLogger.Object
                );

            // Act
            var result = await businessService.EditAsync(item);

            // Assert
            _mockLogger.Verify(loggerExpressionEdit, Times.Once);

            mockRepository
            .Verify(
                x => x.GetAsync(
                    It.Is <QueryParameters <FakeEntity <TKey>, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    ),
                Times.Once
                );

            _mockBusinessMapper
            .Verify(
                x => x.Map(item, entity),
                Times.Once
                );

            mockRepository
            .Verify(
                x => x.Update(entity, false),
                Times.Once
                );

            _mockLogger.Verify(loggerExpressionSave, Times.Once);

            _mockUnitOfWork
            .Verify(
                x => x.CommitAsync(),
                Times.Once
                );

            _mockBusinessMapper
            .Verify(
                x => x.Map <FakeEntity <TKey>, FakeDto <TKey> >(entity),
                Times.Once
                );

            Assert.Equal(expectedResult, result, new FakeDtoEqualityComparer <TKey>());
        }
예제 #10
0
        public async Task DeleteAsync_Success <TKey>(
            TKey defaultKey,
            int numberOfRowsAffected,
            bool expectedResult)
        {
            // Arrange
            Expression <Action <ILogger> > loggerExpressionDelete = x => x.Log(
                LogLevel.Information,
                0,
                It.Is <It.IsAnyType>((v, t) =>
                                     v.ToString() ==
                                     $"Delete item: {defaultKey}"
                                     ),
                null,
                It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)
                );

            _mockLogger.Setup(loggerExpressionDelete);

            var entity = new FakeEntity <TKey>();

            var filterExpression = FilterExpressionExtensions.CreateIdFilterExpression <FakeEntity <TKey>, TKey>(defaultKey);

            var mockRepository = new Mock <IRepository <FakeEntity <TKey>, TKey> >(MockBehavior.Strict);

            mockRepository
            .Setup(
                x => x.Get(
                    It.Is <QueryParameters <FakeEntity <TKey>, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    )
                )
            .Returns(entity);

            mockRepository
            .Setup(
                x => x.Delete(entity)
                );

            Expression <Action <ILogger> > loggerExpressionSave = x => x.Log(
                LogLevel.Information,
                0,
                It.Is <It.IsAnyType>((v, t) =>
                                     v.ToString() ==
                                     "Save changes"
                                     ),
                null,
                It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)
                );

            _mockLogger
            .Setup(x => x.IsEnabled(LogLevel.Information))
            .Returns(true);
            _mockLogger.Setup(loggerExpressionSave);

            _mockUnitOfWork
            .Setup(
                x => x.CommitAsync()
                )
            .ReturnsAsync(numberOfRowsAffected);

            var businessService = new FakeBusinessService <TKey>(
                _mockUnitOfWork.Object,
                _ => mockRepository.Object,
                _mockBusinessMapper.Object,
                _mockLogger.Object
                );

            // Act
            var result = await businessService.DeleteAsync(defaultKey);

            // Assert
            Assert.NotNull(defaultKey);

            _mockLogger.Verify(loggerExpressionDelete, Times.Once);

            mockRepository
            .Verify(
                x => x.Get(
                    It.Is <QueryParameters <FakeEntity <TKey>, TKey> >(
                        y => Lambda.Eq(
                            y.Filter.Expression,
                            filterExpression
                            ) &&
                        y.Sort == null &&
                        y.Page == null
                        )
                    ),
                Times.Once
                );

            mockRepository
            .Verify(
                x => x.Delete(entity),
                Times.Once
                );

            _mockLogger.Verify(loggerExpressionSave, Times.Once);

            _mockUnitOfWork
            .Verify(
                x => x.CommitAsync(),
                Times.Once
                );

            Assert.Equal(expectedResult, result);
        }