public When_ReferralEmailService_Is_Called_To_Send_Employer_Email_With_No_Opportunity_Item_Ids()
        {
            var datetimeProvider = Substitute.For <IDateTimeProvider>();

            _backgroundProcessHistoryRepository = Substitute.For <IRepository <BackgroundProcessHistory> >();

            var mapper = Substitute.For <IMapper>();
            var opportunityItemRepository = Substitute.For <IRepository <OpportunityItem> >();

            _emailService          = Substitute.For <IEmailService>();
            _opportunityRepository = Substitute.For <IOpportunityRepository>();

            _backgroundProcessHistoryRepository.GetSingleOrDefaultAsync(
                Arg.Any <Expression <Func <BackgroundProcessHistory, bool> > >()).Returns(new BackgroundProcessHistory
            {
                Id          = 1,
                ProcessType = BackgroundProcessType.EmployerReferralEmail.ToString(),
                Status      = BackgroundProcessHistoryStatus.Pending.ToString()
            });

            _opportunityRepository
            .GetEmployerReferralsAsync(
                Arg.Any <int>(), Arg.Any <IEnumerable <int> >())
            .Returns(new ValidEmployerReferralDtoBuilder()
                     .AddSecondaryContact()
                     .Build());

            var functionLogRepository = Substitute.For <IRepository <FunctionLog> >();

            var referralEmailService = new ReferralEmailService(mapper, datetimeProvider, _emailService,
                                                                _opportunityRepository, opportunityItemRepository, _backgroundProcessHistoryRepository, functionLogRepository);

            referralEmailService.SendEmployerReferralEmailAsync(1, new List <int>(), 1, "system").GetAwaiter().GetResult();
        }
Ejemplo n.º 2
0
        public async Task Then_Send_Email_To_Employers(
            MatchingDbContext dbContext,
            IDateTimeProvider dateTimeProvider,
            MapperConfiguration mapperConfiguration,
            [Frozen] Domain.Models.Opportunity opportunity,
            [Frozen] Domain.Models.Provider provider,
            [Frozen] Domain.Models.ProviderVenue venue,
            [Frozen] BackgroundProcessHistory backgroundProcessHistory,
            [Frozen] IEmailService emailService,
            ILogger <OpportunityRepository> logger,
            ILogger <GenericRepository <BackgroundProcessHistory> > historyLogger,
            ILogger <GenericRepository <OpportunityItem> > itemLogger,
            ILogger <GenericRepository <FunctionLog> > functionLogLogger
            )
        {
            //Arrange
            backgroundProcessHistory.Status = BackgroundProcessHistoryStatus.Pending.ToString();

            await DataBuilder.SetTestData(dbContext, provider, venue, opportunity, backgroundProcessHistory);

            var mapper                = new Mapper(mapperConfiguration);
            var repo                  = new OpportunityRepository(logger, dbContext);
            var backgroundRepo        = new GenericRepository <BackgroundProcessHistory>(historyLogger, dbContext);
            var itemRepo              = new GenericRepository <OpportunityItem>(itemLogger, dbContext);
            var functionLogRepository = new GenericRepository <FunctionLog>(functionLogLogger, dbContext);

            var sut = new ReferralEmailService(mapper, dateTimeProvider, emailService, repo, itemRepo, backgroundRepo, functionLogRepository);

            //Act
            await sut.SendEmployerReferralEmailAsync(opportunity.Id, opportunity.OpportunityItem.Select(oi => oi.Id), backgroundProcessHistory.Id, "System");

            //Assert
            await emailService.Received(1).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <int?>(), Arg.Any <int?>(), Arg.Any <IDictionary <string, string> >(), Arg.Any <string>());
        }
Ejemplo n.º 3
0
        public async Task Then_Send_Email_Is_Called_With_Employer_Details(
            [Frozen] MatchingDbContext dbContext,
            IDateTimeProvider dateTimeProvider,
            [Frozen] Mapper mapper,
            [Frozen] Domain.Models.Opportunity opportunity,
            [Frozen] Domain.Models.Provider provider,
            [Frozen] Domain.Models.ProviderVenue venue,
            [Frozen] BackgroundProcessHistory backgroundProcessHistory,
            [Frozen] IEmailService emailService,
            ILogger <OpportunityRepository> logger,
            ILogger <GenericRepository <BackgroundProcessHistory> > historyLogger,
            ILogger <GenericRepository <OpportunityItem> > itemLogger,
            ILogger <GenericRepository <FunctionLog> > functionLogLogger
            )
        {
            //Arrange
            backgroundProcessHistory.Status = BackgroundProcessHistoryStatus.Pending.ToString();

            await DataBuilder.SetTestData(dbContext, provider, venue, opportunity, backgroundProcessHistory);

            var repo                  = new OpportunityRepository(logger, dbContext);
            var backgroundRepo        = new GenericRepository <BackgroundProcessHistory>(historyLogger, dbContext);
            var itemRepo              = new GenericRepository <OpportunityItem>(itemLogger, dbContext);
            var functionLogRepository = new GenericRepository <FunctionLog>(functionLogLogger, dbContext);

            var sut = new ReferralEmailService(mapper, dateTimeProvider, emailService, repo, itemRepo, backgroundRepo, functionLogRepository);

            //Act
            await sut.SendProviderReferralEmailAsync(opportunity.Id, opportunity.OpportunityItem.Select(oi => oi.Id), backgroundProcessHistory.Id, "System");

            //Assert
            await emailService.Received(4).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(),
                                                          Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Any <IDictionary <string, string> >(),
                                                          Arg.Any <string>());

            await emailService.Received(4).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(),
                                                          Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Is <IDictionary <string, string> >(tokens =>
                                                                                                 tokens.ContainsKey("employer_business_name") && tokens["employer_business_name"] == opportunity.Employer.CompanyName.ToTitleCase()),
                                                          Arg.Any <string>());

            await emailService.Received(4).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(),
                                                          Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Is <IDictionary <string, string> >(tokens =>
                                                                                                 tokens.ContainsKey("employer_contact_name") && tokens["employer_contact_name"] == opportunity.EmployerContact.ToTitleCase()),
                                                          Arg.Any <string>());

            await emailService.Received(4).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(),
                                                          Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Is <IDictionary <string, string> >(tokens =>
                                                                                                 tokens.ContainsKey("employer_contact_number") && tokens["employer_contact_number"] == opportunity.EmployerContactPhone),
                                                          Arg.Any <string>());

            await emailService.Received(4).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(),
                                                          Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Is <IDictionary <string, string> >(tokens =>
                                                                                                 tokens.ContainsKey("employer_contact_email") && tokens["employer_contact_email"] == opportunity.EmployerContactEmail),
                                                          Arg.Any <string>());
        }
Ejemplo n.º 4
0
        public async Task Then_Send_Email_Is_Called_With_Placements_List(
            MatchingDbContext dbContext,
            IDateTimeProvider dateTimeProvider,
            MapperConfiguration mapperConfiguration,
            [Frozen] Domain.Models.Opportunity opportunity,
            [Frozen] Domain.Models.Provider provider,
            [Frozen] Domain.Models.ProviderVenue venue,
            [Frozen] BackgroundProcessHistory backgroundProcessHistory,
            [Frozen] IEmailService emailService,
            ILogger <OpportunityRepository> logger,
            ILogger <GenericRepository <BackgroundProcessHistory> > historyLogger,
            ILogger <GenericRepository <OpportunityItem> > itemLogger,
            ILogger <GenericRepository <FunctionLog> > functionLogLogger
            )
        {
            //Arrange
            backgroundProcessHistory.Status = BackgroundProcessHistoryStatus.Pending.ToString();

            await DataBuilder.SetTestData(dbContext, provider, venue, opportunity, backgroundProcessHistory);

            var mapper                = new Mapper(mapperConfiguration);
            var repo                  = new OpportunityRepository(logger, dbContext);
            var backgroundRepo        = new GenericRepository <BackgroundProcessHistory>(historyLogger, dbContext);
            var itemRepo              = new GenericRepository <OpportunityItem>(itemLogger, dbContext);
            var functionLogRepository = new GenericRepository <FunctionLog>(functionLogLogger, dbContext);

            var sut = new ReferralEmailService(mapper, dateTimeProvider, emailService, repo, itemRepo, backgroundRepo, functionLogRepository);

            var itemIds = itemRepo.GetManyAsync(oi => oi.Opportunity.Id == opportunity.Id &&
                                                oi.IsSaved &&
                                                oi.IsSelectedForReferral &&
                                                !oi.IsCompleted).Select(oi => oi.Id);

            var expectedResult = await GetExpectedResult(repo, opportunity.Id, itemIds);

            //Act
            await sut.SendEmployerReferralEmailAsync(opportunity.Id, opportunity.OpportunityItem.Select(oi => oi.Id), backgroundProcessHistory.Id, "System");

            //Assert
            await emailService.Received(1).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Any <IDictionary <string, string> >(), Arg.Any <string>());

            await emailService.Received(1).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Is <IDictionary <string, string> >(tokens => tokens.ContainsKey("placements_list")), Arg.Any <string>());

            await emailService.Received(1).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Is <IDictionary <string, string> >(tokens => tokens.ContainsKey("placements_list") && tokens["placements_list"] == expectedResult),
                                                          Arg.Any <string>());
        }
Ejemplo n.º 5
0
        public When_ReferralEmailService_Is_Called_To_Send_Provider_Email()
        {
            var datetimeProvider = Substitute.For <IDateTimeProvider>();

            _backgroundProcessHistoryRepository = Substitute.For <IRepository <BackgroundProcessHistory> >();

            var mapper = Substitute.For <IMapper>();
            var opportunityItemRepository = Substitute.For <IRepository <OpportunityItem> >();

            _emailService          = Substitute.For <IEmailService>();
            _opportunityRepository = Substitute.For <IOpportunityRepository>();
            _backgroundProcessHistoryRepository.GetSingleOrDefaultAsync(
                Arg.Any <Expression <Func <BackgroundProcessHistory, bool> > >()).Returns(new BackgroundProcessHistory
            {
                Id          = 1,
                ProcessType = BackgroundProcessType.ProviderReferralEmail.ToString(),
                Status      = BackgroundProcessHistoryStatus.Pending.ToString()
            });

            _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("contact_name", out var contact))
                {
                    _contactNames[address] = contact;
                }
            });

            _opportunityRepository
            .GetProviderReferralsAsync(
                Arg.Any <int>(), Arg.Any <IEnumerable <int> >())
            .Returns(new ValidOpportunityReferralDtoListBuilder().BuildWithOneReferral());

            var functionLogRepository = Substitute.For <IRepository <FunctionLog> >();

            var itemIds = new List <int>
            {
                1
            };

            var referralEmailService = new ReferralEmailService(mapper, datetimeProvider, _emailService,
                                                                _opportunityRepository, opportunityItemRepository, _backgroundProcessHistoryRepository, functionLogRepository);

            referralEmailService.SendProviderReferralEmailAsync(1, itemIds, 1, "system").GetAwaiter().GetResult();
        }
Ejemplo n.º 6
0
        public async Task Then_Background_Process_History_Status_Is_Completed(
            [Frozen] MatchingDbContext dbContext,
            IDateTimeProvider dateTimeProvider,
            [Frozen] Mapper mapper,
            [Frozen] Domain.Models.Opportunity opportunity,
            [Frozen] Domain.Models.Provider provider,
            [Frozen] Domain.Models.ProviderVenue venue,
            [Frozen] BackgroundProcessHistory backgroundProcessHistory,
            [Frozen] IEmailService emailService,
            ILogger <OpportunityRepository> logger,
            ILogger <GenericRepository <BackgroundProcessHistory> > historyLogger,
            ILogger <GenericRepository <OpportunityItem> > itemLogger,
            ILogger <GenericRepository <FunctionLog> > functionLogLogger
            )
        {
            //Arrange
            backgroundProcessHistory.Status = BackgroundProcessHistoryStatus.Pending.ToString();

            await DataBuilder.SetTestData(dbContext, provider, venue, opportunity, backgroundProcessHistory);

            var repo                  = new OpportunityRepository(logger, dbContext);
            var backgroundRepo        = new GenericRepository <BackgroundProcessHistory>(historyLogger, dbContext);
            var itemRepo              = new GenericRepository <OpportunityItem>(itemLogger, dbContext);
            var functionLogRepository = new GenericRepository <FunctionLog>(functionLogLogger, dbContext);

            var sut = new ReferralEmailService(mapper, dateTimeProvider, emailService, repo, itemRepo, backgroundRepo, functionLogRepository);

            //Act
            await sut.SendProviderReferralEmailAsync(opportunity.Id, opportunity.OpportunityItem.Select(oi => oi.Id), backgroundProcessHistory.Id, "System");

            //Assert
            await emailService.Received(4).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Any <IDictionary <string, string> >(), Arg.Any <string>());

            var processStatus = dbContext.BackgroundProcessHistory
                                .FirstOrDefault(history => history.Id == backgroundProcessHistory.Id)
                                ?.Status;

            processStatus.Should().NotBe(BackgroundProcessHistoryStatus.Pending.ToString());
            processStatus.Should().NotBe(BackgroundProcessHistoryStatus.Processing.ToString());
            processStatus.Should().Be(BackgroundProcessHistoryStatus.Complete.ToString());
        }
Ejemplo n.º 7
0
        //[InlineData("Test", "Test")]
        public async Task AND_Secondary_Contact_Name_or_Email_Is_Invalid_Then_Send_Email_Is_NOT_Called(
            string secondaryContactName,
            string secondaryContactEmail,
            [Frozen] MatchingDbContext dbContext,
            IDateTimeProvider dateTimeProvider,
            [Frozen] Mapper mapper,
            [Frozen] Domain.Models.Opportunity opportunity,
            [Frozen] Domain.Models.Provider provider,
            [Frozen] Domain.Models.ProviderVenue venue,
            [Frozen] BackgroundProcessHistory backgroundProcessHistory,
            [Frozen] IEmailService emailService,
            ILogger <OpportunityRepository> logger,
            ILogger <GenericRepository <BackgroundProcessHistory> > historyLogger,
            ILogger <GenericRepository <OpportunityItem> > itemLogger,
            ILogger <GenericRepository <FunctionLog> > functionLogLogger
            )
        {
            //Arrange
            backgroundProcessHistory.Status = BackgroundProcessHistoryStatus.Pending.ToString();

            provider.SecondaryContact      = secondaryContactName;
            provider.SecondaryContactEmail = secondaryContactEmail;

            await DataBuilder.SetTestData(dbContext, provider, venue, opportunity, backgroundProcessHistory);

            var repo                  = new OpportunityRepository(logger, dbContext);
            var backgroundRepo        = new GenericRepository <BackgroundProcessHistory>(historyLogger, dbContext);
            var itemRepo              = new GenericRepository <OpportunityItem>(itemLogger, dbContext);
            var functionLogRepository = new GenericRepository <FunctionLog>(functionLogLogger, dbContext);

            var sut = new ReferralEmailService(mapper, dateTimeProvider, emailService, repo, itemRepo, backgroundRepo, functionLogRepository);

            //Act
            await sut.SendProviderReferralEmailAsync(opportunity.Id, opportunity.OpportunityItem.Select(oi => oi.Id), backgroundProcessHistory.Id, "System");

            //Assert
            await emailService.Received(2).SendEmailAsync(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <int?>(), Arg.Any <int?>(),
                                                          Arg.Is <IDictionary <string, string> >(tokens => tokens.ContainsKey("employer_business_name")),
                                                          Arg.Any <string>());
        }
Ejemplo n.º 8
0
        public When_ReferralEmailService_Is_Called_To_Send_Multiple_Provider_Emails_And_No_Remaining_Referrals_With_ProvisionGaps()
        {
            var httpContextAccessor = Substitute.For <IHttpContextAccessor>();

            httpContextAccessor.HttpContext.Returns(new DefaultHttpContext
            {
                User = new ClaimsPrincipal(new ClaimsIdentity(new[]
                {
                    new Claim(ClaimTypes.GivenName, "TestUser")
                }))
            });

            var dateTimeProvider = Substitute.For <IDateTimeProvider>();

            dateTimeProvider.UtcNow().Returns(new DateTime(2019, 1, 1));

            var backgroundProcessHistoryRepo = Substitute.For <IRepository <BackgroundProcessHistory> >();
            var emailService    = Substitute.For <IEmailService>();
            var opportunityRepo = Substitute.For <IOpportunityRepository>();

            var config = new MapperConfiguration(c =>
            {
                c.AddMaps(typeof(OpportunityMapper).Assembly);
                c.ConstructServicesUsing(type =>
                                         type.Name.Contains("LoggedInUserEmailResolver")
                        ?
                                         new LoggedInUserEmailResolver <OpportunityItemIsSelectedForCompleteDto, OpportunityItem>(
                                             httpContextAccessor)
                        : type.Name.Contains("LoggedInUserNameResolver")
                            ? (object)new
                                         LoggedInUserNameResolver <OpportunityItemIsSelectedForCompleteDto, OpportunityItem>(
                                             httpContextAccessor)
                            : type.Name.Contains("UtcNowResolver")
                                ? new UtcNowResolver <OpportunityItemIsSelectedWithUsernameForCompleteDto, OpportunityItem>(
                                             dateTimeProvider)
                                :
                                         null);
            });
            var mapper = new Mapper(config);

            var opportunityItems = new ValidOpportunityItemListBuilder().Build();

            _opportunityItemRepository = Substitute.For <IRepository <OpportunityItem> >();
            _opportunityItemRepository.GetManyAsync(Arg.Any <Expression <Func <OpportunityItem, bool> > >())
            .Returns(opportunityItems
                     .AsQueryable());

            opportunityRepo.GetProviderReferralsAsync(Arg.Any <int>(), Arg.Any <IEnumerable <int> >())
            .Returns(new ValidOpportunityReferralDtoListBuilder()
                     .BuildWithMultipleReferrals());

            backgroundProcessHistoryRepo.GetSingleOrDefaultAsync(Arg.Any <Expression <Func <BackgroundProcessHistory, bool> > >()).Returns(new BackgroundProcessHistory
            {
                Id     = 1,
                Status = BackgroundProcessHistoryStatus.Pending.ToString()
            });

            var functionLogRepository = Substitute.For <IRepository <FunctionLog> >();

            var itemIds = opportunityItems
                          .Where(oi => oi.IsSaved && oi.IsSelectedForReferral)
                          .Select(oi => oi.Id)
                          .ToList();

            var referralService = new ReferralEmailService(mapper, dateTimeProvider, emailService,
                                                           opportunityRepo, _opportunityItemRepository, backgroundProcessHistoryRepo, functionLogRepository);

            referralService.SendProviderReferralEmailAsync(1, itemIds, 1, httpContextAccessor.HttpContext.User.GetUserName()).GetAwaiter().GetResult();
        }