public async Task UpdateReferralsAsync(OpportunityItemDto dto) { var existingReferrals = _referralRepository.GetManyAsync(r => r.OpportunityItemId == dto.OpportunityItemId) .ToList(); var newReferrals = _mapper.Map <List <Referral> >(dto.Referral); foreach (var nr in newReferrals) { nr.OpportunityItemId = dto.OpportunityItemId; } var comparer = new ReferralEqualityComparer(); var toBeAdded = newReferrals.Except(existingReferrals, comparer).ToList(); var same = existingReferrals.Intersect(newReferrals, comparer).ToList(); var toBeDeleted = existingReferrals.Except(same).ToList(); Referral Find(Referral referral) => existingReferrals.First(r => r.Id == referral.Id); var deleteReferrals = toBeDeleted.Select(Find).ToList(); await _referralRepository.DeleteManyAsync(deleteReferrals); await _referralRepository.CreateManyAsync(toBeAdded); var updateReferrals = same.Select(Find).ToList(); await _referralRepository.UpdateManyAsync(updateReferrals); }
public When_OpportunityService_Is_Called_To_Update_Referrals() { var httpContextAccessor = Substitute.For <IHttpContextAccessor>(); httpContextAccessor.HttpContext.Returns(new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.GivenName, "adminUserName") })) }); var config = new MapperConfiguration(c => { c.AddMaps(typeof(OpportunityMapper).Assembly); c.ConstructServicesUsing(type => type.Name.Contains("LoggedInUserEmailResolver") ? new LoggedInUserEmailResolver <ReferralDto, Domain.Models.Referral>(httpContextAccessor) : type.Name.Contains("LoggedInUserNameResolver") ? (object)new LoggedInUserNameResolver <ReferralDto, Domain.Models.Referral>(httpContextAccessor) : type.Name.Contains("UtcNowResolver") ? new UtcNowResolver <ReferralDto, Domain.Models.Referral>(new DateTimeProvider()) : null); }); var mapper = new Mapper(config); var opportunityRepository = Substitute.For <IOpportunityRepository>(); var opportunityItemRepository = Substitute.For <IRepository <OpportunityItem> >(); var provisionGapRepository = Substitute.For <IRepository <ProvisionGap> >(); var googleMapApiClient = Substitute.For <IGoogleMapApiClient>(); var opportunityPipelineReportWriter = Substitute.For <IFileWriter <OpportunityReportDto> >(); var dateTimeProvider = Substitute.For <IDateTimeProvider>(); _referralRepository = Substitute.For <IRepository <Domain.Models.Referral> >(); var opportunityService = new OpportunityService(mapper, opportunityRepository, opportunityItemRepository, provisionGapRepository, _referralRepository, googleMapApiClient, opportunityPipelineReportWriter, dateTimeProvider); var dto = new OpportunityItemDto { Referral = new List <ReferralDto> { new ReferralDto { ProviderVenueId = 1, DistanceFromEmployer = 3.5M } } }; opportunityService.UpdateReferralsAsync(dto).GetAwaiter().GetResult(); }
public async Task <int> CreateOpportunityItemAsync(OpportunityItemDto dto) { dto.OpportunityItemId = 0; var opportunityItem = _mapper.Map <OpportunityItem>(dto); opportunityItem.Town = await _googleMapApiClient.GetAddressDetailsAsync(opportunityItem.Postcode); var opportunityItemId = await _opportunityItemRepository.CreateAsync(opportunityItem); return(opportunityItemId); }
public When_OpportunityService_Is_Called_To_Create_Opportunity_Item() { var httpContextAccessor = Substitute.For <IHttpContextAccessor>(); httpContextAccessor.HttpContext.Returns(new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.GivenName, "adminUserName") })) }); var config = new MapperConfiguration(c => { c.AddMaps(typeof(OpportunityMapper).Assembly); c.ConstructServicesUsing(type => type.Name.Contains("LoggedInUserEmailResolver") ? new LoggedInUserEmailResolver <OpportunityItemDto, OpportunityItem>(httpContextAccessor) : type.Name.Contains("LoggedInUserNameResolver") ? (object)new LoggedInUserNameResolver <OpportunityItemDto, OpportunityItem>(httpContextAccessor) : type.Name.Contains("UtcNowResolver") ? new UtcNowResolver <OpportunityItemDto, OpportunityItem>(new DateTimeProvider()) : null); }); var mapper = new Mapper(config); _opportunityItemRepository = Substitute.For <IRepository <OpportunityItem> >(); _googleMapApiClient = Substitute.For <IGoogleMapApiClient>(); _googleMapApiClient.GetAddressDetailsAsync(Arg.Is <string>(s => s == "AA1 1AA")).Returns("Coventry"); var opportunityPipelineReportWriter = Substitute.For <IFileWriter <OpportunityReportDto> >(); var dateTimeProvider = Substitute.For <IDateTimeProvider>(); var opportunityRepository = Substitute.For <IOpportunityRepository>(); var provisionGapRepository = Substitute.For <IRepository <ProvisionGap> >(); var referralRepository = Substitute.For <IRepository <Domain.Models.Referral> >(); _opportunityItemRepository.CreateAsync(Arg.Any <OpportunityItem>()) .Returns(OpportunityItemId); var opportunityService = new OpportunityService(mapper, opportunityRepository, _opportunityItemRepository, provisionGapRepository, referralRepository, _googleMapApiClient, opportunityPipelineReportWriter, dateTimeProvider); var dto = new OpportunityItemDto { OpportunityId = OpportunityId, OpportunityType = OpportunityType.Referral, RouteId = 5, Postcode = "AA1 1AA", SearchRadius = 10, JobRole = "Test Title", PlacementsKnown = true, Placements = 3, SearchResultProviderCount = 15, IsSaved = true, IsSelectedForReferral = true, IsCompleted = true, EmployerFeedbackSent = true }; _result = opportunityService.CreateOpportunityItemAsync(dto).GetAwaiter().GetResult(); }