public void ShouldSetCountToMaxWhenCountExceedsAndOptionsWereSetToThrow()
        {
            var    behaviourSetInstance   = new DynamicQueryAttribute(exceededPaginationCountBehaviour: PaginationBehaviour.Throw);
            string queryExceedingMaxCount = DYNAMIC_QUERY_STRING.Replace("count=10", $"count={_defaultMaxCountSize + 1}");

            Assert.Throws <MaximumResultSetExceededException>(() => { ExecuteAction(behaviourSetInstance, queryExceedingMaxCount); });
        }
        public void ShouldDetectHttpHeaderResolverQueryResolutionOptionWhenItsProvided()
        {
            var    instance              = new DynamicQueryAttribute();
            string onlyQuery             = dynamicQueryWithParam.Split($"?{DYNAMIC_QUERY_STRING_PARAM}=")[1];
            string onlyQueryEncoded      = dynamicQueryWithParamValueEncoded.Split($"?{DYNAMIC_QUERY_STRING_PARAM}=")[1];
            var    resultWithoutEncoding = ExecuteAction(
                instance,
                onlyQuery,
                new DynamicQueryBuilderSettings
            {
                QueryOptionsResolver = new HttpHeaderResolver(DYNAMIC_QUERY_STRING_PARAM)
            },
                true);

            var resultWithEncoding = ExecuteAction(
                instance,
                onlyQueryEncoded,
                new DynamicQueryBuilderSettings
            {
                QueryOptionsResolver = new HttpHeaderResolver(DYNAMIC_QUERY_STRING_PARAM, (qstring) => Encoding.UTF8.GetString(Convert.FromBase64String(qstring)))
            },
                true);

            Assert.NotNull(resultWithoutEncoding.Filters);
            Assert.NotEmpty(resultWithoutEncoding.Filters);

            Assert.NotNull(resultWithEncoding.Filters);
            Assert.NotEmpty(resultWithEncoding.Filters);
        }
        public void ShouldDetectQueryStringResolverQueryResolutionOptionWhenItsProvided()
        {
            var instance = new DynamicQueryAttribute();
            var resultWithoutEncoding = ExecuteAction(
                instance,
                dynamicQueryWithParam,
                new DynamicQueryBuilderSettings
            {
                QueryOptionsResolver = new QueryStringResolver(DYNAMIC_QUERY_STRING_PARAM)
            });

            var resultWithEncoding = ExecuteAction(
                instance,
                dynamicQueryWithParamValueEncoded,
                new DynamicQueryBuilderSettings
            {
                QueryOptionsResolver = new QueryStringResolver(DYNAMIC_QUERY_STRING_PARAM, (qstring) => Encoding.UTF8.GetString(Convert.FromBase64String(qstring)))
            });

            Assert.NotNull(resultWithoutEncoding.Filters);
            Assert.NotEmpty(resultWithoutEncoding.Filters);

            Assert.NotNull(resultWithEncoding.Filters);
            Assert.NotEmpty(resultWithEncoding.Filters);
        }
        public void ShouldSetGivenAssignDataSetCountWhenOptionsNotNull()
        {
            bool changedIncludeDataSetCount     = !_defaultIncludeDataSetCount;
            var  parameterlessInstance          = new DynamicQueryAttribute(includeDataSetCountToPagination: changedIncludeDataSetCount);
            DynamicQueryOptions executedOptions = ExecuteAction(parameterlessInstance);

            Assert.Equal(executedOptions.PaginationOption.AssignDataSetCount, changedIncludeDataSetCount);
        }
        public void ShouldSetOffsetToZeroWhenLessThanZero()
        {
            var    attributeInstance       = new DynamicQueryAttribute();
            string queryWithOffsetNegative = DYNAMIC_QUERY_STRING.Replace("offset=0", "offset=-1");
            DynamicQueryOptions executedOptionsOffsetNegative = ExecuteAction(attributeInstance, queryWithOffsetNegative);

            Assert.Equal(0, executedOptionsOffsetNegative.PaginationOption.Offset);
        }
        public void ShouldParseDataSetCountWhenIncludeDataSetCountAssignedAndThereIsNoPaginationOption()
        {
            var    attributeInstance       = new DynamicQueryAttribute();
            string queryWithOffsetNegative = DYNAMIC_QUERY_STRING.Replace("offset=0", string.Empty).Replace("count=10", string.Empty);
            DynamicQueryOptions executedOptionsOffsetNegative = ExecuteAction(attributeInstance, queryWithOffsetNegative);

            Assert.NotNull(executedOptionsOffsetNegative.PaginationOption);
            Assert.True(executedOptionsOffsetNegative.PaginationOption.AssignDataSetCount);
        }
        public void ShouldSetCountToOneWhenRequestedCountLessThanOrEqualToZero()
        {
            var    attributeInstance      = new DynamicQueryAttribute();
            string queryWithCountZero     = DYNAMIC_QUERY_STRING.Replace("count=10", "count=0");
            string queryWithCountNegative = DYNAMIC_QUERY_STRING.Replace("count=10", "count=-1");
            DynamicQueryOptions executedOptionsWithCountZero     = ExecuteAction(attributeInstance, queryWithCountZero);
            DynamicQueryOptions executedOptionsWithCountNegative = ExecuteAction(attributeInstance, queryWithCountNegative);

            Assert.Equal(1, executedOptionsWithCountZero.PaginationOption.Count);
            Assert.Equal(1, executedOptionsWithCountNegative.PaginationOption.Count);
        }
        private DynamicQueryOptions ExecuteAction(
            DynamicQueryAttribute attributeInstance,
            string query = null,
            DynamicQueryBuilderSettings settings = null,
            bool queryOnHeader = false)
        {
            ActionExecutingContext context = CreateContext(query, settings, queryOnHeader);

            attributeInstance.OnActionExecuting(context);
            return(context.ActionArguments.First().Value as DynamicQueryOptions);
        }
        public void ShouldSetCountToMaxWhenCountExceedsAndOptionsWereSetToGetMaxOrDefault()
        {
            var    behaviourSetInstance     = new DynamicQueryAttribute(exceededPaginationCountBehaviour: PaginationBehaviour.GetMax);
            var    defaultBehaviourInstance = new DynamicQueryAttribute();
            string queryExceedingMaxCount   = DYNAMIC_QUERY_STRING.Replace("count=10", $"count={_defaultMaxCountSize + 1}");

            DynamicQueryOptions executedOptionsWithSetOptions     = ExecuteAction(behaviourSetInstance, queryExceedingMaxCount);
            DynamicQueryOptions executedOptionsWithDefaultOptions = ExecuteAction(defaultBehaviourInstance, queryExceedingMaxCount);

            Assert.Equal(executedOptionsWithSetOptions.PaginationOption.Count, _defaultMaxCountSize);
            Assert.Equal(executedOptionsWithDefaultOptions.PaginationOption.Count, _defaultMaxCountSize);
        }
        public void ShouldBeAbleToHandleEmptyQueries()
        {
            var attr     = new DynamicQueryAttribute();
            var settings = new DynamicQueryBuilderSettings
            {
                QueryOptionsResolver = new QueryStringResolver(DYNAMIC_QUERY_STRING_PARAM)
            };

            var result = ExecuteAction(attr, string.Empty, settings);

            Assert.NotNull(result);
            Assert.Empty(result.Filters);
            Assert.Empty(result.SortOptions);
        }
        public void ShouldSetGivenCtorValues()
        {
            int  changedMaxCountSize        = 200;
            bool changedIncludedataSetCount = false;
            PaginationBehaviour changedPaginationBehaviour = PaginationBehaviour.Throw;

            var parameterlessInstance = new DynamicQueryAttribute();
            var parameteredInstance   = new DynamicQueryAttribute(200, false, PaginationBehaviour.Throw);

            Assert.Equal(parameterlessInstance._maxCountSize, _defaultMaxCountSize);
            Assert.Equal(parameterlessInstance._includeDataSetCountToPagination, _defaultIncludeDataSetCount);
            Assert.Equal(parameterlessInstance._exceededPaginationCountBehaviour, _defaultPaginationBehaviour);

            Assert.Equal(parameteredInstance._maxCountSize, changedMaxCountSize);
            Assert.Equal(parameteredInstance._includeDataSetCountToPagination, changedIncludedataSetCount);
            Assert.Equal(parameteredInstance._exceededPaginationCountBehaviour, changedPaginationBehaviour);
        }