public async Task <JobProfileSalary> PopulateSalary(string socCode, string jobProfileUrlName)
        {
            applicationLogger.Trace($"BEGIN: Method '{nameof(PopulateSalary)}' called from '{nameof(JobProfileIndexEnhancer)}' with parameters '{socCode}'.");
            JobProfileSalary salary = new JobProfileSalary();

            try
            {
                salary = await salaryService.GetSalaryBySocAsync(socCode);

                salary.JobProfileName    = jobProfileUrlName;
                salary.StarterSalary     = Convert.ToDouble(salaryCalculator.GetStarterSalary(salary));
                salary.SalaryExperienced = Convert.ToDouble(salaryCalculator.GetExperiencedSalary(salary));

                if (salary.StarterSalary == 0 || salary.SalaryExperienced == 0)
                {
                    applicationLogger.Warn($"ERROR: Method '{nameof(PopulateSalary)}' called from '{nameof(JobProfileIndexEnhancer)}' with parameters '{socCode}' failed to get salary '{JsonConvert.SerializeObject(salary)}'.");
                }
            }
            catch (Exception ex)
            {
                //If there is a failure for this profile, log and continue with other profiles
                applicationLogger.ErrorJustLogIt($"ERROR: Method '{nameof(PopulateSalary)}' called from '{nameof(JobProfileIndexEnhancer)}' with parameters '{socCode}' failed with exception '{ex.Message}'.", ex);
            }
            finally
            {
                salary.JobProfileName = jobProfileUrlName;
                applicationLogger.Trace($"END: Method '{nameof(PopulateSalary)}' called from '{nameof(JobProfileIndexEnhancer)}' with parameters '{socCode}' returned {JsonConvert.SerializeObject(salary)}.");
            }

            return(salary);
        }
Example #2
0
        public async Task GetServiceStatusAsync(bool returnValidHttpStatusCode, bool returnValidJobProfileSalary, ServiceState expectedServiceStatus)
        {
            //Arrange
            var applicationLogger = A.Fake <IApplicationLogger>(ops => ops.Strict());
            var clientProxy       = A.Fake <IAsheHttpClientProxy>(ops => ops.Strict());

            JobProfileSalary dummyJobProfileSalary = null;

            if (returnValidJobProfileSalary)
            {
                dummyJobProfileSalary = new JobProfileSalary()
                {
                    Median = 580, Deciles = new Dictionary <int, decimal>()
                    {
                        { 10, 540 }
                    }
                };
            }

            HttpStatusCode returnHttpStatusCode;

            if (returnValidHttpStatusCode)
            {
                returnHttpStatusCode = HttpStatusCode.OK;
            }
            else
            {
                returnHttpStatusCode = HttpStatusCode.BadRequest;
            }

            var httpResponseMessage = new HttpResponseMessage {
                StatusCode = returnHttpStatusCode, Content = new StringContent(JsonConvert.SerializeObject(dummyJobProfileSalary), Encoding.UTF8, "application/json")
            };

            A.CallTo(() => clientProxy.EstimatePayMdAsync(A <string> ._)).Returns(httpResponseMessage);
            A.CallTo(() => applicationLogger.Warn(A <string> ._)).DoesNothing();
            A.CallTo(() => applicationLogger.ErrorJustLogIt(A <string> ._, A <Exception> ._)).DoesNothing();

            //Act
            IServiceStatus lmiFeed       = new SalaryService(applicationLogger, clientProxy);
            var            serviceStatus = await lmiFeed.GetCurrentStatusAsync();

            //Assert
            A.CallTo(() => clientProxy.EstimatePayMdAsync(A <string> ._)).MustHaveHappened();

            serviceStatus.Status.Should().Be(expectedServiceStatus);
        }
        public async Task GetSalaryRangeAsyncTestAsync(bool isPublishing)
        {
            var fakeJobProfileRepo         = A.Fake <IJobProfileRepository>();
            var fakeJobProfileCategoryRepo = A.Fake <IJobProfileCategoryRepository>();
            var salaryService        = A.Fake <ISalaryService>();
            var salaryCalculator     = A.Fake <ISalaryCalculator>();
            var fakeLogger           = A.Fake <IApplicationLogger>();
            var dummyJobProfileIndex = A.Dummy <JobProfileIndex>();
            var dummyJobProfile      = new JobProfile
            {
                SOCCode = nameof(JobProfile.SOCCode)
            };
            var dummySalary = new JobProfileSalary
            {
                Deciles = new Dictionary <int, decimal>
                {
                    { 10, 100 },
                    { 20, 200 }
                }
            };

            A.CallTo(() => fakeJobProfileRepo.GetByUrlName(A <string> ._)).Returns(dummyJobProfile);
            A.CallTo(() => fakeJobProfileRepo.GetByUrlNameForSearchIndex(A <string> ._, A <bool> ._)).Returns(dummyJobProfile);
            A.CallTo(() => salaryService.GetSalaryBySocAsync(A <string> ._)).Returns(Task.FromResult(dummySalary));
            A.CallTo(() => salaryCalculator.GetStarterSalary(A <JobProfileSalary> ._)).Returns(1000);
            A.CallTo(() => salaryCalculator.GetExperiencedSalary(A <JobProfileSalary> ._)).Returns(2000);

            var enhancer = new JobProfileIndexEnhancer(fakeJobProfileRepo, fakeJobProfileCategoryRepo, salaryService, salaryCalculator, fakeLogger);

            enhancer.Initialise(dummyJobProfileIndex, isPublishing);

            var result = await enhancer.PopulateSalary("1", "2");

            result.StarterSalary.Should().Be(1000);
            result.SalaryExperienced.Should().Be(2000);

            A.CallTo(() => fakeJobProfileRepo.GetByUrlNameForSearchIndex(A <string> ._, isPublishing)).MustHaveHappened();
            A.CallTo(() => fakeJobProfileRepo.GetByUrlName(A <string> ._)).MustNotHaveHappened();

            A.CallTo(() => salaryService.GetSalaryBySocAsync(A <string> ._)).MustHaveHappened();
            A.CallTo(() => salaryCalculator.GetStarterSalary(A <JobProfileSalary> ._)).MustHaveHappened();
            A.CallTo(() => salaryCalculator.GetExperiencedSalary(A <JobProfileSalary> ._)).MustHaveHappened();
        }
 public decimal? GetExperiencedSalary(JobProfileSalary jobProfileSalary)
 {
     return jobProfileSalary?.Deciles.Max(s => s.Value) * Constants.Multiplier;
 }
 public decimal? GetStarterSalary(JobProfileSalary jobProfileSalary)
 {
     return jobProfileSalary?.Deciles.Min(s => s.Value) * Constants.Multiplier;
 }