public When_ProviderFeedBackService_Is_Called_To_Send_Employer_Feedback_Emails_To_Primary_Contact_Only( ProviderFeedbackFixture testFixture) { _testFixture = testFixture; _dateTimeProvider = Substitute.For <IDateTimeProvider>(); _dateTimeProvider .UtcNow() .Returns(new DateTime(2019, 12, 13)); _dateTimeProvider .GetNthWorkingDayDate(Arg.Any <DateTime>(), Arg.Any <int>(), Arg.Any <IList <DateTime> >()) .Returns(new DateTime(2019, 12, 13)); _emailService = Substitute.For <IEmailService>(); _opportunityRepository = Substitute.For <IOpportunityRepository>(); _opportunityRepository .GetReferralsForProviderFeedbackAsync(Arg.Any <DateTime>()) .Returns(new ValidProviderFeedbackDtoListBuilder() .Build()); var providerFeedbackService = new ProviderFeedbackService( _testFixture.Configuration, _testFixture.Logger, _emailService, _testFixture.BankHolidayRepository, _opportunityRepository, _dateTimeProvider); _result = providerFeedbackService.SendProviderFeedbackEmailsAsync("TestUser").GetAwaiter().GetResult(); }
public When_ProviderFeedbackService_Is_Called_To_Send_Provider_Feedback_Emails_When_ProviderFeedbackEmailsEnabled_Is_False( ProviderFeedbackFixture testFixture) { _dateTimeProvider = Substitute.For <IDateTimeProvider>(); _emailService = Substitute.For <IEmailService>(); _bankHolidayRepository = Substitute.For <IRepository <BankHoliday> >(); _opportunityRepository = Substitute.For <IOpportunityRepository>(); _opportunityRepository.GetReferralsForProviderFeedbackAsync(Arg.Any <DateTime>()) .Returns(new ValidProviderFeedbackDtoListBuilder().Build()); testFixture.Configuration.ProviderFeedbackEmailsEnabled = false; var providerFeedbackService = new ProviderFeedbackService( testFixture.Configuration, testFixture.Logger, _emailService, _bankHolidayRepository, _opportunityRepository, _dateTimeProvider); _result = providerFeedbackService .SendProviderFeedbackEmailsAsync("TestUser") .GetAwaiter().GetResult(); }
public When_ProviderFeedBackService_Is_Called_To_Send_Employer_Feedback_Emails_With_Single_Provider( ProviderFeedbackFixture testFixture) { _testFixture = testFixture; _dateTimeProvider = Substitute.For <IDateTimeProvider>(); _dateTimeProvider .UtcNow() .Returns(new DateTime(2019, 12, 13)); _dateTimeProvider .GetNthWorkingDayDate(Arg.Any <DateTime>(), Arg.Any <int>(), Arg.Any <IList <DateTime> >()) .Returns(new DateTime(2019, 12, 13)); _emailService = Substitute.For <IEmailService>(); _emailService .When(x => x.SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <int?>(), Arg.Any <int?>(), Arg.Any <IDictionary <string, string> >(), Arg.Any <string>())) .Do(x => { var address = x.ArgAt <string>(1); var tokens = x.Arg <Dictionary <string, string> >(); if (tokens.TryGetValue("other_email_details", out var contact)) { _otherEmails[address] = contact; } }); _opportunityRepository = Substitute.For <IOpportunityRepository>(); _opportunityRepository .GetReferralsForProviderFeedbackAsync(Arg.Any <DateTime>()) .Returns(new ValidProviderFeedbackDtoListBuilder() .AddSecondaryContact() .Build()); var providerFeedbackService = new ProviderFeedbackService( _testFixture.Configuration, _testFixture.Logger, _emailService, _testFixture.BankHolidayRepository, _opportunityRepository, _dateTimeProvider); _result = providerFeedbackService.SendProviderFeedbackEmailsAsync("TestUser").GetAwaiter().GetResult(); }
public async Task <int> SendProviderFeedbackEmailsAsync(string userName) { try { var numberOfEmailsSent = 0; if (!_configuration.ProviderFeedbackEmailsEnabled || !IsNthWorkingDay(_configuration.ProviderFeedbackWorkingDayInMonth)) { _logger.LogInformation( "Provider feedback service exited because emails not enabled or today is not a valid day for processing."); return(numberOfEmailsSent); } var previousMonthDate = _dateTimeProvider.UtcNow().AddMonths(-1); var previousMonth = previousMonthDate.ToString("MMMM"); var referrals = await _opportunityRepository.GetReferralsForProviderFeedbackAsync(previousMonthDate); var referralsGroupedByProvider = referrals .GroupBy(r => r.ProviderId) .ToDictionary(r => r.Key, r => r.ToList()); foreach (var(_, value) in referralsGroupedByProvider) { var provider = value.First(); var tokens = CreateTokens(value, previousMonth); var secondaryContactEmailDetails = new StringBuilder(); if (ShouldSendSecondaryEmail(provider)) { secondaryContactEmailDetails.Append("We also sent this email to "); secondaryContactEmailDetails.Append($"{provider.SecondaryContact} "); secondaryContactEmailDetails.Append( $"who we have as {provider.ProviderDisplayName}’s secondary contact for industry placements. "); secondaryContactEmailDetails.AppendLine("Please coordinate your response with them."); } tokens["other_email_details"] = secondaryContactEmailDetails.ToString(); numberOfEmailsSent += await SendEmailsAsync(provider.PrimaryContactEmail, tokens, userName); if (ShouldSendSecondaryEmail(provider)) { var primaryContactEmailDetails = new StringBuilder(); primaryContactEmailDetails.Append("We also sent this email to "); primaryContactEmailDetails.Append($"{provider.PrimaryContact} "); primaryContactEmailDetails.Append( $"who we have as {provider.ProviderDisplayName}’s primary contact for industry placements. "); primaryContactEmailDetails.AppendLine("Please coordinate your response with them."); tokens["contact_name"] = provider.SecondaryContact?.Trim(); tokens["other_email_details"] = primaryContactEmailDetails.ToString(); numberOfEmailsSent += await SendEmailsAsync(provider.SecondaryContactEmail, tokens, userName); } } return(numberOfEmailsSent); } catch (Exception ex) { var errorMessage = $"Error sending provider feedback emails. {ex.Message} "; _logger.LogError(ex, errorMessage); throw; } }