public void Parses_TrainingCode_Correctly_For_Frameworks() { var approvalsEvent = new ApprenticeshipCreatedEvent { AccountId = 12345, StartDate = DateTime.Today.AddMonths(-12), AccountLegalEntityPublicHashedId = "1234567890", AgreedOn = DateTime.Today.AddMonths(-13), ApprenticeshipId = 12, CreatedOn = DateTime.Today.AddMonths(-14), EndDate = DateTime.Today.AddYears(1), LegalEntityName = "Test Employer", ProviderId = 1234, TrainingCode = "460-3-2", TrainingType = ProgrammeType.Framework, TransferSenderId = 123456, Uln = "123456", PriceEpisodes = new PriceEpisode[] { new PriceEpisode { FromDate = DateTime.Today.AddMonths(-12), Cost = 1000M, ToDate = DateTime.Today.AddDays(-1) }, new PriceEpisode { FromDate = DateTime.Today, Cost = 1200M } } }; var model = Mapper.Map <ApprenticeshipModel>(approvalsEvent); model.ProgrammeType.Should().Be(3); model.FrameworkCode.Should().Be(460); model.PathwayCode.Should().Be(2); }
public void Defaults_Programme_Type_To_25_For_Standards() { var approvalsEvent = new ApprenticeshipCreatedEvent { AccountId = 12345, StartDate = DateTime.Today.AddMonths(-12), AccountLegalEntityPublicHashedId = "1234567890", AgreedOn = DateTime.Today.AddMonths(-13), ApprenticeshipId = 12, CreatedOn = DateTime.Today.AddMonths(-14), EndDate = DateTime.Today.AddYears(1), LegalEntityName = "Test Employer", ProviderId = 1234, TrainingCode = "52", TrainingType = ProgrammeType.Standard, TransferSenderId = 123456, Uln = "123456", PriceEpisodes = new PriceEpisode[] { new PriceEpisode { FromDate = DateTime.Today.AddMonths(-12), Cost = 1000M, ToDate = DateTime.Today.AddDays(-1) }, new PriceEpisode { FromDate = DateTime.Today, Cost = 1200M } } }; var model = Mapper.Map <ApprenticeshipModel>(approvalsEvent); model.ProgrammeType.Should().Be(25); }
public void Apprenticeship_Created_Defaults_Is_Levy_Payer_To_True() { var approvalsEvent = new ApprenticeshipCreatedEvent { AccountId = 12345, StartDate = DateTime.Today.AddMonths(-12), AccountLegalEntityPublicHashedId = "1234567890", AgreedOn = DateTime.Today.AddMonths(-13), ApprenticeshipId = 12, CreatedOn = DateTime.Today.AddMonths(-14), EndDate = DateTime.Today.AddYears(1), LegalEntityName = "Test Employer", ProviderId = 1234, TrainingCode = "460-3-2", TrainingType = ProgrammeType.Framework, TransferSenderId = 123456, Uln = "123456", PriceEpisodes = new PriceEpisode[] { new PriceEpisode { FromDate = DateTime.Today.AddMonths(-12), Cost = 1000M, ToDate = DateTime.Today.AddDays(-1) }, new PriceEpisode { FromDate = DateTime.Today, Cost = 1200M } } }; var model = Mapper.Map <ApprenticeshipModel>(approvalsEvent); model.IsLevyPayer.Should().BeTrue(); }
public async Task Process(ApprenticeshipCreatedEvent createdEvent) { try { logger.LogDebug($"Now processing the apprenticeship created event. " + $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " + $"employer account id: {createdEvent.AccountId}, " + $"Ukprn: {createdEvent.ProviderId}."); var model = mapper.Map <ApprenticeshipModel>(createdEvent); var duplicates = await apprenticeshipService.NewApprenticeship(model).ConfigureAwait(false); logger.LogDebug($"Apprenticeship saved to database. " + $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " + $"employer account id: {createdEvent.AccountId}, " + $"Ukprn: {createdEvent.ProviderId}."); var updatedEvent = mapper.Map <ApprenticeshipUpdated>(model); updatedEvent.Duplicates = duplicates.Select(duplicate => new ApprenticeshipDuplicate { Ukprn = duplicate.Ukprn, ApprenticeshipId = duplicate.ApprenticeshipId }).ToList(); var endpointInstance = await endpointInstanceFactory.GetEndpointInstance().ConfigureAwait(false); await endpointInstance.Publish(updatedEvent).ConfigureAwait(false); logger.LogInfo($"Finished processing the apprenticeship created event. " + $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " + $"employer account id: {createdEvent.AccountId}, " + $"Ukprn: {createdEvent.ProviderId}."); } catch (ApprenticeshipAlreadyExistsException e) { logger.LogWarning($"Apprenticeship already exists while trying to add a new apprenticeship: {e.Message}\n" + $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " + $"employer account id: {createdEvent.AccountId}, " + $"Ukprn: {createdEvent.ProviderId}."); } catch (InvalidOperationException e) { logger.LogError($"Unhandled exception while adding apprenticeship: {e.Message}\n" + $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " + $"employer account id: {createdEvent.AccountId}, " + $"Ukprn: {createdEvent.ProviderId}.", e); throw; } catch (Exception ex) { logger.LogError($"Error processing the apprenticeship event. Error: {ex.Message}", ex); throw; } }
public async Task ApprenticeshipCreated_Triggers_ApprenticeshipUpdated_Event_With_Duplicates() { var approvalsEvent = new ApprenticeshipCreatedEvent { AccountId = 12345, StartDate = DateTime.Today, AccountLegalEntityPublicHashedId = "1234567890", AgreedOn = DateTime.Today.AddDays(-1), ApprenticeshipId = 12, CreatedOn = DateTime.Today.AddDays(-2), EndDate = DateTime.Today.AddYears(1), LegalEntityName = "Test Employer", ProviderId = 1234, TrainingCode = "52", TrainingType = ProgrammeType.Standard, TransferSenderId = 123456, Uln = "123456", PriceEpisodes = new [] { new PriceEpisode { FromDate = DateTime.Today, Cost = 1000M } } }; mocker.Mock <IApprenticeshipService>() .Setup(svc => svc.NewApprenticeship(It.IsAny <ApprenticeshipModel>())) .ReturnsAsync(() => new List <ApprenticeshipDuplicateModel> { new ApprenticeshipDuplicateModel { Id = 1, Ukprn = 4321, Uln = 123456, ApprenticeshipId = 13 } }); var apprenticeshipProcessor = mocker.Create <ApprenticeshipProcessor>(); await apprenticeshipProcessor.Process(approvalsEvent); mocker.Mock <IEndpointInstance>() .Verify(svc => svc.Publish(It.Is <ApprenticeshipUpdated>(ev => ev.EmployerAccountId == approvalsEvent.AccountId && ev.Id == approvalsEvent.ApprenticeshipId && ev.Ukprn == approvalsEvent.ProviderId && ev.Uln.ToString() == approvalsEvent.Uln && ev.Duplicates.Count == 1 && ev.Duplicates.All(duplicate => duplicate.ApprenticeshipId == 13 && duplicate.Ukprn == 4321)), It.IsAny <PublishOptions>()), Times.Once); }
public void Maps_ApprenticeshipCreatedEvent_To_ApprenticeshipModel() { var approvalsEvent = new ApprenticeshipCreatedEvent { AccountId = 12345, StartDate = DateTime.Today.AddMonths(-12), AccountLegalEntityPublicHashedId = "1234567890", AgreedOn = DateTime.Today.AddMonths(-13), ApprenticeshipId = 12, CreatedOn = DateTime.Today.AddMonths(-14), EndDate = DateTime.Today.AddYears(1), LegalEntityName = "Test Employer", ProviderId = 1234, TrainingCode = "52", TrainingType = ProgrammeType.Standard, TransferSenderId = 123456, Uln = "123456", PriceEpisodes = new PriceEpisode[] { new PriceEpisode { FromDate = DateTime.Today.AddMonths(-12), Cost = 1000M, ToDate = DateTime.Today.AddDays(-1) }, new PriceEpisode { FromDate = DateTime.Today, Cost = 1200M } } }; var model = Mapper.Map <ApprenticeshipModel>(approvalsEvent); model.AccountId.Should().Be(approvalsEvent.AccountId); model.AgreedOnDate.Should().Be(approvalsEvent.AgreedOn); model.AgreementId.Should().Be(approvalsEvent.AccountLegalEntityPublicHashedId); model.EstimatedEndDate.Should().Be(approvalsEvent.EndDate); model.EstimatedStartDate.Should().Be(approvalsEvent.StartDate); model.StandardCode.ToString().Should().Be(approvalsEvent.TrainingCode); model.Id.Should().Be(approvalsEvent.ApprenticeshipId); model.LegalEntityName.Should().Be(approvalsEvent.LegalEntityName); model.Status.Should().Be(ApprenticeshipStatus.Active); model.StopDate.Should().BeNull(); model.TransferSendingEmployerAccountId.Should().Be(approvalsEvent.TransferSenderId); model.Ukprn.Should().Be(approvalsEvent.ProviderId); model.Uln.ToString().Should().Be(approvalsEvent.Uln); model.ApprenticeshipPriceEpisodes.Count.Should().Be(approvalsEvent.PriceEpisodes.Length); approvalsEvent.PriceEpisodes.All(pe => model.ApprenticeshipPriceEpisodes.Any(ape => ape.StartDate == pe.FromDate && ape.Cost == pe.Cost && ape.EndDate == pe.ToDate)).Should().BeTrue(); }
public void ProcessCreatedEvent_WithExistingApprenticeship_DoesNotFail() { var approvalsEvent = new ApprenticeshipCreatedEvent { AccountId = 12345, TransferSenderId = 123456, }; mocker.Mock <IApprenticeshipService>().Setup(x => x.NewApprenticeship(It.Is <ApprenticeshipModel>(model => model.AccountId == 12345 && model.TransferSendingEmployerAccountId == 123456 ))).Throws(new ApprenticeshipAlreadyExistsException(1)); var sut = mocker.Create <ApprenticeshipProcessor>(); Func <Task> action = async() => await sut.Process(approvalsEvent); action.Should().NotThrow(); }
public async Task Processes_ApprenticeshipCreated() { var approvalsEvent = new ApprenticeshipCreatedEvent { AccountId = 12345, StartDate = DateTime.Today, AccountLegalEntityPublicHashedId = "1234567890", AgreedOn = DateTime.Today.AddDays(-1), ApprenticeshipId = 12, CreatedOn = DateTime.Today.AddDays(-2), EndDate = DateTime.Today.AddYears(1), LegalEntityName = "Test Employer", ProviderId = 1234, TrainingCode = "52", TrainingType = ProgrammeType.Standard, TransferSenderId = 123456, Uln = "123456", PriceEpisodes = new [] { new PriceEpisode { FromDate = DateTime.Today, Cost = 1000M } } }; mocker.Mock <IApprenticeshipService>() .Setup(svc => svc.NewApprenticeship(It.IsAny <ApprenticeshipModel>())) .ReturnsAsync(() => new List <ApprenticeshipDuplicateModel>()); var apprenticeshipProcessor = mocker.Create <ApprenticeshipProcessor>(); await apprenticeshipProcessor.Process(approvalsEvent); mocker.Mock <IApprenticeshipService>() .Verify(svc => svc.NewApprenticeship(It.Is <ApprenticeshipModel>(model => model.AccountId == approvalsEvent.AccountId && model.Id == approvalsEvent.ApprenticeshipId && model.Ukprn == approvalsEvent.ProviderId && model.Uln.ToString() == approvalsEvent.Uln) ), Times.Once); }
public async Task Process(ApprenticeshipCreatedEvent createdEvent) { try { logger.LogDebug($"Now processing the apprenticeship created event. Apprenticeship id: {createdEvent.ApprenticeshipId}, employer account id: {createdEvent.AccountId}, Ukprn: {createdEvent.ProviderId}."); var model = mapper.Map <ApprenticeshipModel>(createdEvent); var duplicates = await apprenticeshipService.NewApprenticeship(model).ConfigureAwait(false); var updatedEvent = mapper.Map <ApprenticeshipUpdated>(model); updatedEvent.Duplicates = duplicates.Select(duplicate => new ApprenticeshipDuplicate { Ukprn = duplicate.Ukprn, ApprenticeshipId = duplicate.ApprenticeshipId }).ToList(); var endpointInstance = await endpointInstanceFactory.GetEndpointInstance().ConfigureAwait(false); await endpointInstance.Publish(updatedEvent).ConfigureAwait(false); logger.LogInfo($"Finished processing the apprenticeship created event. Apprenticeship id: {createdEvent.ApprenticeshipId}, employer account id: {createdEvent.AccountId}, Ukprn: {createdEvent.ProviderId}."); } catch (Exception ex) { logger.LogError($"Error processing the apprenticeship event. Error: {ex.Message}", ex); throw; } }
public bool IsValid(ApprenticeshipEmployerType apprenticeshipEmployerType, Apprenticeship apprenticeship, ApprenticeshipCreatedEvent apprenticeshipCreatedEvent) { var isValid = apprenticeshipCreatedEvent.ApprenticeshipId == apprenticeship.Id && apprenticeshipCreatedEvent.CreatedOn.Date == DateTime.UtcNow.Date && apprenticeshipCreatedEvent.AgreedOn == apprenticeship.Cohort.EmployerAndProviderApprovedOn && apprenticeshipCreatedEvent.AccountId == apprenticeship.Cohort.EmployerAccountId && apprenticeshipCreatedEvent.AccountLegalEntityPublicHashedId == apprenticeship.Cohort.AccountLegalEntity.PublicHashedId && apprenticeshipCreatedEvent.LegalEntityName == apprenticeship.Cohort.AccountLegalEntity.Name && apprenticeshipCreatedEvent.ProviderId == apprenticeship.Cohort.Provider.UkPrn && apprenticeshipCreatedEvent.TransferSenderId == apprenticeship.Cohort.TransferSenderId && apprenticeshipCreatedEvent.ApprenticeshipEmployerTypeOnApproval == apprenticeshipEmployerType && apprenticeshipCreatedEvent.Uln == apprenticeship.Uln && apprenticeshipCreatedEvent.TrainingType == apprenticeship.ProgrammeType.Value && apprenticeshipCreatedEvent.TrainingCode == apprenticeship.CourseCode && apprenticeshipCreatedEvent.StartDate == apprenticeship.StartDate.Value && apprenticeshipCreatedEvent.EndDate == apprenticeship.EndDate.Value && apprenticeshipCreatedEvent.PriceEpisodes.Count() == apprenticeship.PriceHistory.Count; for (var i = 0; i < apprenticeship.PriceHistory.Count; i++) { var priceHistory = apprenticeship.PriceHistory.ElementAt(i); var priceEpisode = apprenticeshipCreatedEvent.PriceEpisodes.ElementAtOrDefault(i); isValid = isValid && priceEpisode?.FromDate == priceHistory.FromDate & priceEpisode?.ToDate == priceHistory.ToDate & priceEpisode?.Cost == priceHistory.Cost; } return(isValid); }
public Task Handle(ApprenticeshipCreatedEvent message, IMessageHandlerContext context) { return(Log(message, context)); }