public async Task AllAsync_UsingPaginator_ReturnsExpectedResult()
        {
            // Arrange
            var people = new[]
            {
                new Person {
                    GivenName = "Dwayne", FamilyName = "Welsh"
                },
                new Person {
                    GivenName = "Ed", FamilyName = "Stuart"
                },
                new Person {
                    GivenName = "Hollie", FamilyName = "Marin"
                },
                new Person {
                    GivenName = "Randall", FamilyName = "Bloom"
                },
            };

            uow.People().AddRange(people);
            await uow.CompleteAsync();

            var paginator = new SortingPaginator <Person>().StartingAt(1).WithPageSizeOf(2).SortedBy("Id", SortDirection.Descending);

            // Act
            var paginatedResult = await uow.People().AllAsync(paginator);

            // Assert
            Assert.AreEqual(2, paginatedResult.Count());
            Assert.AreEqual("Randall", paginatedResult[0].GivenName);
            Assert.AreEqual("Hollie", paginatedResult[1].GivenName);
        }
        public void HasPreviousPage_ByDefault_ReturnsFalse()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 5);

            // Act
            var result = paginator.HasPreviousPage();

            // Assert
            Assert.IsFalse(result);
        }
        public void SortedByString_GivenEmptyOrWhiteSpaceOnlyString_ThrowsArgumentException(string value)
        {
            // Arrange
            var paginator = new SortingPaginator <Person>();

            // Act
            void action() => paginator.SortedByString(value);

            // Assert
            Assert.ThrowsException <ArgumentException>(action);
        }
        public void SortedByString_GivenInvalidString_ThrowsFormatException(string value)
        {
            // Arrange
            var paginator = new SortingPaginator <Person>();

            // Act
            void action() => paginator.SortedByString(value);

            // Assert
            Assert.ThrowsException <FormatException>(action);
        }
        public void PageNumber_ByDefault_ReturnsOne()
        {
            // Arrange
            var paginator = new SortingPaginator <object>();

            // Act
            var pageNumber = paginator.PageNumber;

            // Assert
            Assert.AreEqual(1, pageNumber);
        }
        public void SortedByString_GivenNullString_ThrowsArgumentNullException()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>();

            // Act
            void action() => paginator.SortedByString(null);

            // Assert
            Assert.ThrowsException <ArgumentNullException>(action);
        }
        public void MovePreviousPage_ByDefault_DoesNotMoveToPreviousPage()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 5);

            // Act
            var result = paginator.MovePreviousPage();

            // Assert
            Assert.IsFalse(result);
        }
        public void ItemCount_ByDefault_ReturnsZero()
        {
            // Arrange
            var paginator = new SortingPaginator <object>();

            // Act
            var itemCount = paginator.ItemCount;

            // Assert
            Assert.AreEqual(0, itemCount);
        }
        public void PageSize_ByDefault_ReturnsDefaultPageSize()
        {
            // Arrange
            var paginator = new SortingPaginator <object>();

            // Act
            var pageSize = paginator.PageSize;

            // Assert
            Assert.AreEqual(SortingPaginator <object> .DefaultPageSize, pageSize);
        }
        public void PageSize_GivenInvalidValue_ThrowsArgumentOutOfRangeException(int pageSize)
        {
            // Arrange
            var paginator = new SortingPaginator <object>();

            // Act
            void action() => paginator.PageSize = pageSize;

            // Assert
            Assert.ThrowsException <ArgumentOutOfRangeException>(action);
        }
        public void MoveNextPage_ByDefault_DoesNotMoveToNextPage()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 5);

            // Act
            var result = paginator.MoveNextPage();

            // Assert
            Assert.IsFalse(result);
            Assert.AreNotEqual(2, paginator.PageNumber);
        }
        public void Paginate_WithNoSortProperties_ReturnsUnorderedPage()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 5);

            // Act
            var result = paginator.Paginate(People);

            // Assert
            Assert.AreEqual(5, result.Count());
            Assert.AreEqual("Welsh", result.First().FamilyName);
            Assert.AreEqual("Hensley", result.Last().FamilyName);
        }
        public void HasNextPage_AfterPaginating_ReturnsTrue()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 5);

            paginator.Paginate(People);

            // Act
            var result = paginator.HasNextPage();

            // Assert
            Assert.IsTrue(result);
        }
        public void SortedByString_GivenSingleDirective_AddsSortDirective()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>();

            // Act
            paginator.SortedByString("FamilyName");

            // Assert
            Assert.AreEqual(1, paginator.SortDirectives.Count);
            Assert.AreEqual("FamilyName", GetPropertyNameFromLambda(((SortProperty <Person>)paginator.SortDirectives.First()).Property));
            Assert.AreEqual(SortDirection.Ascending, ((SortProperty <Person>)paginator.SortDirectives.First()).Direction);
        }
        public void SortedBy_GivenInvalidNestedProperty_ThrowsArgumentException()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>();

            // Act
            void action() => paginator.SortedBy("FavoriteBook.UndefinedProperty");

            // Assert
            var exception = Assert.ThrowsException <ArgumentException>(action);

            Assert.AreEqual("No property 'UndefinedProperty' on type 'Book'. (Parameter 'propertyName')", exception.Message);
        }
        public void HasPreviousPage_AfterPaginatingStartingAtFirstPage_ReturnsFalse()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 5);

            paginator.Paginate(People);

            // Act
            var result = paginator.HasPreviousPage();

            // Assert
            Assert.IsFalse(result);
        }
        public void Find_GivenNullFilterAndNonNullPaginator_ThrowsArgumentNullException()
        {
            // Arrange
            var repository = uow.Repository <Person>();
            IQueryableFilter <Person>    filter    = null;
            IQueryablePaginator <Person> paginator = new SortingPaginator <Person>();

            // Act
            void action() => repository.Find(filter, paginator);

            // Assert
            Assert.ThrowsException <ArgumentNullException>(action);
        }
        public void MoveNextPage_AfterPaginating_MovesToNextPage()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 5);

            paginator.Paginate(People);

            // Act
            var result = paginator.MoveNextPage();

            // Assert
            Assert.IsTrue(result);
            Assert.AreEqual(2, paginator.PageNumber);
        }
        public void Paginate_SortedByAgeDescendingUsingExpression_ReturnsExpectedResult()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>().StartingAt(1).WithPageSizeOf(2);

            paginator.SortedBy(p => p.Age, SortDirection.Descending);

            // Act
            var result = paginator.Paginate(People);

            // Assert
            Assert.AreEqual(2, result.Count());
            Assert.AreEqual("Edgar Bernard", result.First().FullName());
            Assert.AreEqual("Randall Bloom", result.Last().FullName());
        }
        public void MovePreviousPage_AfterPaginatingStartingAtLastPage_MovesToPreviousPage()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 5);

            paginator.Paginate(People);
            paginator.PageNumber = paginator.PageCount;

            // Act
            var result = paginator.MovePreviousPage();

            // Assert
            Assert.IsTrue(result);
            Assert.AreEqual(paginator.PageCount - 1, paginator.PageNumber);
        }
        public void Paginate_SortedByFamilyNameDescending_ReturnsExpectedResult()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 2);

            paginator.SortDirectives.Add(new SortProperty <Person>("FamilyName", SortDirection.Descending));

            // Act
            var result = paginator.Paginate(People);

            // Assert
            Assert.AreEqual(2, result.Count());
            Assert.AreEqual("Welsh", result.First().FamilyName);
            Assert.AreEqual("Stuart", result.Last().FamilyName);
        }
        public void Paginate_SortedByGivenNameAscending_ReturnsExpectedResult()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 2);

            paginator.SortDirectives.Add(new SortProperty <Person>("GivenName", SortDirection.Ascending));

            // Act
            var result = paginator.Paginate(People);

            // Assert
            Assert.AreEqual(2, result.Count());
            Assert.AreEqual("Ana", result.First().GivenName);
            Assert.AreEqual("Dwayne", result.Last().GivenName);
        }
        public void Paginate_SortedByAgeAscending_ReturnsExpectedResult()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>().StartingAt(1).WithPageSizeOf(3);

            paginator.SortedBy("Age", SortDirection.Ascending);

            // Act
            var result = paginator.Paginate(People);

            // Assert
            Assert.AreEqual(3, result.Count());
            Assert.AreEqual("Phillipa Connor", result.First().FullName()); // null < any other value
            Assert.AreEqual("Peter Connor", result.ElementAt(1).FullName());
            Assert.AreEqual("Dwayne Welsh", result.Last().FullName());
        }
        public async Task AllAsync_ByDefault_ReturnsPaginatedList()
        {
            // Arrange
            await uow.BeginTransactionAsync().ConfigureAwait(false);

            var people = new[]
            {
                new Person {
                    GivenName = "Dwayne", FamilyName = "Welsh"
                },
                new Person {
                    GivenName = "Ed", FamilyName = "Stuart"
                },
                new Person {
                    GivenName = "Hollie", FamilyName = "Marin"
                },
                new Person {
                    GivenName = "Randall", FamilyName = "Bloom"
                },
                new Person {
                    GivenName = "Glenn", FamilyName = "Hensley"
                },
                new Person {
                    GivenName = "Phillipa", FamilyName = "Connor"
                },
                new Person {
                    GivenName = "Ana", FamilyName = "Bryan"
                },
                new Person {
                    GivenName = "Edgar", FamilyName = "Bernard"
                }
            };

            uow.People().AddRange(people);

            await uow.CompleteAsync().ConfigureAwait(false);

            // Act
            var paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 5);

            var result = await uow.People().AllAsync(paginator).ConfigureAwait(false);

            // Assert
            Assert.AreEqual(5, result.Count);
            Assert.AreEqual(paginator.PageNumber, result.PageNumber);
            Assert.AreEqual(paginator.PageCount, result.PageCount);
        }
        public void Paginate_SortedByFamilyNameAscendingThenGivenNameDescending_ReturnsExpectedResult()
        {
            // Arrange
            var paginator = new SortingPaginator <Person>(pageNumber: 2, pageSize: 3);

            paginator.SortDirectives.Add(new SortProperty <Person>("FamilyName", SortDirection.Ascending));
            paginator.SortDirectives.Add(new SortProperty <Person>("GivenName", SortDirection.Descending));

            // Act
            var result = paginator.Paginate(People);

            // Assert
            Assert.AreEqual(3, result.Count());
            Assert.AreEqual("Phillipa", result.First().GivenName);
            Assert.AreEqual("Peter", result.ElementAt(1).GivenName);
            Assert.AreEqual("Glenn", result.Last().GivenName);
        }
        public void Find_UsingPaginator_ReturnsExpectedResult()
        {
            // Arrange
            var people = new[]
            {
                new Person {
                    GivenName = "Dwayne", FamilyName = "Welsh"
                },
                new Person {
                    GivenName = "Ed", FamilyName = "Stuart"
                },
                new Person {
                    GivenName = "Hollie", FamilyName = "Marin"
                },
                new Person {
                    GivenName = "Randall", FamilyName = "Bloom"
                },
                new Person {
                    GivenName = "Glenn", FamilyName = "Hensley"
                },
                new Person {
                    GivenName = "Phillipa", FamilyName = "Connor"
                },
                new Person {
                    GivenName = "Ana", FamilyName = "Bryan"
                },
                new Person {
                    GivenName = "Edgar", FamilyName = "Bernard"
                }
            };

            uow.People().AddRange(people);
            uow.Complete();

            IQueryablePaginator <Person> paginator = new SortingPaginator <Person>(pageNumber: 1, pageSize: 2).SortedBy(nameof(Person.FamilyName));

            // Act
            var result          = uow.People().Find(p => p.GivenName.Contains("ll"));            // 3
            var paginatedResult = uow.People().Find(p => p.GivenName.Contains("ll"), paginator); // 2

            // Assert
            Assert.AreEqual(3, result.Count());
            Assert.AreEqual(2, paginatedResult.Count());
            Assert.AreEqual("Randall", paginatedResult.First().GivenName);
            Assert.AreEqual("Phillipa", paginatedResult.Last().GivenName);
        }
        protected async override Task OnApplicationStartedAsync(CancellationToken cancellationToken)
        {
            var uow = ServiceProvider.GetRequiredService <IUnitOfWork>();

            if (!uow.IsTransactional)
            {
                await uow.BeginTransactionAsync(cancellationToken);
            }

            new DataSeeder().Seed(uow.People());
            await uow.CompleteAsync(cancellationToken).ConfigureAwait(true);

            var person = uow.People().Find(new FilterByName {
                FamilyName = "Welsh"
            }).SingleOrDefault();

            var paginator = new SortingPaginator <Person>().StartingAt(1).WithPageSizeOf(2).SortedBy("Contact.HomeAddress.State", SortDirection.Descending);

            do
            {
                var people = uow.People().All(paginator);
            } while (paginator.MoveNextPage());
        }