Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Appman 1292 cache add apprentice journey #539

Merged
merged 38 commits into from
Jan 15, 2025
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
d5f70b1
WIP replacing query string values with cache model
Dec 5, 2024
86603c8
caching up to Assign page
Dec 6, 2024
6269bc1
fixes around Select-Provider
Dec 6, 2024
5177c79
add apprenticeship journey with cache
Dec 9, 2024
fa6e216
approaching journey from reservation
Dec 9, 2024
09cad15
handling approach from LTM
Dec 10, 2024
0d95715
updating and adding unit tests
Dec 10, 2024
f19c842
updating unit tests
Dec 11, 2024
4688196
merge from master
Dec 11, 2024
7fb7fca
fixes from merge
Dec 11, 2024
59c3d75
sonar cloud fixes
Dec 11, 2024
87e9939
updating cacheKey name, fixes for From Reservations journey
Dec 12, 2024
2e8b870
handling when cache not found
Dec 12, 2024
fd8c551
fix for LTM journey
Dec 12, 2024
53c6949
route fix
Dec 12, 2024
c59c74f
making cachekey nullable, correcting route to reservations
Dec 13, 2024
1312921
remove validator
Dec 13, 2024
7a3bbf8
renaming ApprenticeshipSessionKey
Dec 16, 2024
d862f00
[FromQuery] annotations, streamline cacheModel in GETs
Dec 16, 2024
ffde452
agreementNotSigned, backlinks, remove unused requests
Dec 16, 2024
ccf89ad
update Assign routing, trim viewmodels
Dec 17, 2024
726eb33
update SelectProvider Validator
Dec 17, 2024
4ac1c62
update routing around add/apprentice
Dec 18, 2024
11b3931
merging changes around SelectFunding
Jan 6, 2025
61e27b2
more fixes from merge
Jan 6, 2025
f19096b
using cache for SelectFunding
Jan 6, 2025
823c120
updating route naming constants
Jan 6, 2025
8fc419c
removing request objects
Jan 6, 2025
d490a32
fix test
Jan 6, 2025
9933171
slimming down SelectFundingViewModel
Jan 6, 2025
39292c6
sonar fix
Jan 6, 2025
61eb06a
changes from merge
Jan 10, 2025
2ad5e2f
handle empty transfersenderId and encodedpledgeapplicationid
Jan 14, 2025
c101d87
update missing test attribute
Jan 14, 2025
fd885c6
fixing reservation routing on Assign
Jan 14, 2025
4dc244b
only throwing CacheItemNotFoundException for AddApprenticeshipCacheModel
Jan 14, 2025
64151b4
populating StartMonth andStartYear in AddApprenticeshipCacheModel
Jan 15, 2025
67d0bbb
merging changes and making updates for selecting accepted transfercon…
Jan 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using FluentAssertions;
using SFA.DAS.CommitmentsV2.Shared.Interfaces;
using SFA.DAS.EmployerCommitmentsV2.Interfaces;
using SFA.DAS.EmployerCommitmentsV2.Web.Controllers;
using SFA.DAS.EmployerCommitmentsV2.Web.Models.Cohort;
using SFA.DAS.Testing.AutoFixture;
Expand All @@ -10,16 +11,21 @@ public class WhenCallingGetAssign
{
[Test, MoqAutoData]
public async Task Then_Returns_View_With_Correct_Model(
AssignRequest request,
AddApprenticeshipCacheModel cacheModel,
AssignViewModel viewModel,
[Frozen] Mock<IModelMapper> mockMapper,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
[Greedy] CohortController controller)
{
cacheStorageService
.Setup(x => x.RetrieveFromCache<AddApprenticeshipCacheModel>(cacheModel.ApprenticeshipSessionKey))
.ReturnsAsync(cacheModel);

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

var result = await controller.Assign(request) as ViewResult;
var result = await controller.Assign(cacheModel.ApprenticeshipSessionKey) as ViewResult;

result.ViewName.Should().BeNull();
var model = result.Model as AssignViewModel;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using FluentAssertions;
using SFA.DAS.CommitmentsV2.Shared.Interfaces;
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 All @@ -13,26 +13,22 @@ public class WhenCallingGetIndex
public async Task Then_Returns_View_With_Correct_ViewModel(
IndexRequest request,
IndexViewModel viewModel,
string organisationsLink,
string schemesLink,
[Frozen] Mock<IModelMapper> mockMapper,
[Frozen] Mock<ILinkGenerator> mockLinkGenerator,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
[Greedy] CohortController controller)
{
cacheStorageService
.Setup(x => x.SaveToCache(It.IsAny<Guid>(), It.IsAny<AddApprenticeshipCacheModel>(), 1))
.Returns(Task.CompletedTask);

mockMapper
.Setup(mapper => mapper.Map<IndexViewModel>(request))
.Setup(mapper => mapper.Map<IndexViewModel>(It.IsAny<IndexRequest>()))
.ReturnsAsync(viewModel);
mockLinkGenerator
.Setup(generator => generator.AccountsLink($"accounts/{request.AccountHashedId}/agreements"))
.Returns(organisationsLink);
mockLinkGenerator
.Setup(generator => generator.AccountsLink($"accounts/{request.AccountHashedId}/schemes"))
.Returns(schemesLink);

var result = await controller.Index(request) as ViewResult;

result.ViewName.Should().BeNull();
var model = result.Model as IndexViewModel;
model.Should().BeSameAs(viewModel);
model.Should().BeEquivalentTo(viewModel);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using SFA.DAS.CommitmentsV2.Api.Types.Requests;
using SFA.DAS.CommitmentsV2.Api.Types.Responses;
using SFA.DAS.CommitmentsV2.Shared.Interfaces;
using SFA.DAS.EmployerCommitmentsV2.Interfaces;
using SFA.DAS.EmployerCommitmentsV2.Web.Controllers;
using SFA.DAS.EmployerCommitmentsV2.Web.Models.Cohort;
using SFA.DAS.EmployerUrlHelper;
Expand All @@ -16,19 +17,26 @@ public class WhenCallingPostAssign
[Test, MoqAutoData]
public async Task And_Employer_Adding_Apprentices_Then_Redirect_To_Add_Apprentice(
AssignViewModel viewModel,
AddApprenticeshipCacheModel cacheModel,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
[Greedy] CohortController controller)
{
cacheModel.ApprenticeshipSessionKey = viewModel.ApprenticeshipSessionKey.Value;
cacheStorageService
.Setup(x => x.RetrieveFromCache<AddApprenticeshipCacheModel>(cacheModel.ApprenticeshipSessionKey))
.ReturnsAsync(cacheModel);

var expectedRouteValues = new RouteValueDictionary(new
{
viewModel.AccountHashedId,
viewModel.AccountLegalEntityHashedId,
viewModel.ReservationId,
viewModel.StartMonthYear,
viewModel.CourseCode,
viewModel.ProviderId,
viewModel.TransferSenderId,
viewModel.EncodedPledgeApplicationId,
Origin = viewModel.ReservationId.HasValue ? Origin.Reservations : Origin.Apprentices
cacheModel.AccountHashedId,
cacheModel.AccountLegalEntityHashedId,
cacheModel.ReservationId,
cacheModel.StartMonthYear,
cacheModel.CourseCode,
cacheModel.ProviderId,
cacheModel.TransferSenderId,
cacheModel.EncodedPledgeApplicationId,
cacheModel.ApprenticeshipSessionKey
});
viewModel.WhoIsAddingApprentices = WhoIsAddingApprentices.Employer;

Expand All @@ -45,12 +53,21 @@ public async Task And_Provider_Adding_Apprentices_Then_Redirect_To_Finish(
AssignViewModel viewModel,
CreateCohortWithOtherPartyRequest createCohortRequest,
CreateCohortResponse createCohortResponse,
AddApprenticeshipCacheModel cacheModel,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
[Frozen] Mock<IModelMapper> modelMapper,
[Frozen] Mock<ICommitmentsApiClient> apiClient,
[Greedy] CohortController controller)
{
cacheModel.ApprenticeshipSessionKey = viewModel.ApprenticeshipSessionKey.Value;

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

viewModel.WhoIsAddingApprentices = WhoIsAddingApprentices.Provider;
modelMapper.Setup(x => x.Map<CreateCohortWithOtherPartyRequest>(viewModel)).ReturnsAsync(createCohortRequest);
modelMapper.Setup(x => x.Map<CreateCohortWithOtherPartyRequest>(cacheModel)).ReturnsAsync(createCohortRequest);

apiClient.Setup(x => x.CreateCohort(createCohortRequest, It.IsAny<CancellationToken>())).ReturnsAsync(createCohortResponse).Verifiable();
var result = await controller.Assign(viewModel) as RedirectToActionResult;

Expand All @@ -63,8 +80,15 @@ public async Task And_Provider_Adding_Apprentices_Then_Redirect_To_Finish(
[Test, MoqAutoData]
public async Task And_Unknown_Adding_Apprentices_Then_Redirect_To_Error(
AssignViewModel viewModel,
AddApprenticeshipCacheModel cacheModel,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
[Greedy] CohortController controller)
{

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

viewModel.WhoIsAddingApprentices = (WhoIsAddingApprentices)55;

var result = await controller.Assign(viewModel) as RedirectToActionResult;
Expand All @@ -78,8 +102,16 @@ public async Task And_Unknown_Adding_Apprentices_Then_Redirect_To_Error(
public async Task And_Employer_Adding_Apprentices_And_No_Reservation_Then_Redirect_To_Reservation_Selection(
[Frozen] Mock<ILinkGenerator> linkGenerator,
AssignViewModel viewModel,
AddApprenticeshipCacheModel cacheModel,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
[Greedy] CohortController controller)
{
cacheModel.ReservationId = null;

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

const string reservationsUrl = "RESERVATIONS-URL";
linkGenerator.Setup(x => x.ReservationsLink(It.IsAny<string>())).Returns(reservationsUrl);
viewModel.ReservationId = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,60 +10,34 @@ namespace SFA.DAS.EmployerCommitmentsV2.Web.UnitTests.Controllers.CohortControll
public class WhenGetingAddDraftApprenticeship
{
[Test, MoqAutoData]
public async Task ThenReturnsViewWhenNoModelInCache(
ApprenticeRequest request,
public async Task ThenReturnsViewWhenModelIsInCache(
AddApprenticeshipCacheModel cacheModel,
[Frozen] Mock<IModelMapper> mockMapper,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
[Greedy] CohortController controller)
{
var viewModel = new ApprenticeViewModel();

cacheStorageService
.Setup(x => x.RetrieveFromCache<ApprenticeViewModel>(It.IsAny<Guid>()))
.ReturnsAsync((ApprenticeViewModel)null);

mockMapper
.Setup(mapper => mapper.Map<ApprenticeViewModel>(request))
.ReturnsAsync(viewModel);

var result = await controller.AddDraftApprenticeship(request) as ViewResult;

result.Should().NotBeNull();
result.ViewName.Should().Be("Apprentice");
result.Model.Should().BeEquivalentTo(viewModel);
}

[Test, MoqAutoData]
public async Task ThenReturnsViewWhenModelIsInCache(
ApprenticeRequest request,
[Frozen] Mock<IModelMapper> mockMapper,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
[Greedy] CohortController controller)
{
var viewModel = new ApprenticeViewModel();
var cacheItem = new ApprenticeViewModel
{
DeliveryModel = CommitmentsV2.Types.DeliveryModel.Regular,
CourseCode = "CourseCode",
CacheKey = request.CacheKey
};
.Setup(x => x.RetrieveFromCache<AddApprenticeshipCacheModel>(cacheModel.ApprenticeshipSessionKey))
.ReturnsAsync(cacheModel);

cacheStorageService
.Setup(x => x.RetrieveFromCache<ApprenticeViewModel>(cacheItem.CacheKey.Value))
.ReturnsAsync(cacheItem);
.Setup(x => x.SaveToCache(It.IsAny<Guid>(), It.IsAny<AddApprenticeshipCacheModel>(), 1))
.Returns(Task.CompletedTask);

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

var result = await controller.AddDraftApprenticeship(request) as ViewResult;
var result = await controller.AddDraftApprenticeship(cacheModel.ApprenticeshipSessionKey) as ViewResult;

result.Should().NotBeNull();
result.ViewName.Should().Be("Apprentice");

var resultObject = result.Model as ApprenticeViewModel;

resultObject.Should().NotBeNull();
resultObject.DeliveryModel.Should().Be(cacheItem.DeliveryModel);
resultObject.CourseCode.Should().Be(cacheItem.CourseCode);
resultObject.Should().BeEquivalentTo(viewModel);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using FluentAssertions;
using SFA.DAS.CommitmentsV2.Api.Client;
using SFA.DAS.CommitmentsV2.Shared.Interfaces;
using SFA.DAS.EmployerCommitmentsV2.Contracts;
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.Encoding;

namespace SFA.DAS.EmployerCommitmentsV2.Web.UnitTests.Controllers.CohortControllerTests;

internal class WhenGettingApprentice
{
private ApprenticeRequest _apprenticeRequest;
private CohortController _controller;
private Fixture _fixture;
private AddApprenticeshipCacheModel _cacheModel;
private Mock<ICacheStorageService> _cacheStorageService;

[SetUp]
public void SetUp()
{
_fixture = new Fixture();
_apprenticeRequest = _fixture.Create<ApprenticeRequest>();
_cacheModel = _fixture.Create<AddApprenticeshipCacheModel>();
_apprenticeRequest.ApprenticeshipSessionKey = _cacheModel.ApprenticeshipSessionKey;

_cacheStorageService = new Mock<ICacheStorageService>();
_cacheStorageService
.Setup(x => x.RetrieveFromCache<AddApprenticeshipCacheModel>(_cacheModel.ApprenticeshipSessionKey))
.ReturnsAsync(_cacheModel);
_cacheStorageService
.Setup(x => x.SaveToCache(It.IsAny<Guid>(), It.IsAny<AddApprenticeshipCacheModel>(), 1))
.Returns(Task.CompletedTask);

_controller = new CohortController(Mock.Of<ICommitmentsApiClient>(),
Mock.Of<ILogger<CohortController>>(),
Mock.Of<ILinkGenerator>(),
Mock.Of<IModelMapper>(),
Mock.Of<IEncodingService>(),
Mock.Of<IApprovalsApiClient>(),
_cacheStorageService.Object);
}

[Test]
public async Task Apprentice_ShouldUpdateCacheAndRedirectToSelectCourse()
{
// Act
var result = await _controller.Apprentice(_apprenticeRequest);

// Assert
_cacheStorageService.Verify(x => x.RetrieveFromCache<AddApprenticeshipCacheModel>(_apprenticeRequest.ApprenticeshipSessionKey.Value), Times.Once);
_cacheStorageService.Verify(x => x.SaveToCache(_cacheModel.ApprenticeshipSessionKey, It.Is<AddApprenticeshipCacheModel>(m =>
m.ReservationId == _apprenticeRequest.ReservationId &&
m.CourseCode == _apprenticeRequest.CourseCode &&
m.StartMonthYear == _apprenticeRequest.StartMonthYear), 1), Times.Once);

var redirectResult = result.Should().BeOfType<RedirectToActionResult>().Subject;
redirectResult.ActionName.Should().Be(nameof(CohortController.SelectCourse));
redirectResult.RouteValues["AccountHashedId"].Should().Be(_cacheModel.AccountHashedId);
redirectResult.RouteValues["ApprenticeshipSessionKey"].Should().Be(_cacheModel.ApprenticeshipSessionKey);
}

[TearDown]
public void TearDown() => _controller?.Dispose();

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using FluentAssertions;
using SFA.DAS.CommitmentsV2.Api.Client;
using SFA.DAS.CommitmentsV2.Api.Types.Responses;
using SFA.DAS.CommitmentsV2.Shared.Interfaces;
using SFA.DAS.EmployerCommitmentsV2.Interfaces;
using SFA.DAS.EmployerCommitmentsV2.Web.Controllers;
using SFA.DAS.EmployerCommitmentsV2.Web.Models.Cohort;
using SFA.DAS.Testing.AutoFixture;
Expand All @@ -12,17 +14,27 @@ public class WhenGettingConfirmProvider
[Test, MoqAutoData]
public async Task Then_The_View_Is_Returned(
int providerId,
ConfirmProviderRequest confirmProviderRequest,
AddApprenticeshipCacheModel cacheModel,
GetProviderResponse getProviderResponse,
ConfirmProviderViewModel viewModel,
[Frozen] Mock<ICommitmentsApiClient> mockApiClient,
[Frozen] Mock<IModelMapper> mockMapper,
[Frozen] Mock<ICacheStorageService> cacheStorageService,
[Greedy] CohortController controller)
{
confirmProviderRequest.ProviderId = providerId;
cacheStorageService
.Setup(x => x.RetrieveFromCache<AddApprenticeshipCacheModel>(cacheModel.ApprenticeshipSessionKey))
.ReturnsAsync(cacheModel);

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

mockApiClient
.Setup(x => x.GetProvider(providerId, It.IsAny<CancellationToken>()))
.ReturnsAsync(getProviderResponse);

var result = await controller.ConfirmProvider(confirmProviderRequest) as ViewResult;
var result = await controller.ConfirmProvider(cacheModel.ApprenticeshipSessionKey) as ViewResult;

result.ViewName.Should().BeNull();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
using SFA.DAS.CommitmentsV2.Api.Client;
using SFA.DAS.CommitmentsV2.Shared.Interfaces;
using SFA.DAS.EmployerCommitmentsV2.Contracts;
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.Encoding;
using SFA.DAS.EmployerCommitmentsV2.Services.Approvals;
using SFA.DAS.EmployerCommitmentsV2.Interfaces;

namespace SFA.DAS.EmployerCommitmentsV2.Web.UnitTests.Controllers.CohortControllerTests;

Expand All @@ -17,6 +16,7 @@ public class WhenGettingInform
private InformViewModel _viewModel;
private CohortController _controller;
private Mock<IModelMapper> _modelMapper;
private Mock<ICacheStorageService> _cacheStorageService;

[SetUp]
public void Arrange()
Expand All @@ -25,6 +25,11 @@ public void Arrange()
_request = autoFixture.Create<InformRequest>();
_viewModel = autoFixture.Create<InformViewModel>();

_cacheStorageService = new Mock<ICacheStorageService>();
_cacheStorageService
.Setup(x => x.SaveToCache(It.IsAny<Guid>(), It.IsAny<AddApprenticeshipCacheModel>(), 1))
.Returns(Task.CompletedTask);

_modelMapper = new Mock<IModelMapper>();
_modelMapper.Setup(x => x.Map<InformViewModel>(It.Is<InformRequest>(r => r == _request)))
.ReturnsAsync(_viewModel);
Expand Down
Loading