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); }
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; }