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);
     }
 }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
 private static void SetStandardAsNullIfTraineeship(VacancySummary vacancy)
 {
     if (vacancy.VacancyType == VacancyType.Traineeship)
     {
         vacancy.StandardId = null;
     }
 }
Exemplo n.º 7
0
 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;
                }
            }
        }
Exemplo n.º 21
0
        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);
        }
Exemplo n.º 23
0
        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));
 }