Skip to content

Commit

Permalink
Merge pull request #570 from SkillsFundingAgency/APPMAN-1469_skip-sel…
Browse files Browse the repository at this point in the history
…ect-funds

skip select funds when only a single option
  • Loading branch information
Najamuddin-Muhammad authored Feb 18, 2025
2 parents c786614 + fad322e commit 28083e2
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using SFA.DAS.EmployerCommitmentsV2.Interfaces;
using SFA.DAS.EmployerCommitmentsV2.Web.Controllers;
using SFA.DAS.EmployerCommitmentsV2.Web.Models.Cohort;
using SFA.DAS.EmployerUrlHelper;
using SFA.DAS.Testing.AutoFixture;

namespace SFA.DAS.EmployerCommitmentsV2.Web.UnitTests.Controllers.CohortControllerTests;
Expand Down Expand Up @@ -107,7 +108,7 @@ public async Task AndTransferSenderIdIsSetThenRedirectsToSelectProvider(
}

[Test, MoqAutoData]
public async Task AndNoFundsAvailableThenRedirectsToSelectProvider(
public async Task AndIsLevyWithOnlyLevyFundsAvailableThenRedirectsToSelectProvider(
AddApprenticeshipCacheModel cacheModel,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
SelectFundingViewModel viewModel,
Expand All @@ -116,10 +117,10 @@ public async Task AndNoFundsAvailableThenRedirectsToSelectProvider(
{
cacheModel.EncodedPledgeApplicationId = null;
cacheModel.TransferSenderId = null;
viewModel.IsLevyAccount = false;
viewModel.IsLevyAccount = true;
viewModel.HasDirectTransfersAvailable = false;
viewModel.HasUnallocatedReservationsAvailable = false;
viewModel.HasAdditionalReservationFundsAvailable = false;
viewModel.HasLtmTransfersAvailable = false;
// reservation funds will return as available always for a LEVY account.

cacheStorageService
.Setup(x => x.RetrieveFromCache<AddApprenticeshipCacheModel>(cacheModel.ApprenticeshipSessionKey))
Expand All @@ -133,4 +134,46 @@ public async Task AndNoFundsAvailableThenRedirectsToSelectProvider(
result.RouteValues["AccountHashedId"].Should().Be(cacheModel.AccountHashedId);
result.RouteValues["ApprenticeshipSessionKey"].Should().Be(cacheModel.ApprenticeshipSessionKey);
}

[Test, MoqAutoData]
public async Task AndIsNonLevyWithOnlyCreateNewReservationFundsAvailableThenRedirectsToSelectProvider(
AddApprenticeshipCacheModel cacheModel,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
SelectFundingViewModel viewModel,
[Frozen] Mock<ILinkGenerator> linkGenerator,
[Frozen] Mock<IModelMapper> mockMapper,
[Greedy] CohortController controller)
{
// Arrange
cacheModel.EncodedPledgeApplicationId = null;
cacheModel.TransferSenderId = null;
viewModel.IsLevyAccount = false;
viewModel.HasDirectTransfersAvailable = false;
viewModel.HasLtmTransfersAvailable = false;
viewModel.HasUnallocatedReservationsAvailable = false;

cacheStorageService
.Setup(x => x.RetrieveFromCache<AddApprenticeshipCacheModel>(cacheModel.ApprenticeshipSessionKey))
.ReturnsAsync(cacheModel);

mockMapper.Setup(mapper => mapper.Map<SelectFundingViewModel>(cacheModel)).ReturnsAsync(viewModel);

var expectedReservationsPathAndQuery =
$"accounts/{cacheModel.AccountHashedId}/reservations/{cacheModel.AccountLegalEntityHashedId}/select?" +
$"&beforeProviderSelected=true" +
$"&apprenticeshipSessionKey={cacheModel.ApprenticeshipSessionKey}";

var expectedReservationsUrl = $"https://reservations.test.com/{expectedReservationsPathAndQuery}";
linkGenerator.Setup(x => x.ReservationsLink(expectedReservationsPathAndQuery))
.Returns(expectedReservationsUrl)
.Verifiable();

// Act
var result = await controller.SelectFunding(cacheModel.ApprenticeshipSessionKey) as RedirectResult;

// Assert
result.Url.Should().Be(expectedReservationsUrl);
linkGenerator.Verify();
linkGenerator.VerifyNoOtherCalls();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -564,20 +564,24 @@ public async Task<ActionResult> SelectLegalEntity(SelectLegalEntityViewModel sel
public async Task<IActionResult> SelectFunding([FromQuery] Guid apprenticeshipSessionKey)
{
var cacheModel = await GetAddApprenticeshipCacheModelFromCache(apprenticeshipSessionKey);

if (cacheModel.EncodedPledgeApplicationId != null || cacheModel.TransferSenderId != null)
{
return RedirectToAction(RouteNames.CohortSelectProvider, new { cacheModel.AccountHashedId, cacheModel.ApprenticeshipSessionKey });
return RedirectToCohortSelectProvider(cacheModel);
}

var viewModel = await _modelMapper.Map<SelectFundingViewModel>(cacheModel);

if (ShouldRedirectToProvider(viewModel))
{
return RedirectToCohortSelectProvider(cacheModel);
}

if (viewModel.HasDirectTransfersAvailable == false &&
viewModel.HasAdditionalReservationFundsAvailable == false &&
viewModel.HasUnallocatedReservationsAvailable == false)
if (ShouldRedirectToReservations(viewModel))
{
return RedirectToAction(RouteNames.CohortSelectProvider, new { cacheModel.AccountHashedId, cacheModel.ApprenticeshipSessionKey });
return Redirect(GenerateReservationUrl(cacheModel));
}

return View(viewModel);
}

Expand Down Expand Up @@ -761,4 +765,33 @@ private async Task AssignFundingDetailsToModel(DraftApprenticeshipViewModel mode
model.StandardPageUrl = fundingBandData?.StandardPageUrl;
}
}

private IActionResult RedirectToCohortSelectProvider(AddApprenticeshipCacheModel cacheModel)
{
return RedirectToAction(RouteNames.CohortSelectProvider, new
{
cacheModel.AccountHashedId,
cacheModel.ApprenticeshipSessionKey
});
}

private bool ShouldRedirectToProvider(SelectFundingViewModel viewModel)
{
return viewModel.IsLevyAccount && !viewModel.HasDirectTransfersAvailable && !viewModel.HasLtmTransfersAvailable;
}

private bool ShouldRedirectToReservations(SelectFundingViewModel viewModel)
{
return !viewModel.IsLevyAccount &&
!viewModel.HasDirectTransfersAvailable &&
!viewModel.HasLtmTransfersAvailable &&
!viewModel.HasUnallocatedReservationsAvailable;
}

private string GenerateReservationUrl(AddApprenticeshipCacheModel cacheModel)
{
return _linkGenerator.ReservationsLink(
$"accounts/{cacheModel.AccountHashedId}/reservations/{cacheModel.AccountLegalEntityHashedId}/select?" +
$"&beforeProviderSelected=true&apprenticeshipSessionKey={cacheModel.ApprenticeshipSessionKey}");
}
}

0 comments on commit 28083e2

Please sign in to comment.