Exemple #1
0
        public void SortDirective_CannotParseADirectiveWithoutAField()
        {
            var result = SortDirective.TryParse(":asc", out var directive);

            Assert.IsFalse(result);
            Assert.IsNull(directive);
        }
Exemple #2
0
        public void SortDirective_ReturnsNullForInvalidDirectives()
        {
            var directives = SortDirective
                             .GetSortDirectivesFrom("age:desc,:,name:asc");

            Assert.IsNull(directives);
        }
Exemple #3
0
        public void SortDirective_CannotParseADirectiveWithAnInvalidDirectionSpecified()
        {
            var result = SortDirective.TryParse("name:invalid", out var directive);

            Assert.IsFalse(result);
            Assert.IsNull(directive);
        }
        public IResult <Pagination <TSource> > Paginate
        (
            IEnumerable <TSource> items,
            IPaginationInstruction paginationInstruction
        )
        {
            var limit    = paginationInstruction.Limit;
            var maxLimit = paginationInstruction.MaxLimit;
            var offset   = paginationInstruction.Offset;
            var sort     = paginationInstruction.Sort;

            if (limit < 1)
            {
                return(ResultFactory
                       .Failure($"The limit parameter is expected to be a positive number (max: {maxLimit})."));
            }

            if (limit > maxLimit)
            {
                return(ResultFactory
                       .Failure($"The limit parameter must not exceed what is max allowed (max: {maxLimit})."));
            }

            if (offset < 0)
            {
                return(ResultFactory
                       .Failure("The offset parameter is expected to be a non-negative number."));
            }

            var sortDirectives = SortDirective
                                 .GetSortDirectivesFrom(sort);

            if (sortDirectives == null)
            {
                return(ResultFactory
                       .Failure("The sort parameter contains invalid directives (expected format: 'property[:asc|desc][,property..]', e.g. 'property1,property2:desc')."));
            }

            var invalidSortFields = sortDirectives
                                    .Where(x => !_sorters.ContainsKey(x.Property))
                                    .Select(x => x.Property)
                                    .ToList();

            if (invalidSortFields.Any())
            {
                return(ResultFactory
                       .Failure($"The sort parameter contains directives for nonexistent fields ('${string.Join("', '", invalidSortFields)}')."));
            }

            var paginated = Sort(items, sortDirectives)
                            .Skip(offset)
                            .Take(limit)
                            .ToList();

            var pagination = new Pagination <TSource>(paginated, limit, offset, sort, items.Count());

            return(ResultFactory
                   .Success(pagination));
        }
Exemple #5
0
        public void SortDirective_CanParseADirectiveWithSurroundingWhiteSpace()
        {
            var result = SortDirective.TryParse(" name : asc ", out var directive);

            Assert.IsTrue(result);
            Assert.AreEqual("name", directive.Property);
            Assert.AreEqual(SortDirection.Asc, directive.Direction);
        }
Exemple #6
0
        public void SortDirective_CanParseADirectiveWithDirectionSeparatorButNoDirection()
        {
            var result = SortDirective.TryParse("name:", out var directive);

            Assert.IsTrue(result);
            Assert.AreEqual("name", directive.Property);
            Assert.AreEqual(SortDirection.Asc, directive.Direction);
        }
Exemple #7
0
        public void SortDirective_CanParseADirectiveWithoutSpecifiedDirection()
        {
            var result = SortDirective.TryParse("name", out var directive);

            Assert.IsTrue(result);
            Assert.AreEqual("name", directive.Property);
            Assert.AreEqual(SortDirection.Asc, directive.Direction);
        }
Exemple #8
0
        public void SortDirective_OnlyReturnsTheFirstSpecifiedDirectivePerField()
        {
            var directives = SortDirective
                             .GetSortDirectivesFrom("age:desc,name:asc,age:asc");

            Assert.AreEqual(2, directives.Count());

            var first = directives.First();
            var last  = directives.Last();

            Assert.AreEqual("age", first.Property);
            Assert.AreEqual(SortDirection.Desc, first.Direction);
            Assert.AreEqual("name", last.Property);
            Assert.AreEqual(SortDirection.Asc, last.Direction);
        }
Exemple #9
0
        public void SortDirective_IgnoresEmptyDirectives()
        {
            var directives = SortDirective
                             .GetSortDirectivesFrom("age:desc,,name:asc");

            Assert.AreEqual(2, directives.Count());

            var first = directives.First();
            var last  = directives.Last();

            Assert.AreEqual("age", first.Property);
            Assert.AreEqual(SortDirection.Desc, first.Direction);
            Assert.AreEqual("name", last.Property);
            Assert.AreEqual(SortDirection.Asc, last.Direction);
        }