public void GetNextAvailableVacancyShouldReturnNullIfThereIsntAnyMoreVacancies() { var vacancyPostingService = new Mock <IVacancyPostingService>(); var vacancyLockingService = new Mock <IVacancyLockingService>(); var providerService = new Mock <IProviderService>(); VacancySummary vacancySummary = null; int total; vacancyPostingService.Setup( avr => avr.GetWithStatus(It.IsAny <VacancySummaryByStatusQuery>(), out total)) .Returns(new List <VacancySummary>()); vacancyLockingService.Setup( vls => vls.GetNextAvailableVacancy(It.IsAny <string>(), It.IsAny <List <VacancySummary> >())) .Returns(vacancySummary); providerService.Setup(ps => ps.GetProvider(It.IsAny <int>())).Returns(new Provider()); var vacancyProvider = new VacancyProviderBuilder() .With(vacancyPostingService) .With(vacancyLockingService) .With(providerService) .Build(); var result = vacancyProvider.GetNextAvailableVacancy(); result.Should().BeNull(); }
private bool VacancyIsUnattended(VacancySummary vacancySummary) { var timeout = _configurationService.Get <VacancyPostingConfiguration>().QAVacancyTimeout; // In minutes return(vacancySummary.Status == VacancyStatus.ReservedForQA && vacancySummary.DateStartedToQA.HasValue && (_dateTimeService.UtcNow - vacancySummary.DateStartedToQA.Value).TotalMinutes > timeout); }
public void GetNextAvailableVacancyShouldReturnTheNextVacancyIfThereIsAnyAvailable() { const int vacancyReferenceNumber = 1; var vacancyPostingService = new Mock <IVacancyPostingService>(); var vacancyLockingService = new Mock <IVacancyLockingService>(); var providerService = new Mock <IProviderService>(); var vacancySummary = new VacancySummary { VacancyReferenceNumber = vacancyReferenceNumber }; int total; vacancyPostingService.Setup( avr => avr.GetWithStatus(It.IsAny <VacancySummaryByStatusQuery>(), out total)) .Returns(new List <VacancySummary>()); vacancyLockingService.Setup( vls => vls.GetNextAvailableVacancy(It.IsAny <string>(), It.IsAny <List <VacancySummary> >())) .Returns(vacancySummary); providerService.Setup(ps => ps.GetProvider(It.IsAny <int>())).Returns(new Provider()); var vacancyProvider = new VacancyProviderBuilder() .With(vacancyPostingService) .With(vacancyLockingService) .With(providerService) .Build(); var result = vacancyProvider.GetNextAvailableVacancy(); result.VacancyReferenceNumber.Should().Be(vacancyReferenceNumber); }
private static void LogCategory(VacancySummary vacancy, ILogService logService, Category category) { if (vacancy.SectorCodeName != null && !category.IsValid()) { logService.Warn("Cannot find a category for the traineeship with Id {0}", vacancy.VacancyId); } }
public void ShouldReserveTheNextVacancyAvailableIfTheOriginalOneIsNotAvailable() { const int vacancyReferenceNumber = 1; const int nextVacanyReferenceNumber = 2; const string userName = "******"; var nextVacancySummary = new VacancySummary { VacancyReferenceNumber = nextVacanyReferenceNumber }; var vacancyLockingService = new Mock <IVacancyLockingService>(); vacancyLockingService.Setup(vls => vls.IsVacancyAvailableToQABy(userName, It.IsAny <VacancySummary>())) .Returns(false); vacancyLockingService.Setup(vls => vls.GetNextAvailableVacancy(userName, It.IsAny <List <VacancySummary> >())) .Returns(nextVacancySummary); var vacancyProviderBuilder = VacancyProviderTestHelper.GetBasicVacancyProviderBuilder(userName, vacancyReferenceNumber, nextVacanyReferenceNumber); var provider = vacancyProviderBuilder.With(vacancyLockingService).Build(); var result = provider.ReserveVacancyForQA(vacancyReferenceNumber); result.VacancyReferenceNumber.Should().Be(nextVacanyReferenceNumber); vacancyProviderBuilder.VacancyPostingService.Verify(ps => ps.ReserveVacancyForQA(nextVacanyReferenceNumber), Times.Once); }
private static void SetStandardAsNullIfTraineeship(VacancySummary vacancy) { if (vacancy.VacancyType == VacancyType.Traineeship) { vacancy.StandardId = null; } }
private static void SetSectorAsNullIfApprenticeship(VacancySummary vacancy) { if (vacancy.VacancyType == VacancyType.Apprenticeship) { vacancy.SectorCodeName = null; } }
public void ShouldBeAbleToReserveForQAIfNobodyHasLockedTheVacancy() { var vacancySummary = new VacancySummary { Status = VacancyStatus.Submitted }; var canBeReserved = new VacancyLockingServiceBuilder().Build() .IsVacancyAvailableToQABy(UserName, vacancySummary); canBeReserved.Should().BeTrue(); }
public void ShouldBeAbleToReserveForQAIfQAUserNameIsFilledButStatusIsSubmitted() { var vacancySummary = new VacancySummary { QAUserName = AnotherUserName, Status = VacancyStatus.Submitted }; var canBeReserved = new VacancyLockingServiceBuilder().Build() .IsVacancyAvailableToQABy(UserName, vacancySummary); canBeReserved.Should().BeTrue(); }
public void ShouldNotBeAbleToReserveForQAIfTheIfTheStatusIsNotReservedForQAOrSubmitted(VacancyStatus vacancyStatus) { var vacancySummary = new VacancySummary { Status = vacancyStatus }; var canBeReserved = new VacancyLockingServiceBuilder().Build() .IsVacancyAvailableToQABy(UserName, vacancySummary); canBeReserved.Should().BeFalse(); }
public void ShouldBeAbleToReserveForQAIfTheVacancyIsReservedByMe(VacancyStatus currentVacancyStatus, bool expectedCanBeReserved) { var vacancySummary = new VacancySummary { Status = currentVacancyStatus, QAUserName = UserName }; var canBeReserved = new VacancyLockingServiceBuilder().Build() .IsVacancyAvailableToQABy(UserName, vacancySummary); canBeReserved.Should().Be(expectedCanBeReserved); }
public void ShouldShowSaveAndCancelButtonWhenEditingDates() { var details = new VacancySummary(); var viewModel = new Fixture().Build <FurtherVacancyDetailsViewModel>() .With(v => v.Status, VacancyStatus.Live) .Create(); var view = details.RenderAsHtml(viewModel); view.GetElementbyId("vacancySummaryButton").Should().BeNull("Should exists a save button"); }
private static GeoPoint GetGeoPoint(VacancySummary vacancy) { if (vacancy.Address?.GeoPoint == null) { return(new GeoPoint()); } return(new GeoPoint { Latitude = vacancy.Address.GeoPoint.Latitude, Longitude = vacancy.Address.GeoPoint.Longitude }); }
public void ShouldntBeAbleToReserveForQAIfNobodyHasLockedTheVacancyButTheStateIsReserveForQA() { // TODO: this is a situation that should be impossible to reach (an invalid status of the vacancy summary) // but we test it because is not controlled by the entity itself var vacancySummary = new VacancySummary { Status = VacancyStatus.ReservedForQA }; var canBeReserved = new VacancyLockingServiceBuilder().Build() .IsVacancyAvailableToQABy(UserName, vacancySummary); canBeReserved.Should().BeFalse(); }
public void ShouldShowSaveButtonWhenEditingDraftVacancy() { var details = new VacancySummary(); var viewModel = new Fixture().Build <FurtherVacancyDetailsViewModel>() .With(v => v.Status, VacancyStatus.Draft) .Create(); var view = details.RenderAsHtml(viewModel); view.GetElementbyId("vacancySummaryButton").Should().NotBeNull("Should exists a save button"); view.GetElementbyId("vacancySummaryButton").InnerHtml.Should().Be("Save and return to Preview"); view.GetElementbyId("vacancySummaryButton").Attributes["value"].Value.Should().Be("VacancySummaryAndPreview"); }
public void ShouldNotBeAbleToReserveForQAIfAnotherUserHasLockedTheVacancy(VacancyStatus currentVacancyStatus) { // Arrange var vacancySummary = new VacancySummary { QAUserName = AnotherUserName, Status = currentVacancyStatus, DateStartedToQA = _utcNow.AddMinutes(-SmallerTimeout) }; var canBeReserved = new VacancyLockingServiceBuilder().Build() .IsVacancyAvailableToQABy(UserName, vacancySummary); canBeReserved.Should().BeFalse(); }
public void ShouldShowSaveAndExitButton() { var details = new VacancySummary(); var viewModel = new FurtherVacancyDetailsViewModel { WageUnits = ApprenticeshipVacancyConverter.GetWageUnits(), WageTextPresets = ApprenticeshipVacancyConverter.GetWageTextPresets(), DurationTypes = ApprenticeshipVacancyConverter.GetDurationTypes(VacancyType.Apprenticeship) }; var view = details.RenderAsHtml(viewModel); view.GetElementbyId("vacancySummaryAndExit").Should().NotBeNull("Should exists a save and exit button"); }
public StrategyResult Execute(VacancySummary input) { if (input == null) { return(new StrategyResult(VacancyManagementServiceCodes.Delete.VacancyNotFound)); } if (!input.Status.IsStateDeletable()) { return(new StrategyResult(VacancyManagementServiceCodes.Delete.VacancyInIncorrectState)); } _writeRepository.Delete(input.VacancyId); return(new StrategyResult(VacancyManagementServiceCodes.Delete.Ok)); }
public static TraineeshipSummary GetTraineeshipSummary(VacancySummary vacancy, Employer employer, Provider provider, IList <Category> categories, ILogService logService) { try { //Manually mapping rather than using automapper as the two enties are significantly different var location = GetGeoPoint(vacancy); var category = vacancy.GetCategory(categories); var subcategory = vacancy.GetSubCategory(categories); LogCategory(vacancy, logService, category); var summary = new TraineeshipSummary { Id = vacancy.VacancyId, //Goes into elastic unformatted for searching VacancyReference = vacancy.VacancyReferenceNumber.ToString(), Title = vacancy.Title, // ReSharper disable PossibleInvalidOperationException PostedDate = vacancy.DateQAApproved.Value, StartDate = vacancy.PossibleStartDate.Value, ClosingDate = vacancy.ClosingDate.Value, // ReSharper restore PossibleInvalidOperationException Description = vacancy.ShortDescription, NumberOfPositions = vacancy.NumberOfPositions, EmployerName = string.IsNullOrWhiteSpace(vacancy.EmployerAnonymousName) ? employer.FullName : vacancy.EmployerAnonymousName, IsEmployerAnonymous = !string.IsNullOrEmpty(vacancy.EmployerAnonymousName), ProviderName = provider.TradingName, IsPositiveAboutDisability = employer.IsPositiveAboutDisability, Location = location, CategoryCode = category.CodeName, Category = category.FullName, SubCategoryCode = subcategory.CodeName, SubCategory = subcategory.FullName, AnonymousEmployerName = vacancy.EmployerAnonymousName }; return(summary); } catch (Exception ex) { logService.Error($"Failed to map traineeship with Id: {vacancy?.VacancyId ?? 0}", ex); return(null); } }
private async Task UpdateWithTrainingProgrammeInfo(VacancySummary summary) { if (summary.ProgrammeId != null) { var programme = await _apprenticeshipProgrammeProvider.GetApprenticeshipProgrammeAsync(summary.ProgrammeId); if (programme == null) { _logger.LogWarning($"No training programme found for ProgrammeId: {summary.ProgrammeId}"); } else { summary.TrainingTitle = programme.Title; summary.TrainingType = programme.ApprenticeshipType; summary.TrainingLevel = programme.Level; } } }
public void ShouldntDeleteALiveVacancy() { // Arrange var summary = new VacancySummary { Status = VacancyStatus.Live }; var mockVacancyWriteRepository = new Mock <IVacancyWriteRepository>(); var sut = new DeleteVacancyStrategy(mockVacancyWriteRepository.Object); // Act var result = sut.Execute(summary); // Assert Assert.AreEqual(VacancyManagementServiceCodes.Delete.VacancyInIncorrectState, result.Code); mockVacancyWriteRepository.Verify(x => x.Delete(It.IsAny <int>()), Times.Never); }
public void ShouldBeAbleToReserveForQAIfAnotherUserHasLockedTheVacancyButHasLeftItUnattended(VacancyStatus currentVacancyStatus, bool expectedCanBeReserved) { // Arrange var vacancySummary = new VacancySummary { QAUserName = AnotherUserName, DateStartedToQA = _utcNow.AddMinutes(-GreaterTimeout), Status = currentVacancyStatus }; var vacancyLockingService = GetVacancyLockingServiceWith(Timeout, _utcNow); // Act var canBeReserved = vacancyLockingService.IsVacancyAvailableToQABy(UserName, vacancySummary); //Assert canBeReserved.Should().Be(expectedCanBeReserved); }
public void ShouldReturnNullIfThereIsNotAnyAvailableVacancy() { const int vacancyReferenceNumber = 1; const string userName = "******"; VacancySummary nextVacancySummary = null; var vacancyLockingService = new Mock <IVacancyLockingService>(); vacancyLockingService.Setup(vls => vls.IsVacancyAvailableToQABy(userName, It.IsAny <VacancySummary>())) .Returns(false); vacancyLockingService.Setup(vls => vls.GetNextAvailableVacancy(userName, It.IsAny <List <VacancySummary> >())) .Returns(nextVacancySummary); var vacancyProviderBuilder = VacancyProviderTestHelper.GetBasicVacancyProviderBuilder(userName, vacancyReferenceNumber); var provider = vacancyProviderBuilder.With(vacancyLockingService).Build(); var result = provider.ReserveVacancyForQA(vacancyReferenceNumber); result.Should().BeNull(); }
internal static VacancySummary MapFromVacancySummaryAggQueryResponseDto(VacancySummaryAggQueryResponseDto src) { var vacSummaryDetail = src.Id; var vacancySummary = new VacancySummary { Id = vacSummaryDetail.VacancyGuid, Title = vacSummaryDetail.Title, VacancyReference = vacSummaryDetail.VacancyReference, LegalEntityId = vacSummaryDetail.LegalEntityId, LegalEntityName = vacSummaryDetail.LegalEntityName, EmployerAccountId = vacSummaryDetail.EmployerAccountId, EmployerName = vacSummaryDetail.EmployerName, Ukprn = vacSummaryDetail.Ukprn, CreatedDate = vacSummaryDetail.CreatedDate, Duration = vacSummaryDetail.Duration, DurationUnit = vacSummaryDetail.DurationUnit, Status = vacSummaryDetail.Status, ClosingDate = vacSummaryDetail.ClosingDate, ClosedDate = vacSummaryDetail.ClosedDate, ClosureReason = vacSummaryDetail.ClosureReason, ApplicationMethod = vacSummaryDetail.ApplicationMethod, ProgrammeId = vacSummaryDetail.ProgrammeId, StartDate = vacSummaryDetail.StartDate, TrainingTitle = vacSummaryDetail.TrainingTitle, TrainingType = vacSummaryDetail.TrainingType, TrainingLevel = vacSummaryDetail.TrainingLevel, TransferInfoUkprn = vacSummaryDetail.TransferInfoUkprn, TransferInfoProviderName = vacSummaryDetail.TransferInfoProviderName, TransferInfoReason = vacSummaryDetail.TransferInfoReason, TransferInfoTransferredDate = vacSummaryDetail.TransferInfoTransferredDate, TrainingProviderName = vacSummaryDetail.TrainingProviderName, NoOfNewApplications = src.NoOfNewApplications, NoOfSuccessfulApplications = src.NoOfSuccessfulApplications, NoOfUnsuccessfulApplications = src.NoOfUnsuccessfulApplications, }; return(vacancySummary); }
public static VacancySummaryViewModel ConvertToVacancySummaryViewModel(VacancySummary vacancySummary) { var summaryViewModel = new VacancySummaryViewModel { Id = vacancySummary.Id, Title = vacancySummary.Title, VacancyReference = vacancySummary.VacancyReference, EmployerName = string.IsNullOrWhiteSpace(vacancySummary.LegalEntityName) ? "Not selected" : vacancySummary.LegalEntityName, CreatedDate = vacancySummary.CreatedDate, Status = vacancySummary.Status, NoOfNewApplications = vacancySummary.NoOfNewApplications, NoOfSuccessfulApplications = vacancySummary.NoOfSuccessfulApplications, NoOfUnsuccessfulApplications = vacancySummary.NoOfUnsuccessfulApplications, ClosingDate = vacancySummary.ClosedDate ?? vacancySummary.ClosingDate, ApplicationMethod = vacancySummary.ApplicationMethod, ProgrammeId = vacancySummary.ProgrammeId, TrainingLevel = vacancySummary.TrainingLevel, TrainingTitle = vacancySummary.TrainingTitle, TrainingType = vacancySummary.TrainingType, IsTransferred = vacancySummary.TransferInfoTransferredDate.HasValue }; return(summaryViewModel); }
private bool AnotherUserHasLeftTheVacanyUnattended(string userName, VacancySummary vacancySummary) { return(vacancySummary.QAUserName != userName && VacancyIsUnattended(vacancySummary)); }
private static bool NobodyHasTheVacancyLocked(VacancySummary vacancySummary) { return(vacancySummary.Status == VacancyStatus.Submitted); }
private static bool VacancyIsLockedByMe(string userName, VacancySummary vacancySummary) { return(vacancySummary.Status == VacancyStatus.ReservedForQA && vacancySummary.QAUserName == userName); }
private bool IsVacancySuitableToBeTheNextVacancyToChoose(VacancySummary vacancySummary) { return(NobodyHasTheVacancyLocked(vacancySummary) || VacancyIsUnattended(vacancySummary)); }
public bool IsVacancyAvailableToQABy(string userName, VacancySummary vacancySummary) { return(NobodyHasTheVacancyLocked(vacancySummary) || VacancyIsLockedByMe(userName, vacancySummary) || AnotherUserHasLeftTheVacanyUnattended(userName, vacancySummary)); }