diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d4c589..2aca7bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ All notable changes to **LightQuery** are documented here. +## v1.5.2: +- Bugfix: Empty results now report the `page` as `1` instead of `0`. Thanks to GitHub user @erdembas for the pull request! + ## v1.5.1: - When a `page` is requested that is higher than the last available one, the last available one will be returned instead. Thanks to GitHub user @erdembas for the pull request! diff --git a/src/LightQuery.EntityFrameworkCore/AsyncLightQueryAttribute.cs b/src/LightQuery.EntityFrameworkCore/AsyncLightQueryAttribute.cs index a2b9705..113bff0 100644 --- a/src/LightQuery.EntityFrameworkCore/AsyncLightQueryAttribute.cs +++ b/src/LightQuery.EntityFrameworkCore/AsyncLightQueryAttribute.cs @@ -51,6 +51,7 @@ private async Task> GetPaginationResult(QueryContainer if (totalCount <= ((queryOptions.Page - 1) * queryOptions.PageSize)) { queryOptions.Page = (int)System.Math.Ceiling((decimal)totalCount / queryOptions.PageSize); + queryOptions.Page = queryOptions.Page == 0 ? 1 : queryOptions.Page; } return new PaginationResult diff --git a/src/LightQuery/LightQueryAttribute.cs b/src/LightQuery/LightQueryAttribute.cs index 6d7c81a..d6b3982 100644 --- a/src/LightQuery/LightQueryAttribute.cs +++ b/src/LightQuery/LightQueryAttribute.cs @@ -44,6 +44,7 @@ private PaginationResult GetPaginationResult(QueryContainer queryContain if (totalCount <= ((queryOptions.Page - 1) * queryOptions.PageSize)) { queryOptions.Page = (int)System.Math.Ceiling((decimal)totalCount / queryOptions.PageSize); + queryOptions.Page = queryOptions.Page == 0 ? 1 : queryOptions.Page; } return new PaginationResult diff --git a/test/LightQuery.EntityFrameworkCore.Tests.Integration/ControllerTests/AsyncPaginatedLightQueryControllerTests.cs b/test/LightQuery.EntityFrameworkCore.Tests.Integration/ControllerTests/AsyncPaginatedLightQueryControllerTests.cs index 6cb7b0d..1e0072c 100644 --- a/test/LightQuery.EntityFrameworkCore.Tests.Integration/ControllerTests/AsyncPaginatedLightQueryControllerTests.cs +++ b/test/LightQuery.EntityFrameworkCore.Tests.Integration/ControllerTests/AsyncPaginatedLightQueryControllerTests.cs @@ -209,6 +209,18 @@ public async Task IfPageAndPageSizeExceedTotalCountReturnsLastValidPageAndRecord Assert.Equal(5, pagedResult.Data.Count); } + [Fact] + public async Task ReturnsEmptyResultWithPageSetToOneIfNoRecordsPresent() + { + var url = "AsyncPaginatedLightQuery?returnEmptyList=true&pageSize=5"; + var pagedResult = await GetResponse>(url); + Assert.Equal(0, pagedResult.TotalCount); + + Assert.Equal(1, pagedResult.Page); + Assert.Equal(5, pagedResult.PageSize); + Assert.Empty(pagedResult.Data); + } + [Fact] public async Task AppliesDefaultSortWithoutClientSortParameter() { diff --git a/test/LightQuery.IntegrationTestsServer/Controllers/AsyncPaginatedLightQueryController.cs b/test/LightQuery.IntegrationTestsServer/Controllers/AsyncPaginatedLightQueryController.cs index a066215..723c64e 100644 --- a/test/LightQuery.IntegrationTestsServer/Controllers/AsyncPaginatedLightQueryController.cs +++ b/test/LightQuery.IntegrationTestsServer/Controllers/AsyncPaginatedLightQueryController.cs @@ -16,9 +16,13 @@ public AsyncPaginatedLightQueryController(LightQueryContext context) private readonly LightQueryContext _context; [LightQuery(forcePagination: true, defaultPageSize: 3)] - public IActionResult GetValues() + public IActionResult GetValues(bool returnEmptyList = false) { var users = _context.Users.OrderBy(u => Guid.NewGuid()); + if (returnEmptyList) + { + users = users.Where(u => false).AsQueryable().OrderBy(u => Guid.NewGuid()); + } return Ok(users); } diff --git a/test/LightQuery.IntegrationTestsServer/Controllers/PaginatedLightQueryController.cs b/test/LightQuery.IntegrationTestsServer/Controllers/PaginatedLightQueryController.cs index 224066a..793d489 100644 --- a/test/LightQuery.IntegrationTestsServer/Controllers/PaginatedLightQueryController.cs +++ b/test/LightQuery.IntegrationTestsServer/Controllers/PaginatedLightQueryController.cs @@ -16,9 +16,13 @@ public PaginatedLightQueryController(LightQueryContext context) private readonly LightQueryContext _context; [LightQuery(forcePagination: true, defaultPageSize: 3)] - public IActionResult GetValues() + public IActionResult GetValues(bool returnEmptyList = false) { var users = _context.Users.OrderBy(u => Guid.NewGuid()); + if (returnEmptyList) + { + users = users.Where(u => false).AsQueryable().OrderBy(u => Guid.NewGuid()); + } return Ok(users); } diff --git a/test/LightQuery.Tests.Integration/ControllerTests/PaginatedLightQueryControllerTests.cs b/test/LightQuery.Tests.Integration/ControllerTests/PaginatedLightQueryControllerTests.cs index 7de28f7..a26c2e2 100644 --- a/test/LightQuery.Tests.Integration/ControllerTests/PaginatedLightQueryControllerTests.cs +++ b/test/LightQuery.Tests.Integration/ControllerTests/PaginatedLightQueryControllerTests.cs @@ -209,6 +209,18 @@ public async Task IfPageAndPageSizeExceedTotalCountReturnsLastValidPageAndRecord Assert.Equal(5, pagedResult.Data.Count); } + [Fact] + public async Task ReturnsEmptyResultWithPageSetToOneIfNoRecordsPresent() + { + var url = "PaginatedLightQuery?returnEmptyList=true&pageSize=5"; + var pagedResult = await GetResponse>(url); + Assert.Equal(0, pagedResult.TotalCount); + + Assert.Equal(1, pagedResult.Page); + Assert.Equal(5, pagedResult.PageSize); + Assert.Empty(pagedResult.Data); + } + [Fact] public async Task AppliesDefaultSortWithoutClientSortParameter() {