public async Task JobProfileServiceRefreshSegmentsReturnsSuccessWhenProfileReplacedAsync() { // arrange var refreshJobProfileSegmentModel = A.Fake <RefreshJobProfileSegment>(); var existingJobProfileModel = A.Fake <JobProfileModel>(); existingJobProfileModel.Segments = new List <SegmentModel> { new SegmentModel { Segment = Data.JobProfileSegment.Overview, }, }; var jobProfileModel = A.Fake <JobProfileModel>(); var existingSegmentModel = A.Dummy <SegmentModel>(); var segmentModel = A.Dummy <SegmentModel>(); var expectedResult = HttpStatusCode.OK; A.CallTo(() => repository.GetAsync(A <Expression <Func <JobProfileModel, bool> > > .Ignored)).Returns(existingJobProfileModel); A.CallTo(() => segmentService.RefreshSegmentAsync(refreshJobProfileSegmentModel)).Returns(segmentModel); A.CallTo(() => repository.UpsertAsync(A <JobProfileModel> .Ignored)).Returns(HttpStatusCode.OK); // act var result = await jobProfileService.RefreshSegmentsAsync(refreshJobProfileSegmentModel).ConfigureAwait(false); // assert A.CallTo(() => repository.GetAsync(A <Expression <Func <JobProfileModel, bool> > > .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => segmentService.RefreshSegmentAsync(refreshJobProfileSegmentModel)).MustHaveHappenedOnceExactly(); A.CallTo(() => repository.UpsertAsync(A <JobProfileModel> .Ignored)).MustHaveHappenedOnceExactly(); result.Should().Be(expectedResult); }
public async Task <HttpStatusCode> RefreshSegmentsAsync(RefreshJobProfileSegment refreshJobProfileSegmentModel) { if (refreshJobProfileSegmentModel is null) { throw new ArgumentNullException(nameof(refreshJobProfileSegmentModel)); } //Check existing document var existingJobProfile = await GetByIdAsync(refreshJobProfileSegmentModel.JobProfileId).ConfigureAwait(false); if (existingJobProfile is null) { return(HttpStatusCode.NotFound); } var existingItem = existingJobProfile.Segments.SingleOrDefault(s => s.Segment == refreshJobProfileSegmentModel.Segment); if (existingItem?.RefreshSequence > refreshJobProfileSegmentModel.SequenceNumber) { return(HttpStatusCode.AlreadyReported); } var offlineSegmentData = segmentService.GetOfflineSegment(refreshJobProfileSegmentModel.Segment); var segmentData = await segmentService.RefreshSegmentAsync(refreshJobProfileSegmentModel).ConfigureAwait(false); if (existingItem is null) { segmentData.Markup = !string.IsNullOrEmpty(segmentData.Markup?.Value) ? segmentData.Markup : offlineSegmentData.OfflineMarkup; segmentData.Json ??= offlineSegmentData.OfflineJson; existingJobProfile.Segments.Add(segmentData); } else { var index = existingJobProfile.Segments.IndexOf(existingItem); var fallbackMarkup = !string.IsNullOrEmpty(existingItem.Markup?.Value) ? existingItem.Markup : offlineSegmentData.OfflineMarkup; segmentData.Markup = !string.IsNullOrEmpty(segmentData.Markup?.Value) ? segmentData.Markup : fallbackMarkup; segmentData.Json ??= existingItem.Json ?? offlineSegmentData.OfflineJson; existingJobProfile.Segments[index] = segmentData; } var result = await repository.UpsertAsync(existingJobProfile).ConfigureAwait(false); return(segmentData.RefreshStatus == Data.Enums.RefreshStatus.Success ? result : HttpStatusCode.FailedDependency); }