From 145d5feb26c5f7a0f38a408768077043f74a87e1 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Mon, 28 Mar 2022 17:06:34 +0100 Subject: [PATCH 01/19] PV2-2849 draft controller + endpoint --- .../ApprenticeshipStatisticsController.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs new file mode 100644 index 0000000000..338b1b6bb1 --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs @@ -0,0 +1,20 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace SFA.DAS.CommitmentsV2.Api.Controllers +{ + [ApiController] + [Authorize] + [Route("api/apprenticeshipstatistics")] + public class ApprenticeshipStatisticsController + { + + [HttpGet] + [Route("/stats")] + public async Task GetStatistics(int lastNumberOfDays) + { + + } + } +} From e3b6ac9a74c1656da0b46d219d902ac5aa9e8db9 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Thu, 31 Mar 2022 17:09:58 +0100 Subject: [PATCH 02/19] PV2-2849 initial GetApprenticeshipStatistics query added --- .../GetApprenticeshipStatisticsQuery.cs | 12 ++++++++++++ .../GetApprenticeshipStatisticsQueryHandler.cs | 10 ++++++++++ .../GetApprenticeshipStatisticsQueryResult.cs | 13 +++++++++++++ .../GetApprenticeshipStatisticsQueryValidator.cs | 11 +++++++++++ 4 files changed, 46 insertions(+) create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQuery.cs create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryResult.cs create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryValidator.cs diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQuery.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQuery.cs new file mode 100644 index 0000000000..5e59fa1b92 --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQuery.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; +using MediatR; + +namespace SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics +{ + public class GetApprenticeshipStatisticsQuery : IRequest + { + public int LastNumberOfDays { get; set; } + } +} diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs new file mode 100644 index 0000000000..05e92fd46c --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics +{ + public class GetApprenticeshipStatisticsQueryHandler + { + } +} diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryResult.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryResult.cs new file mode 100644 index 0000000000..869699cb82 --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryResult.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics +{ + public class GetApprenticeshipStatisticsQueryResult + { + public long ApprovedApprenticeshipCount { get; set; } + public long PausedApprenticeshipCount { get; set; } + public long StoppedApprenticeshipCount { get; set; } + } +} diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryValidator.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryValidator.cs new file mode 100644 index 0000000000..85dc4e0ce4 --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryValidator.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; +using FluentValidation; + +namespace SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics +{ + public class GetApprenticeshipStatisticsQueryValidator : AbstractValidator + { + } +} From 8cf2d0a272b729f45166d18eb6aef0d3f6dcaf0f Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Thu, 31 Mar 2022 17:10:33 +0100 Subject: [PATCH 03/19] PV2-2849 GetApprenticeshipStatisticsResponse api response dto --- .../GetApprenticeshipStatisticsResponse.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.Types/Responses/GetApprenticeshipStatisticsResponse.cs diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.Types/Responses/GetApprenticeshipStatisticsResponse.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.Types/Responses/GetApprenticeshipStatisticsResponse.cs new file mode 100644 index 0000000000..3a19863dc5 --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.Types/Responses/GetApprenticeshipStatisticsResponse.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SFA.DAS.CommitmentsV2.Api.Types.Responses +{ + public class GetApprenticeshipStatisticsResponse + { + public long ApprovedApprenticeshipCount { get; set; } + public long PausedApprenticeshipCount { get; set; } + public long StoppedApprenticeshipCount { get; set; } + } +} From a6cdf1d887aa324aa07b7531705cc3cbdeece6da Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Thu, 31 Mar 2022 17:11:05 +0100 Subject: [PATCH 04/19] PV2-2849 initial controller logic --- .../ApprenticeshipStatisticsController.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs index 338b1b6bb1..e430669938 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs @@ -1,6 +1,8 @@ using System.Threading.Tasks; +using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; namespace SFA.DAS.CommitmentsV2.Api.Controllers { @@ -9,12 +11,24 @@ namespace SFA.DAS.CommitmentsV2.Api.Controllers [Route("api/apprenticeshipstatistics")] public class ApprenticeshipStatisticsController { + private readonly IMediator _mediator; + + public ApprenticeshipStatisticsController(IMediator mediator) + { + _mediator = mediator; + } + [HttpGet] [Route("/stats")] public async Task GetStatistics(int lastNumberOfDays) { + var result = await _mediator.Send(new GetApprenticeshipStatisticsQuery { LastNumberOfDays = lastNumberOfDays }); + if (result == null) + { + return NotFound(); + } } } } From 612b5da612cb5c9956fa2d602ecceccc2fcf5130 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Fri, 1 Apr 2022 15:43:37 +0100 Subject: [PATCH 05/19] PV2-2849 ApprenticeshipStatisticsController GetStatistics action implementation --- .../ApprenticeshipStatisticsController.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs index e430669938..a1f8ea055a 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs @@ -2,20 +2,25 @@ using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using SFA.DAS.CommitmentsV2.Api.Types.Responses; using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; +using SFA.DAS.CommitmentsV2.Shared.Interfaces; namespace SFA.DAS.CommitmentsV2.Api.Controllers { [ApiController] [Authorize] [Route("api/apprenticeshipstatistics")] - public class ApprenticeshipStatisticsController + public class ApprenticeshipStatisticsController : ControllerBase { private readonly IMediator _mediator; + private readonly IModelMapper _modelMapper; - public ApprenticeshipStatisticsController(IMediator mediator) + + public ApprenticeshipStatisticsController(IMediator mediator, IModelMapper modelMapper) { _mediator = mediator; + _modelMapper = modelMapper; } @@ -29,6 +34,11 @@ public async Task GetStatistics(int lastNumberOfDays) { return NotFound(); } + + var response = _modelMapper.Map(result); + + return Ok(response); + } } } From 62f587f08dd89668ddaf84d5a5ed80c8288e253c Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Fri, 1 Apr 2022 15:44:05 +0100 Subject: [PATCH 06/19] PV2-2849 more GetApprenticeshipStatisticsQuery code --- .../GetApprenticeshipStatisticsQueryHandler.cs | 9 ++++++++- .../GetApprenticeshipStatisticsQueryValidator.cs | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs index 05e92fd46c..ea4ccce77e 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs @@ -1,10 +1,17 @@ using System; using System.Collections.Generic; using System.Text; +using System.Threading; +using System.Threading.Tasks; +using MediatR; namespace SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics { - public class GetApprenticeshipStatisticsQueryHandler + public class GetApprenticeshipStatisticsQueryHandler : IRequestHandler { + public Task Handle(GetApprenticeshipStatisticsQuery request, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } } } diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryValidator.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryValidator.cs index 85dc4e0ce4..ede77fd73d 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryValidator.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryValidator.cs @@ -7,5 +7,9 @@ namespace SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics { public class GetApprenticeshipStatisticsQueryValidator : AbstractValidator { + public GetApprenticeshipStatisticsQueryValidator() + { + RuleFor(x => x.LastNumberOfDays).GreaterThan(0); + } } } From 118c1f31b98c8a9b9054f785ca839ee82bbaa310 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Mon, 4 Apr 2022 12:57:55 +0100 Subject: [PATCH 07/19] PV2-2849 extended existing ApprenticeshipStatusSummaryService --- .../IApprenticeshipStatusSummaryService.cs | 2 ++ .../ApprenticeshipStatusSummaryService.cs | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Domain/Interfaces/IApprenticeshipStatusSummaryService.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Domain/Interfaces/IApprenticeshipStatusSummaryService.cs index 9d15545c1f..b9bb11659c 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Domain/Interfaces/IApprenticeshipStatusSummaryService.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Domain/Interfaces/IApprenticeshipStatusSummaryService.cs @@ -1,11 +1,13 @@ using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatusSummary; using System.Threading; using System.Threading.Tasks; +using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; namespace SFA.DAS.CommitmentsV2.Domain.Interfaces { public interface IApprenticeshipStatusSummaryService { Task GetApprenticeshipStatusSummary(long employerAccountId, CancellationToken cancellationToken); + Task GetApprenticeshipStatisticsFor(int lastNumberOfDays); } } diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs index 818e33cf08..251a716bf6 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; using SFA.DAS.CommitmentsV2.Models; namespace SFA.DAS.CommitmentsV2.Services @@ -58,6 +59,40 @@ public async Task GetApprenticeshipS }; } + + public async Task GetApprenticeshipStatisticsFor(int lastNumberOfDays) + { + var fromDate = DateTime.UtcNow.AddDays(-30).Date; + + var commitmentsApprovedTask = _dbContext.Value + .Apprenticeships + .Include(x => x.Cohort) + .CountAsync(x => + x.Cohort.EmployerAndProviderApprovedOn > fromDate && + (x.Cohort.Approvals == (Party) 3 || x.Cohort.Approvals == (Party) 7)); + + var commitmentsStoppedTask = _dbContext.Value + .Apprenticeships + .CountAsync(x => + x.StopDate > fromDate && + x.PaymentStatus == PaymentStatus.Withdrawn); + + var commitmentsPausedTask = _dbContext.Value + .Apprenticeships + .CountAsync(x => + x.IsApproved && + x.PauseDate > fromDate && + x.PaymentStatus == PaymentStatus.Paused); + + await Task.WhenAll(commitmentsApprovedTask, commitmentsStoppedTask, commitmentsPausedTask); + + return new GetApprenticeshipStatisticsQueryResult + { + ApprovedApprenticeshipCount = commitmentsApprovedTask.Result, + StoppedApprenticeshipCount = commitmentsStoppedTask.Result, + PausedApprenticeshipCount = commitmentsPausedTask.Result + }; + } } public class ApprenticeshipSummary From 78dd62b1be926b5434888cf2aa7b1080c4371b26 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Mon, 4 Apr 2022 13:31:23 +0100 Subject: [PATCH 08/19] PV2-2849 GetApprenticeshipStatisticsQueryHandler implementation --- .../GetApprenticeshipStatisticsQueryHandler.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs index ea4ccce77e..c598c21ba5 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Application/Queries/GetApprenticeshipStatistics/GetApprenticeshipStatisticsQueryHandler.cs @@ -4,14 +4,22 @@ using System.Threading; using System.Threading.Tasks; using MediatR; +using SFA.DAS.CommitmentsV2.Domain.Interfaces; namespace SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics { public class GetApprenticeshipStatisticsQueryHandler : IRequestHandler { - public Task Handle(GetApprenticeshipStatisticsQuery request, CancellationToken cancellationToken) + private readonly IApprenticeshipStatusSummaryService _apprenticeshipStatusSummaryService; + + public GetApprenticeshipStatisticsQueryHandler(IApprenticeshipStatusSummaryService apprenticeshipStatusSummaryService) + { + _apprenticeshipStatusSummaryService = apprenticeshipStatusSummaryService; + } + + public async Task Handle(GetApprenticeshipStatisticsQuery request, CancellationToken cancellationToken) { - throw new NotImplementedException(); + return await _apprenticeshipStatusSummaryService.GetApprenticeshipStatisticsFor(request.LastNumberOfDays); } } } From bbb573e866bac028735ee135093aa573f6262b78 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Mon, 4 Apr 2022 13:40:51 +0100 Subject: [PATCH 09/19] PV2-2849 Mapper implementation --- ...tApprenticeshipStatisticsResponseMapper.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapper.cs diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapper.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapper.cs new file mode 100644 index 0000000000..1bb8bf6ffe --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapper.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using SFA.DAS.CommitmentsV2.Api.Types.Responses; +using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; +using SFA.DAS.CommitmentsV2.Shared.Interfaces; + +namespace SFA.DAS.CommitmentsV2.Mapping.ResponseMappers +{ + public class GetApprenticeshipStatisticsResponseMapper : IMapper + { + public Task Map(GetApprenticeshipStatisticsQueryResult source) + { + return Task.FromResult(new GetApprenticeshipStatisticsResponse + { + PausedApprenticeshipCount = source.PausedApprenticeshipCount, + StoppedApprenticeshipCount = source.StoppedApprenticeshipCount, + ApprovedApprenticeshipCount = source.ApprovedApprenticeshipCount + }); + } + } +} From 66713c3d5d700fd9863a0914034ded2ba970399c Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Mon, 4 Apr 2022 13:42:05 +0100 Subject: [PATCH 10/19] PV2-2849 controller empty line removed --- .../Controllers/ApprenticeshipStatisticsController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs index a1f8ea055a..012b4e94f7 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs @@ -38,7 +38,6 @@ public async Task GetStatistics(int lastNumberOfDays) var response = _modelMapper.Map(result); return Ok(response); - } } } From 99a65ecff4474254f33b99193725afef5f1fb915 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Tue, 5 Apr 2022 14:05:07 +0100 Subject: [PATCH 11/19] PV2-2849 renamed response properties --- .../Responses/GetApprenticeshipStatisticsResponse.cs | 6 +++--- .../GetApprenticeshipStatisticsResponseMapper.cs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.Types/Responses/GetApprenticeshipStatisticsResponse.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.Types/Responses/GetApprenticeshipStatisticsResponse.cs index 3a19863dc5..90863987b1 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.Types/Responses/GetApprenticeshipStatisticsResponse.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.Types/Responses/GetApprenticeshipStatisticsResponse.cs @@ -6,8 +6,8 @@ namespace SFA.DAS.CommitmentsV2.Api.Types.Responses { public class GetApprenticeshipStatisticsResponse { - public long ApprovedApprenticeshipCount { get; set; } - public long PausedApprenticeshipCount { get; set; } - public long StoppedApprenticeshipCount { get; set; } + public long Approved { get; set; } + public long Paused { get; set; } + public long Stopped { get; set; } } } diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapper.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapper.cs index 1bb8bf6ffe..f7f10c5def 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapper.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapper.cs @@ -14,9 +14,9 @@ public Task Map(GetApprenticeshipStatistics { return Task.FromResult(new GetApprenticeshipStatisticsResponse { - PausedApprenticeshipCount = source.PausedApprenticeshipCount, - StoppedApprenticeshipCount = source.StoppedApprenticeshipCount, - ApprovedApprenticeshipCount = source.ApprovedApprenticeshipCount + Paused = source.PausedApprenticeshipCount, + Stopped = source.StoppedApprenticeshipCount, + Approved = source.ApprovedApprenticeshipCount }); } } From c47a7b2a18cf384d2bdcf4e14bb66c0919a95820 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Tue, 5 Apr 2022 14:06:14 +0100 Subject: [PATCH 12/19] PV2-2849 correcting GetApprenticeshipStatisticsFor method --- .../Services/ApprenticeshipStatusSummaryService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs index 251a716bf6..9a743a9c49 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs @@ -62,7 +62,7 @@ public async Task GetApprenticeshipS public async Task GetApprenticeshipStatisticsFor(int lastNumberOfDays) { - var fromDate = DateTime.UtcNow.AddDays(-30).Date; + var fromDate = DateTime.UtcNow.AddDays(Math.Abs(lastNumberOfDays) * -1).Date; var commitmentsApprovedTask = _dbContext.Value .Apprenticeships From 47ab1d0a8225a427ee4bd7ecd910840fddf07743 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Tue, 5 Apr 2022 16:00:55 +0100 Subject: [PATCH 13/19] PV2-2849 controller final implementation + unit tests --- ...ApprenticeshipStatisticsControllerTests.cs | 97 +++++++++++++++++++ .../ApprenticeshipStatisticsController.cs | 10 +- 2 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.UnitTests/Controllers/ApprenticeshipStatisticsControllerTests.cs diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.UnitTests/Controllers/ApprenticeshipStatisticsControllerTests.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.UnitTests/Controllers/ApprenticeshipStatisticsControllerTests.cs new file mode 100644 index 0000000000..6237e91a76 --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.UnitTests/Controllers/ApprenticeshipStatisticsControllerTests.cs @@ -0,0 +1,97 @@ +using FluentAssertions; +using MediatR; +using Microsoft.AspNetCore.Mvc; +using Moq; +using NUnit.Framework; +using SFA.DAS.CommitmentsV2.Api.Controllers; +using SFA.DAS.CommitmentsV2.Api.Types.Responses; +using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; +using SFA.DAS.CommitmentsV2.Shared.Interfaces; +using System.Threading; +using System.Threading.Tasks; + +namespace SFA.DAS.CommitmentsV2.Api.UnitTests.Controllers +{ + [TestFixture] + public class ApprenticeshipStatisticsControllerTests + { + private int _lastNumberOfDays = 30; + private Mock _mediatorMock; + private Mock _modelMapperMock; + private Mock _getApprenticeshipStatisticsQueryResult; + private Mock _getApprenticeshipStatisticsResponse; + private ApprenticeshipStatisticsController _sut; + + [SetUp] + public void SetUp() + { + _mediatorMock = new Mock(); + _modelMapperMock = new Mock(); + _getApprenticeshipStatisticsQueryResult = new Mock(); + _getApprenticeshipStatisticsResponse = new Mock(); + + _sut = new ApprenticeshipStatisticsController(_mediatorMock.Object, _modelMapperMock.Object); + + _mediatorMock + .Setup(x => x.Send(It.Is(x => x.LastNumberOfDays == _lastNumberOfDays), + CancellationToken.None)) + .ReturnsAsync(_getApprenticeshipStatisticsQueryResult.Object); + + _modelMapperMock + .Setup(x => x.Map(_getApprenticeshipStatisticsQueryResult.Object)) + .ReturnsAsync(_getApprenticeshipStatisticsResponse.Object); + } + + [Test] + public async Task WhenCallingGetStatistics_ThenSendsMediatorQueryCorrectly() + { + //Act + await _sut.GetStatistics(_lastNumberOfDays); + + //Assert + _mediatorMock.Verify(x => x.Send(It.Is(x => x.LastNumberOfDays == _lastNumberOfDays), default), Times.Once); + } + + [Test] + public async Task WhenCallingGetStatistics_AndQueryReturnsNull_ThenReturnsNotFound() + { + //Arrange + _mediatorMock + .Setup(x => x.Send( + It.Is(x => x.LastNumberOfDays == _lastNumberOfDays), + CancellationToken.None)) + .Returns(Task.FromResult(null)); + + //Act + var result = await _sut.GetStatistics(_lastNumberOfDays); + + //Assert + Assert.True(result is NotFoundResult); + } + + [Test] + public async Task WhenCallingGetStatistics_ThenMapsResultToResponseDto() + { + //Act + var result = await _sut.GetStatistics(_lastNumberOfDays); + + //Assert + _modelMapperMock.Verify(x => x.Map(_getApprenticeshipStatisticsQueryResult.Object)); + } + + [Test] + public async Task WhenCallingGetStatistics_ThenGeneratesOkResponse() + { + //Act + var result = await _sut.GetStatistics(_lastNumberOfDays) as OkObjectResult; + var resultResponse = result?.Value as GetApprenticeshipStatisticsResponse; + + //Assert + result.Should().NotBeNull(); + resultResponse.Should().NotBeNull(); + resultResponse.Paused.Should().Be(_getApprenticeshipStatisticsQueryResult.Object.PausedApprenticeshipCount); + resultResponse.Stopped.Should().Be(_getApprenticeshipStatisticsQueryResult.Object.StoppedApprenticeshipCount); + resultResponse.Approved.Should().Be(_getApprenticeshipStatisticsQueryResult.Object.ApprovedApprenticeshipCount); + } + } +} \ No newline at end of file diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs index 012b4e94f7..4cdc32ad3b 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api/Controllers/ApprenticeshipStatisticsController.cs @@ -1,10 +1,10 @@ -using System.Threading.Tasks; -using MediatR; +using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SFA.DAS.CommitmentsV2.Api.Types.Responses; using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; using SFA.DAS.CommitmentsV2.Shared.Interfaces; +using System.Threading.Tasks; namespace SFA.DAS.CommitmentsV2.Api.Controllers { @@ -16,14 +16,12 @@ public class ApprenticeshipStatisticsController : ControllerBase private readonly IMediator _mediator; private readonly IModelMapper _modelMapper; - public ApprenticeshipStatisticsController(IMediator mediator, IModelMapper modelMapper) { _mediator = mediator; _modelMapper = modelMapper; } - [HttpGet] [Route("/stats")] public async Task GetStatistics(int lastNumberOfDays) @@ -35,9 +33,9 @@ public async Task GetStatistics(int lastNumberOfDays) return NotFound(); } - var response = _modelMapper.Map(result); + var response = await _modelMapper.Map(result); return Ok(response); } } -} +} \ No newline at end of file From c3a986e94975a55bf71f6a4e591f45bb4f3d214e Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Tue, 5 Apr 2022 16:12:13 +0100 Subject: [PATCH 14/19] PV2-2849 GetApprenticeshipStatisticsQueryValidator unit tests --- ...tApprenticeshipStatisticsValidatorTests.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Application/Queries/GetApprenticeshipStatisticsTests/GetApprenticeshipStatisticsValidatorTests.cs diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Application/Queries/GetApprenticeshipStatisticsTests/GetApprenticeshipStatisticsValidatorTests.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Application/Queries/GetApprenticeshipStatisticsTests/GetApprenticeshipStatisticsValidatorTests.cs new file mode 100644 index 0000000000..58856f4ba8 --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Application/Queries/GetApprenticeshipStatisticsTests/GetApprenticeshipStatisticsValidatorTests.cs @@ -0,0 +1,26 @@ +using FluentAssertions; +using NUnit.Framework; +using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; + +namespace SFA.DAS.CommitmentsV2.UnitTests.Application.Queries.GetApprenticeshipStatisticsTests +{ + [TestFixture] + public class GetApprenticeshipStatisticsValidatorTests + { + [TestCase(-10, false)] + [TestCase(0, false)] + [TestCase(10, true)] + public void WhenCallingValidate_ThenCorrectlyValidatesLastNumberOfDays(int lastNumberOfDays, + bool expectedValid) + { + //Arrange + var validator = new GetApprenticeshipStatisticsQueryValidator(); + + //Act + var result = validator.Validate(new GetApprenticeshipStatisticsQuery { LastNumberOfDays = lastNumberOfDays }); + + //Assert + result.IsValid.Should().Be(expectedValid); + } + } +} \ No newline at end of file From 56dc4802b4af8511fe76a5d8e7960594252fcf9e Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Tue, 5 Apr 2022 16:35:43 +0100 Subject: [PATCH 15/19] PV2-2849 GetApprenticeshipStatisticsHandler unit tests --- ...GetApprenticeshipStatisticsHandlerTests.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Application/Queries/GetApprenticeshipStatisticsTests/GetApprenticeshipStatisticsHandlerTests.cs diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Application/Queries/GetApprenticeshipStatisticsTests/GetApprenticeshipStatisticsHandlerTests.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Application/Queries/GetApprenticeshipStatisticsTests/GetApprenticeshipStatisticsHandlerTests.cs new file mode 100644 index 0000000000..9d47dd3e93 --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Application/Queries/GetApprenticeshipStatisticsTests/GetApprenticeshipStatisticsHandlerTests.cs @@ -0,0 +1,44 @@ +using System.Threading.Tasks; +using Moq; +using NUnit.Framework; +using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; +using SFA.DAS.CommitmentsV2.Domain.Interfaces; + +namespace SFA.DAS.CommitmentsV2.UnitTests.Application.Queries.GetApprenticeshipStatisticsTests +{ + [TestFixture] + public class GetApprenticeshipStatisticsHandlerTests + { + private GetApprenticeshipStatisticsQuery _query; + private GetApprenticeshipStatisticsQueryResult _result; + private Mock _apprenticeshipStatusSummaryServiceMock; + private GetApprenticeshipStatisticsQueryHandler _sut; + + [SetUp] + public void SetUp() + { + _query = new GetApprenticeshipStatisticsQuery(); + _result = new GetApprenticeshipStatisticsQueryResult(); + + _apprenticeshipStatusSummaryServiceMock = new Mock(); + _apprenticeshipStatusSummaryServiceMock + .Setup(x => x.GetApprenticeshipStatisticsFor(_query.LastNumberOfDays)) + .ReturnsAsync(_result); + + _sut = new GetApprenticeshipStatisticsQueryHandler(_apprenticeshipStatusSummaryServiceMock.Object); + } + + [Test] + public async Task WhenHandling_ThenCallsApprenticeshipStatusSummaryServiceWithCorrectValues() + { + //Arrange + _query.LastNumberOfDays = 30; + + //Act + await _sut.Handle(_query, default); + + //Assert + _apprenticeshipStatusSummaryServiceMock.Verify(x => x.GetApprenticeshipStatisticsFor(_query.LastNumberOfDays), Times.Once); + } + } +} \ No newline at end of file From fd15490f8b271dfc773a1bc82f6683dd04a0d3ff Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Wed, 6 Apr 2022 10:38:10 +0100 Subject: [PATCH 16/19] PV2-2849 ApprenticeshipStatisticsController unit tests amended --- ...ApprenticeshipStatisticsControllerTests.cs | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.UnitTests/Controllers/ApprenticeshipStatisticsControllerTests.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.UnitTests/Controllers/ApprenticeshipStatisticsControllerTests.cs index 6237e91a76..c6206e9d9e 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.UnitTests/Controllers/ApprenticeshipStatisticsControllerTests.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.Api.UnitTests/Controllers/ApprenticeshipStatisticsControllerTests.cs @@ -9,37 +9,41 @@ using SFA.DAS.CommitmentsV2.Shared.Interfaces; using System.Threading; using System.Threading.Tasks; +using AutoFixture; namespace SFA.DAS.CommitmentsV2.Api.UnitTests.Controllers { [TestFixture] public class ApprenticeshipStatisticsControllerTests { - private int _lastNumberOfDays = 30; + private Fixture _fixture; + private int _lastNumberOfDays; private Mock _mediatorMock; private Mock _modelMapperMock; - private Mock _getApprenticeshipStatisticsQueryResult; - private Mock _getApprenticeshipStatisticsResponse; + private GetApprenticeshipStatisticsQueryResult _getApprenticeshipStatisticsQueryResult; + private GetApprenticeshipStatisticsResponse _getApprenticeshipStatisticsResponse; private ApprenticeshipStatisticsController _sut; [SetUp] public void SetUp() { + _fixture = new Fixture(); + _lastNumberOfDays = _fixture.Create(); _mediatorMock = new Mock(); _modelMapperMock = new Mock(); - _getApprenticeshipStatisticsQueryResult = new Mock(); - _getApprenticeshipStatisticsResponse = new Mock(); + _getApprenticeshipStatisticsQueryResult = _fixture.Freeze(); + _getApprenticeshipStatisticsResponse = _fixture.Freeze(); _sut = new ApprenticeshipStatisticsController(_mediatorMock.Object, _modelMapperMock.Object); _mediatorMock .Setup(x => x.Send(It.Is(x => x.LastNumberOfDays == _lastNumberOfDays), CancellationToken.None)) - .ReturnsAsync(_getApprenticeshipStatisticsQueryResult.Object); + .ReturnsAsync(_getApprenticeshipStatisticsQueryResult); _modelMapperMock - .Setup(x => x.Map(_getApprenticeshipStatisticsQueryResult.Object)) - .ReturnsAsync(_getApprenticeshipStatisticsResponse.Object); + .Setup(x => x.Map(_getApprenticeshipStatisticsQueryResult)) + .ReturnsAsync(_getApprenticeshipStatisticsResponse); } [Test] @@ -76,7 +80,7 @@ public async Task WhenCallingGetStatistics_ThenMapsResultToResponseDto() var result = await _sut.GetStatistics(_lastNumberOfDays); //Assert - _modelMapperMock.Verify(x => x.Map(_getApprenticeshipStatisticsQueryResult.Object)); + _modelMapperMock.Verify(x => x.Map(_getApprenticeshipStatisticsQueryResult)); } [Test] @@ -89,9 +93,9 @@ public async Task WhenCallingGetStatistics_ThenGeneratesOkResponse() //Assert result.Should().NotBeNull(); resultResponse.Should().NotBeNull(); - resultResponse.Paused.Should().Be(_getApprenticeshipStatisticsQueryResult.Object.PausedApprenticeshipCount); - resultResponse.Stopped.Should().Be(_getApprenticeshipStatisticsQueryResult.Object.StoppedApprenticeshipCount); - resultResponse.Approved.Should().Be(_getApprenticeshipStatisticsQueryResult.Object.ApprovedApprenticeshipCount); + resultResponse.Paused.Should().Be(_getApprenticeshipStatisticsResponse.Paused); + resultResponse.Stopped.Should().Be(_getApprenticeshipStatisticsResponse.Stopped); + resultResponse.Approved.Should().Be(_getApprenticeshipStatisticsResponse.Approved); } } } \ No newline at end of file From 4581629ffed53dacdf2413f43284655d1a7d5aab Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Wed, 6 Apr 2022 10:38:33 +0100 Subject: [PATCH 17/19] PV2-2849 GetApprenticeshipStatisticsResponseMapper unit tests --- ...enticeshipStatisticsResponseMapperTests.cs | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapperTests.cs diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapperTests.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapperTests.cs new file mode 100644 index 0000000000..475656402e --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Mapping/ResponseMappers/GetApprenticeshipStatisticsResponseMapperTests.cs @@ -0,0 +1,37 @@ +using AutoFixture; +using FluentAssertions; +using NUnit.Framework; +using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; +using SFA.DAS.CommitmentsV2.Mapping.ResponseMappers; +using System.Threading.Tasks; + +namespace SFA.DAS.CommitmentsV2.UnitTests.Mapping.ResponseMappers +{ + [TestFixture] + public class GetApprenticeshipStatisticsResponseMapperTests + { + private Fixture _fixture; + private GetApprenticeshipStatisticsQueryResult _queryResult; + private GetApprenticeshipStatisticsResponseMapper _sut; + + [SetUp] + public void SetUp() + { + _fixture = new Fixture(); + _queryResult = _fixture.Create(); + _sut = new GetApprenticeshipStatisticsResponseMapper(); + } + + [Test] + public async Task WhenMapIsCalled_ThenResponseIsMappedCorrectly() + { + //Act + var response = await _sut.Map(_queryResult); + + //Assert + response.Paused.Should().Be(_queryResult.PausedApprenticeshipCount); + response.Approved.Should().Be(_queryResult.ApprovedApprenticeshipCount); + response.Stopped.Should().Be(_queryResult.StoppedApprenticeshipCount); + } + } +} \ No newline at end of file From b86507ce86930c2626d30cf76339f467166a2a7e Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Wed, 6 Apr 2022 14:00:44 +0100 Subject: [PATCH 18/19] PV2-2849 WhenGettingApprenticeshipStatistics additional unit tests --- ...ApprenticeshipStatusSummaryServiceTests.cs | 14 +- .../WhenGettingApprenticeshipStatistics.cs | 124 ++++++++++++++++++ 2 files changed, 131 insertions(+), 7 deletions(-) rename src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/{ => ApprenticeshipStatusSummaryTests}/ApprenticeshipStatusSummaryServiceTests.cs (98%) create mode 100644 src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryTests/WhenGettingApprenticeshipStatistics.cs diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryServiceTests.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryTests/ApprenticeshipStatusSummaryServiceTests.cs similarity index 98% rename from src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryServiceTests.cs rename to src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryTests/ApprenticeshipStatusSummaryServiceTests.cs index 62d01ac464..883098393c 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryServiceTests.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryTests/ApprenticeshipStatusSummaryServiceTests.cs @@ -1,4 +1,9 @@ -using AutoFixture; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using AutoFixture; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Logging; @@ -10,13 +15,8 @@ using SFA.DAS.CommitmentsV2.Services; using SFA.DAS.CommitmentsV2.Types; using SFA.DAS.Testing.Builders; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -namespace SFA.DAS.CommitmentsV2.UnitTests.Services +namespace SFA.DAS.CommitmentsV2.UnitTests.Services.ApprenticeshipStatusSummaryTests { [TestFixture] [Parallelizable(ParallelScope.None)] diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryTests/WhenGettingApprenticeshipStatistics.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryTests/WhenGettingApprenticeshipStatistics.cs new file mode 100644 index 0000000000..ddd42b1797 --- /dev/null +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2.UnitTests/Services/ApprenticeshipStatusSummaryTests/WhenGettingApprenticeshipStatistics.cs @@ -0,0 +1,124 @@ +using AutoFixture; +using FluentAssertions; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.Logging; +using Moq; +using NUnit.Framework; +using SFA.DAS.CommitmentsV2.Data; +using SFA.DAS.CommitmentsV2.Models; +using SFA.DAS.CommitmentsV2.Services; +using SFA.DAS.CommitmentsV2.Types; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SFA.DAS.CommitmentsV2.UnitTests.Services.ApprenticeshipStatusSummaryTests +{ + [TestFixture] + public class WhenGettingApprenticeshipStatistics + { + private Fixture _fixture; + private Random _random; + private int _lastNumberOfDays; + + private Mock> _loggerMock; + private ProviderCommitmentsDbContext _context; + private Lazy _providerCommitmentsDbContextMock; + + private ApprenticeshipStatusSummaryService _sut; + + [SetUp] + public void SetUp() + { + _fixture = new Fixture(); + _fixture.Behaviors.Add(new OmitOnRecursionBehavior()); + _random = new Random(); + _lastNumberOfDays = _fixture.Create(); + + _loggerMock = new Mock>(); + _context = new ProviderCommitmentsDbContext(new DbContextOptionsBuilder() + .UseInMemoryDatabase("TestDb", new InMemoryDatabaseRoot()) + .Options); + _providerCommitmentsDbContextMock = new Lazy(_context); + + _sut = new ApprenticeshipStatusSummaryService(_providerCommitmentsDbContextMock, _loggerMock.Object); + } + + [Test] + public async Task ThenCorrectlyReturnsApprovedCount() + { + //Arrange + var expectedApprovedApprenticeships = await AddApprenticeshipsToDb(_lastNumberOfDays, true, default, 10); + var unexpectedApprenticeships = await AddApprenticeshipsToDb(_lastNumberOfDays, false, default, 7); + + //Act + var result = await _sut.GetApprenticeshipStatisticsFor(_lastNumberOfDays); + + //Assert + result.ApprovedApprenticeshipCount.Should().Be(expectedApprovedApprenticeships.Count); + } + + [Test] + public async Task ThenCorrectlyReturnsPausedCount() + { + //Arrange + var expectedPausedApprenticeships = await AddApprenticeshipsToDb(_lastNumberOfDays, true, PaymentStatus.Paused, 12); + var unexpectedApprenticeships = await AddApprenticeshipsToDb(_lastNumberOfDays, false, PaymentStatus.Paused, 8); + + //Act + var result = await _sut.GetApprenticeshipStatisticsFor(_lastNumberOfDays); + + //Assert + result.PausedApprenticeshipCount.Should().Be(expectedPausedApprenticeships.Count); + } + + [Test] + public async Task ThenCorrectlyReturnsStoppedCount() + { + //Arrange + var expectedStoppedApprenticeships = await AddApprenticeshipsToDb(_lastNumberOfDays, true, PaymentStatus.Withdrawn, 6); + var unexpectedApprenticeships = await AddApprenticeshipsToDb(_lastNumberOfDays, false, PaymentStatus.Withdrawn, 4); + + //Act + var result = await _sut.GetApprenticeshipStatisticsFor(_lastNumberOfDays); + + //Assert + result.StoppedApprenticeshipCount.Should().Be(expectedStoppedApprenticeships.Count); + } + + private async Task> AddApprenticeshipsToDb(int lastNumberOfDays, bool isExpectedInCount, PaymentStatus paymentStatus, int amountToCreate) + { + var fromDate = DateTime.UtcNow.AddDays(Math.Abs(lastNumberOfDays) * -1).Date; + var testFromDate = isExpectedInCount ? fromDate.AddDays(1) : fromDate.AddDays(-1); + + var apprenticeships = new List(); + + for (int i = 0; i < amountToCreate; i++) + { + var randomNum = _random.Next(2); + var apprenticeship = new Apprenticeship(); + + var cohort = new Cohort(); + cohort.EmployerAndProviderApprovedOn = testFromDate; + cohort.Approvals = randomNum == 1 ? (Party)3 : (Party)7; + + apprenticeship.Cohort = cohort; + apprenticeship.CommitmentId = cohort.Id; + apprenticeship.StopDate = testFromDate; + apprenticeship.PauseDate = testFromDate; + apprenticeship.PaymentStatus = paymentStatus; + apprenticeship.IsApproved = true; + + apprenticeships.Add(apprenticeship); + } + + _context.Apprenticeships.AddRange(apprenticeships); + + await _context.SaveChangesAsync(); + + return apprenticeships.ToList(); + } + } +} \ No newline at end of file From 35ac13d92f655a9bb2c8f65566952ca886b69478 Mon Sep 17 00:00:00 2001 From: Akshay Chugh Date: Thu, 7 Apr 2022 10:44:09 +0100 Subject: [PATCH 19/19] PV2-2849 ApprenticeshipStatusSummaryService now awaiting each query --- .../ApprenticeshipStatusSummaryService.cs | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs index 9a743a9c49..4a4688c368 100644 --- a/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs +++ b/src/CommitmentsV2/SFA.DAS.CommitmentsV2/Services/ApprenticeshipStatusSummaryService.cs @@ -1,16 +1,15 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; +using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatusSummary; using SFA.DAS.CommitmentsV2.Data; using SFA.DAS.CommitmentsV2.Domain.Interfaces; +using SFA.DAS.CommitmentsV2.Models; using SFA.DAS.CommitmentsV2.Types; using System; -using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using SFA.DAS.CommitmentsV2.Application.Queries.GetApprenticeshipStatistics; -using SFA.DAS.CommitmentsV2.Models; namespace SFA.DAS.CommitmentsV2.Services { @@ -64,33 +63,31 @@ public async Task GetApprenticeshipStati { var fromDate = DateTime.UtcNow.AddDays(Math.Abs(lastNumberOfDays) * -1).Date; - var commitmentsApprovedTask = _dbContext.Value + var commitmentsApprovedCount = await _dbContext.Value .Apprenticeships .Include(x => x.Cohort) .CountAsync(x => x.Cohort.EmployerAndProviderApprovedOn > fromDate && - (x.Cohort.Approvals == (Party) 3 || x.Cohort.Approvals == (Party) 7)); + (x.Cohort.Approvals == (Party)3 || x.Cohort.Approvals == (Party)7)); - var commitmentsStoppedTask = _dbContext.Value + var commitmentsStoppedCount = await _dbContext.Value .Apprenticeships .CountAsync(x => x.StopDate > fromDate && x.PaymentStatus == PaymentStatus.Withdrawn); - var commitmentsPausedTask = _dbContext.Value + var commitmentsPausedCount = await _dbContext.Value .Apprenticeships .CountAsync(x => x.IsApproved && x.PauseDate > fromDate && x.PaymentStatus == PaymentStatus.Paused); - await Task.WhenAll(commitmentsApprovedTask, commitmentsStoppedTask, commitmentsPausedTask); - return new GetApprenticeshipStatisticsQueryResult { - ApprovedApprenticeshipCount = commitmentsApprovedTask.Result, - StoppedApprenticeshipCount = commitmentsStoppedTask.Result, - PausedApprenticeshipCount = commitmentsPausedTask.Result + ApprovedApprenticeshipCount = commitmentsApprovedCount, + StoppedApprenticeshipCount = commitmentsStoppedCount, + PausedApprenticeshipCount = commitmentsPausedCount }; } } @@ -105,4 +102,4 @@ public class ApprenticeshipSummary public int Count { get; set; } } -} +} \ No newline at end of file