diff --git a/api/src/Feature.FormTemplates/ListAssignedTemplates/Endpoint.cs b/api/src/Feature.FormTemplates/ListAssignedTemplates/Endpoint.cs index b35e2fe07..e06ac6541 100644 --- a/api/src/Feature.FormTemplates/ListAssignedTemplates/Endpoint.cs +++ b/api/src/Feature.FormTemplates/ListAssignedTemplates/Endpoint.cs @@ -1,7 +1,6 @@ using Authorization.Policies.Requirements; using Feature.FormTemplates.Specifications; using Microsoft.AspNetCore.Authorization; -using Vote.Monitor.Core.Models; using Vote.Monitor.Core.Services.Security; using Vote.Monitor.Domain.Entities.ElectionRoundFormTemplateAggregate; @@ -10,7 +9,7 @@ namespace Feature.FormTemplates.ListAssignedTemplates; public class Endpoint(IReadRepository repository, ICurrentUserRoleProvider userRoleProvider, IAuthorizationService authorizationService) - : Endpoint>, NotFound>> + : Endpoint>, NotFound>> { public override void Configure() { @@ -18,25 +17,23 @@ public override void Configure() Policies(PolicyNames.AdminsOnly); } - public override async Task>, NotFound>> ExecuteAsync(Request req, CancellationToken ct) + public override async Task>, NotFound>> ExecuteAsync(Request req, CancellationToken ct) { var isNgoAdmin = userRoleProvider.IsNgoAdmin(); if (isNgoAdmin) { var result = await authorizationService.AuthorizeAsync(User, new NgoAdminRequirement()); - + if (!result.Succeeded) { return TypedResults.NotFound(); } } - + var specification = new ListAssignedFormTemplateSpecification(req); var assignedFormTemplates = await repository.ListAsync(specification, ct); - var assignedFormTemplatesCount = await repository.CountAsync(specification, ct); - - return TypedResults.Ok(new PagedResponse(assignedFormTemplates, - assignedFormTemplatesCount, req.PageNumber, req.PageSize)); + + return TypedResults.Ok(assignedFormTemplates); } } diff --git a/api/src/Feature.FormTemplates/ListAssignedTemplates/Request.cs b/api/src/Feature.FormTemplates/ListAssignedTemplates/Request.cs index 1fad49012..cee083603 100644 --- a/api/src/Feature.FormTemplates/ListAssignedTemplates/Request.cs +++ b/api/src/Feature.FormTemplates/ListAssignedTemplates/Request.cs @@ -1,8 +1,6 @@ -using Vote.Monitor.Core.Models; +namespace Feature.FormTemplates.ListAssignedTemplates; -namespace Feature.FormTemplates.ListAssignedTemplates; - -public class Request : BaseSortPaginatedRequest +public class Request { public Guid ElectionRoundId { get; set; } } diff --git a/api/src/Feature.FormTemplates/ListAssignedTemplates/Validator.cs b/api/src/Feature.FormTemplates/ListAssignedTemplates/Validator.cs index 0d679b753..5e90c2e3e 100644 --- a/api/src/Feature.FormTemplates/ListAssignedTemplates/Validator.cs +++ b/api/src/Feature.FormTemplates/ListAssignedTemplates/Validator.cs @@ -5,9 +5,5 @@ public class Validator : Validator public Validator() { RuleFor(x => x.ElectionRoundId).NotEmpty(); - RuleFor(x => x.PageNumber) - .GreaterThanOrEqualTo(1); - - RuleFor(x => x.PageSize).InclusiveBetween(1, 100); } } diff --git a/api/src/Feature.FormTemplates/Specifications/ListAssignedFormTemplateSpecification.cs b/api/src/Feature.FormTemplates/Specifications/ListAssignedFormTemplateSpecification.cs index cc6ab36c1..af560993b 100644 --- a/api/src/Feature.FormTemplates/Specifications/ListAssignedFormTemplateSpecification.cs +++ b/api/src/Feature.FormTemplates/Specifications/ListAssignedFormTemplateSpecification.cs @@ -1,7 +1,5 @@ -using System.Xml; -using Feature.FormTemplates.ListAssignedTemplates; +using Feature.FormTemplates.ListAssignedTemplates; using Vote.Monitor.Domain.Entities.ElectionRoundFormTemplateAggregate; -using Vote.Monitor.Domain.Specifications; namespace Feature.FormTemplates.Specifications; @@ -12,8 +10,7 @@ public ListAssignedFormTemplateSpecification(Request request) Query .Where(x => x.ElectionRoundId == request.ElectionRoundId) .Include(x => x.FormTemplate) - .ApplyDefaultOrdering(request) - .Paginate(request); + .OrderBy(x => x.FormTemplate.Code); Query .Select(x => new FormTemplateSlimModel diff --git a/api/tests/Feature.FormTemplates.UnitTests/Endpoints/ListAssignedEndpointTests.cs b/api/tests/Feature.FormTemplates.UnitTests/Endpoints/ListAssignedEndpointTests.cs index d21905b81..03adbb452 100644 --- a/api/tests/Feature.FormTemplates.UnitTests/Endpoints/ListAssignedEndpointTests.cs +++ b/api/tests/Feature.FormTemplates.UnitTests/Endpoints/ListAssignedEndpointTests.cs @@ -3,7 +3,6 @@ using Feature.FormTemplates.ListAssignedTemplates; using Feature.FormTemplates.Specifications; using Microsoft.AspNetCore.Authorization; -using Vote.Monitor.Core.Models; using Vote.Monitor.Core.Services.Security; using Vote.Monitor.Domain.Entities.ElectionRoundFormTemplateAggregate; @@ -63,7 +62,7 @@ public async Task Should_Return_NotFound_When_NgoAdmin_is_True_and_Authorization // Assert result.Should() - .BeOfType>, NotFound>>() + .BeOfType>, NotFound>>() .Which.Result.Should() .BeOfType(); } @@ -90,11 +89,14 @@ public async Task Should_Return_Ok_With_Empty_List_When_No_Assigned_Templates() // Assert result.Should() - .BeOfType>, NotFound>>(); + .BeOfType>, NotFound>>() + .Which.Result.Should() + .BeOfType>>() + .Which.Value.Should().BeEmpty(); } [Fact] - public async Task Should_Return_Ok_With_Paginated_List_When_Assigned_Templates_Exist() + public async Task Should_Return_Ok_With_List_When_Assigned_Templates_Exist() { // Arrange _userRoleProvider.IsNgoAdmin().Returns(true); @@ -105,36 +107,21 @@ public async Task Should_Return_Ok_With_Paginated_List_When_Assigned_Templates_E Arg.Any>()) .Returns(AuthorizationResult.Success()); - var numberOfFormTemplates = 3; - var totalCount = 154; - var pageSize = 100; - - var formTemplates = new FormTemplateSlimModelFaker().Generate(numberOfFormTemplates); + var formTemplates = new FormTemplateSlimModelFaker().Generate(3); _electionRoundFormTemplateRepository .ListAsync(Arg.Any()) .Returns(formTemplates); - _electionRoundFormTemplateRepository - .CountAsync(Arg.Any()) - .Returns(totalCount); - // Act - var request = new Request { PageSize = pageSize, PageNumber = numberOfFormTemplates }; + var request = new Request(); var result = await _endpoint.ExecuteAsync(request, default); // Assert result - .Should().BeOfType>, NotFound>>() + .Should().BeOfType>, NotFound>>() .Which - .Result.Should().BeOfType>>() - .Which.Value.Should().NotBeNull(); - - var pagedResult = (result.Result as Ok>)!.Value!; - - pagedResult.PageSize.Should().Be(pageSize); - pagedResult.CurrentPage.Should().Be(numberOfFormTemplates); - pagedResult.TotalCount.Should().Be(totalCount); - pagedResult.Items.Should().BeEquivalentTo(formTemplates); + .Result.Should().BeOfType>>() + .Which.Value.Should().BeEquivalentTo(formTemplates); } } diff --git a/api/tests/Feature.FormTemplates.UnitTests/Specifications/ListAssignedTemplatesSpecificationTests.cs b/api/tests/Feature.FormTemplates.UnitTests/Specifications/ListAssignedTemplatesSpecificationTests.cs index 6101afc1d..f7a1b1068 100644 --- a/api/tests/Feature.FormTemplates.UnitTests/Specifications/ListAssignedTemplatesSpecificationTests.cs +++ b/api/tests/Feature.FormTemplates.UnitTests/Specifications/ListAssignedTemplatesSpecificationTests.cs @@ -1,15 +1,11 @@ using Feature.FormTemplates.ListAssignedTemplates; using Feature.FormTemplates.Specifications; -using Vote.Monitor.Core.Models; using Vote.Monitor.Domain.Entities.ElectionRoundFormTemplateAggregate; -using Vote.Monitor.Domain.Entities.FormAggregate; namespace Feature.FormTemplates.UnitTests.Specifications; public class ListAssignedTemplatesSpecificationTests { - private readonly FormStatus DefaultStatus = FormStatus.Drafted; - [Fact] public void ListAssignedTemplatesSpecification_Should_Filter_By_ElectionRoundId_And_Return_Correct_FormTemplates() { @@ -18,130 +14,47 @@ public void ListAssignedTemplatesSpecification_Should_Filter_By_ElectionRoundId_ var formTemplateId = Guid.NewGuid(); var request = new Request { - ElectionRoundId = electionRoundId, - PageNumber = 1, - PageSize = 10 + ElectionRoundId = electionRoundId }; - + var matchingTemplate = new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate(); - var secondMatchingTemaplate = new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate(); + var secondMatchingTemplate = new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate(); var nonMatchingTemplate = new ElectionRoundFormTemplateAggregateFaker(Guid.NewGuid(), Guid.NewGuid()).Generate(); var testCollection = new List { matchingTemplate, - secondMatchingTemaplate, + secondMatchingTemplate, nonMatchingTemplate }.AsQueryable(); var spec = new ListAssignedFormTemplateSpecification(request); - // Act - var result = spec.Evaluate(testCollection).ToList(); - - // Assert - var expectedIds = new List {matchingTemplate.FormTemplate.Id, secondMatchingTemaplate.FormTemplate.Id }; - - result.Should().HaveCount(2); - result.Select(x => x.Id).Should().BeEquivalentTo(expectedIds); - } - - [Theory] - [MemberData(nameof(TestData.EmptyStringsTestCases), MemberType = typeof(TestData))] - public void ListAssignedTemplatesSpecification_AppliesDefaultSorting_WhenNoSortColumnSet(string columnName) - { - // Arrange - var electionRoundId = Guid.NewGuid(); - var formTemplateId = Guid.NewGuid(); - var template1 = new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate(); - var template2 = new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate(); - - - var testCollection = Enumerable - .Range(1, 100) - .Select(idx => new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate()) - .Union(new[] { template1, template2 }) - .ToList(); - - var request = new Request - { - ElectionRoundId = electionRoundId, - SortColumnName = columnName, - PageSize = 100, - PageNumber = 2 - }; - - var spec = new ListAssignedFormTemplateSpecification(request); - // Act var result = spec.Evaluate(testCollection).ToList(); // Assert + var expectedIds = new List { matchingTemplate.FormTemplate.Id, secondMatchingTemplate.FormTemplate.Id }; + result.Should().HaveCount(2); - result.Should().BeInAscendingOrder(x => x.LastModifiedOn); + result.Select(x => x.Id).Should().BeEquivalentTo(expectedIds); } - - [Theory] - [MemberData(nameof(NameSortingTestCases))] - public void ListAssignedFormTemplatesSpecification_AppliesSortingCorrectly(string columnName, SortOrder? sortOrder) - { - // Arrange - var electionRoundId = Guid.NewGuid(); - var formTemplateId = Guid.NewGuid(); - - - var testCollection = Enumerable - .Range(1, 100) - .Select(idx => new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate()) - .ToList(); - - var request = new Request - { - ElectionRoundId = electionRoundId, - SortColumnName = columnName, - SortOrder = sortOrder, - PageSize = 100, - PageNumber = 1 - }; - - var spec = new ListAssignedFormTemplateSpecification(request); - - // Act - var result = spec.Evaluate(testCollection).ToList(); - // Assert - result.Should().HaveCount(100); - - var expectedCodes = (sortOrder == SortOrder.Desc) - ? testCollection.OrderByDescending(x => x.FormTemplate.Code).Select(x => x.FormTemplate.Code).ToList() - : testCollection.OrderBy(x => x.FormTemplate.Code).Select(x => x.FormTemplate.Code).ToList(); // Default is ascending - - var actualCodes = result.Select(x => x.Code).ToList(); - - actualCodes.Should().BeEquivalentTo(expectedCodes); - } - [Fact] - public void ListAssignedTemplatesSpecification_PaginatesCorrectly() + public void ListAssignedTemplatesSpecification_Should_Return_All_Matching_Templates_Ordered_By_Code() { // Arrange var electionRoundId = Guid.NewGuid(); var formTemplateId = Guid.NewGuid(); - var template1 = new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate(); - var template2 = new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate(); - var testCollection = Enumerable - .Range(1, 100) - .Select(idx => new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate()) - .Union(new[] { template1, template2 }) + .Range(1, 25) + .Select(_ => new ElectionRoundFormTemplateAggregateFaker(electionRoundId, formTemplateId).Generate()) .ToList(); var request = new Request { - ElectionRoundId = electionRoundId, - PageSize = 100, - PageNumber = 2 + ElectionRoundId = electionRoundId }; var spec = new ListAssignedFormTemplateSpecification(request); @@ -150,17 +63,7 @@ public void ListAssignedTemplatesSpecification_PaginatesCorrectly() var result = spec.Evaluate(testCollection).ToList(); // Assert - result.Should().HaveCount(2); + result.Should().HaveCount(25); + result.Should().BeInAscendingOrder(x => x.Code); } - - - - public static IEnumerable NameSortingTestCases => - new List - { - new object[] { "code", null }, - new object[] { "Code", null }, - new object[] { "code", SortOrder.Asc }, - new object[] { "Code", SortOrder.Asc } - }; } diff --git a/api/tests/Feature.FormTemplates.UnitTests/ValidatorTests/ListAssignedRequestValidatorTests.cs b/api/tests/Feature.FormTemplates.UnitTests/ValidatorTests/ListAssignedRequestValidatorTests.cs index 766b6a7c1..bcbfd67e9 100644 --- a/api/tests/Feature.FormTemplates.UnitTests/ValidatorTests/ListAssignedRequestValidatorTests.cs +++ b/api/tests/Feature.FormTemplates.UnitTests/ValidatorTests/ListAssignedRequestValidatorTests.cs @@ -5,71 +5,36 @@ namespace Feature.FormTemplates.UnitTests.ValidatorTests; public class ListAssignedRequestValidatorTests { private readonly Validator _validator = new(); - - [Theory] - [InlineData(1)] - [InlineData(50)] - [InlineData(100)] - public void Validation_ShouldPass_When_PageSize_ValidValues(int pageSize) + + [Fact] + public void Validation_ShouldPass_When_ElectionRoundId_NotEmpty() { // Arrange var request = new Request { - PageSize = pageSize, - PageNumber = 1 + ElectionRoundId = Guid.NewGuid() }; // Act var result = _validator.TestValidate(request); // Assert - result.ShouldNotHaveValidationErrorFor(x => x.PageSize); - } - - [Theory] - [InlineData(0)] - [InlineData(101)] - [InlineData(-5)] - public void Validation_ShouldFail_When_PageSize_InvalidValues(int pageSize) - { - // Arrange - var request = new Request() { PageSize = pageSize, PageNumber = 1 }; - - // Act - var result = _validator.TestValidate(request); - - // Assert - result.ShouldHaveValidationErrorFor(x => x.PageSize); + result.ShouldNotHaveValidationErrorFor(x => x.ElectionRoundId); } - [Theory] - [InlineData(1)] - [InlineData(10)] - [InlineData(100)] - public void Validation_ShouldPass_When_PageNumber_ValidValues(int pageNumber) - { - // Arrange - var request = new Request() { PageSize = 10, PageNumber = pageNumber }; - - // Act - var result = _validator.TestValidate(request); - - // Assert - result.ShouldNotHaveValidationErrorFor(x => x.PageNumber); - } - - [Theory] - [InlineData(0)] - [InlineData(-10)] - public void Validation_ShouldFail_When_PageNumber_InValidValues(int pageNumber) + [Fact] + public void Validation_ShouldFail_When_ElectionRoundId_Empty() { // Arrange - var request = new Request() { PageSize = 10, PageNumber = pageNumber }; + var request = new Request + { + ElectionRoundId = Guid.Empty + }; // Act var result = _validator.TestValidate(request); // Assert - result.ShouldHaveValidationErrorFor(x => x.PageNumber); + result.ShouldHaveValidationErrorFor(x => x.ElectionRoundId); } }