示例#1
0
        private static void VerifyDiscrepancyResolution(IDiscrepanciesService service)
        {
            // Assort
            var account = new Account
            {
                EmailAddress = "*****@*****.**",
                FirstName = "Amaury",
                LastName = "Rodriguez",
                ProviderId = (int)Domain.Engagement.Providers.ProviderType.Yahoo
            };
            var subscriber = default(Subscriber);

            var notExistingSeedDiscrepancy = SeedDiscrepancy.FromEngager(account, subscriber); 

            // Act
            var result = service.Resolve(notExistingSeedDiscrepancy).Result;

            // Assert
            Assert.IsTrue(result.Succeeded);
            Assert.AreEqual(SeedDiscrepancy.ResolvedMessage, result.Messages);
            Assert.AreEqual(notExistingSeedDiscrepancy, result.Source);

            using (var ctx = new SubscribersContext())
            {
                var provider = WD40.Domain.Engagement.Providers.Registry.Instance[notExistingSeedDiscrepancy.Account.Value.ProviderId];
                var metadata = service.GetMetadataForProviderAsync(provider.SubscriberId).Result;
                subscriber = ctx.FromStore(metadata.DatabaseName, metadata.TableName).GetSubscribers(s => s.email.Trim() == notExistingSeedDiscrepancy.EmailAddress).Result.SingleOrDefault();
                Assert.IsNotNull(subscriber);
                Assert.AreEqual(subscriber.send, 1);
            }

            // TODO: Update subscriber set Mailable = false
            subscriber.SetMailable(false);

            var notMailableSeedDiscrepancy = SeedDiscrepancy.FromEngager(account, subscriber);

            // Act
            result = service.Resolve(notMailableSeedDiscrepancy).Result;

            // Assert
            Assert.IsTrue(result.Succeeded);
            Assert.AreEqual(SeedDiscrepancy.ResolvedMessage, result.Messages);
            Assert.AreEqual(notMailableSeedDiscrepancy, result.Source);

            using (var ctx = new SubscribersContext())
            {
                var provider = WD40.Domain.Engagement.Providers.Registry.Instance[notExistingSeedDiscrepancy.Account.Value.ProviderId];
                var metadata = service.GetMetadataForProviderAsync(provider.SubscriberId).Result;
                subscriber = ctx.FromStore(metadata.DatabaseName, metadata.TableName).GetSubscribers(s => s.email.Trim() == notExistingSeedDiscrepancy.EmailAddress).Result.SingleOrDefault();
                Assert.IsNotNull(subscriber);
                Assert.AreEqual(subscriber.send, 1);

                // Clean Up
                var wasDeleted = ctx.Delete(subscriber).Result;
                Assert.IsTrue(wasDeleted);
                subscriber = ctx.GetSubscribers(s => s.email.Trim() == notExistingSeedDiscrepancy.EmailAddress).Result.SingleOrDefault();
                Assert.IsNull(subscriber);
            }
        }
示例#2
0
        private static Mock<IDiscrepanciesService> CreateFakeService()
        {
            var service = new Mock<IDiscrepanciesService>();
            
            service
                .Setup(x => x.GetMetadataForProviderAsync(It.IsAny<int>()))
                .Returns<int>(async subscriberId =>
                {
                    using (var ctx = new OenContext())
                    {
                        var linkData = await ctx.Lists.FirstOrDefaultAsync(x => x.enabled && (x.clientKey_id == subscriberId) && (x.emailCount > 0));

                        return new WD40.Domain.Engagement.Providers.Metadata
                        {
                            DatabaseName = linkData.dataBaseName,
                            TableName = linkData.tableName
                        };
                    }
                });

            service
                .Setup(x => x.GetNotMailableEngagedItemsAsync(It.IsAny<ProviderType>(), It.IsAny<int>(), It.IsAny<int>()))
                .Returns<ProviderType, int, int>(async (pId, sId, days) =>
                {
                    var result = (new SeedDiscrepancy[] { }).AsEnumerable();

                    using (var ctx = new EngagerContext())
                    {
                        var oldestDateCreated = DateTime.Today.AddDays(-days);
                        var accounts = await (from x in ctx.Accounts 
                                              where x.IsActive && (x.ProviderId == (int)pId) && (x.DateAccountCreated >= oldestDateCreated)
                                              select x).ToArrayAsync();

                        if (accounts.Any())
                        {
                            var metadata = await service.Object.GetMetadataForProviderAsync(sId);

                            using (var subscribersCtx = new SubscribersContext())
                            {
                                subscribersCtx.Database.Connection.ConnectionString += string.Format(";initial catalog={0};", metadata.DatabaseName);
                                var subscribers = subscribersCtx.FromStore(metadata.DatabaseName, metadata.TableName).GetSubscribers(subscribersCtx.AllSubscribersSpecification).Result;

                                if (subscribers.Any())
                                {
                                    result = from x in accounts
                                             join y in subscribers on x.EmailAddress equals y.email.Trim() into all
                                             from r in all.DefaultIfEmpty()
                                             where (r == null) || (r.send == 0)
                                             select SeedDiscrepancy.FromEngager(x, r);
                                }
                            }
                        }

                        return result.AsQueryable();
                    }
                });

            service
                .Setup(x => x.GetNotEngagedMailableItemsAsync(It.IsAny<ProviderType>(), It.IsAny<int>(), It.IsAny<int>()))
                .Returns<ProviderType, int, int>(async (pId, sId, days) =>
                {
                    var result = (new SeedDiscrepancy[] { }).AsEnumerable();
                    var metadata = await service.Object.GetMetadataForProviderAsync(sId);

                    using (var subscribersCtx = new SubscribersContext())
                    {
                        var subscribers = await subscribersCtx.FromStore(metadata.DatabaseName, metadata.TableName).GetSubscribers(subscribersCtx.MailableSubscribersSpecification);

                        if (subscribers.Any())
                        {
                            var oldestDateCreated = DateTime.Today.AddDays(-days);
                            using (var ctx = new EngagerContext())
                            {
                                var accounts = await (from x in ctx.Accounts
                                                      where (x.ProviderId == (int)pId) && (x.DateAccountCreated >= oldestDateCreated)
                                                      select x).ToArrayAsync();

                                result = from x in subscribers
                                         join y in accounts on x.email.Trim() equals y.EmailAddress into all
                                         from r in all.DefaultIfEmpty()
                                         where (r == null) || !r.IsActive
                                         select SeedDiscrepancy.FromWhiteDelivery(r, x);
                            }
                        }

                        return result.AsQueryable();
                    }
                });

            service
                .Setup(x => x.Resolve(It.IsAny<SeedDiscrepancy>()))
                .Returns<SeedDiscrepancy>(async sd =>
                {
                    if (!sd.IsValid)
                    {
                        return SeedDiscrepancyResolution.Failed(sd).WithMessage(SeedDiscrepancy.InvalidDiscrepancyMessage);
                    }
                    
                    var result = SeedDiscrepancyResolution.Failed(sd).WithMessage(SeedDiscrepancy.NotImplementedFeatureMessage);

                    if (sd.IsEngagerDiscrepancy)
                    {
                        using (var subscribersCtx = new SubscribersContext())
                        {
                            var provider = WD40.Domain.Engagement.Providers.Registry.Instance[sd.Account.Value.ProviderId];
                            var metadata = await service.Object.GetMetadataForProviderAsync(provider.SubscriberId);

                            if (!sd.Subscriber.HasValue)
                            {
                                try
                                {
                                    result.Succeeded = await subscribersCtx.FromStore(metadata.DatabaseName, metadata.TableName).AddSubscriber(sd);
                                    result.WithMessage(SeedDiscrepancy.ResolvedMessage);
                                }
                                catch (Exception e)
                                {
                                    result.WithMessage(e.Message);
                                }
                            }
                            else
                            {
                                try
                                {
                                    result.Succeeded = await subscribersCtx.FromStore(metadata.DatabaseName, metadata.TableName).EnableSubscriber(sd);
                                    result.WithMessage(SeedDiscrepancy.ResolvedMessage);
                                }
                                catch (Exception e)
                                {
                                    result.WithMessage(e.Message);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (!sd.Account.HasValue)
                        {
                            // TODO: Add subscriber to Engager
                            throw new NotImplementedException(result.Messages);
                        }
                        else
                        {
                            // TODO: Update account in Engager with active = true
                            throw new NotImplementedException(result.Messages);
                        }
                    }

                    return result;
                });

            return service;
        } 
示例#3
0
        private static void VerifyEngagerDiscrepancies(IDiscrepanciesService service, Mapping provider, int daysCreated)
        {
            var result = service.GetNotMailableEngagedItemsAsync(provider.ProviderId, provider.SubscriberId, daysCreated).Result;

            // Assert
            if (result.Any())
            {
                result.Take(MaxAccountsToVerify).ToList().ForEach(x =>
                {
                    if (x.Subscriber.HasValue)
                    {
                        using (var ctx = new SubscribersContext())
                        {
                            var metadata = service.GetMetadataForProviderAsync(provider.SubscriberId).Result;
                            var subscriber = ctx.FromStore(metadata.DatabaseName, metadata.TableName).GetSubscribers(s => s.subscriber_id == x.Subscriber.Value.SubscriberId).Result.SingleOrDefault();

                            Assert.IsNotNull(subscriber);
                            Assert.AreEqual(subscriber.send, 0);
                        }

                        Assert.AreEqual(x.Description, SeedDiscrepancy.NotMailableSeedMessage);
                    }
                    else
                    {
                        using (var ctx = new SubscribersContext())
                        {
                            var metadata = service.GetMetadataForProviderAsync(provider.SubscriberId).Result;
                            var subscriber = ctx.FromStore(metadata.DatabaseName, metadata.TableName).GetSubscribers(s => s.email == x.EmailAddress).Result.SingleOrDefault();

                            Assert.IsNull(subscriber);
                        }

                        Assert.AreEqual(x.Description, string.Format(SeedDiscrepancy.MissingSeedMessage, "WD"));
                    }
                });
            }
        }
示例#4
0
        public async Task<SeedDiscrepancyResolution> Resolve(SeedDiscrepancy discrepancy)
        {
            if (!discrepancy.IsValid)
            {
                return SeedDiscrepancyResolution.Failed(discrepancy).WithMessage(SeedDiscrepancy.InvalidDiscrepancyMessage);
            }

            var result = SeedDiscrepancyResolution.Failed(discrepancy).WithMessage(SeedDiscrepancy.NotImplementedFeatureMessage);

            if (discrepancy.IsEngagerDiscrepancy)
            {
                using (var subscribersCtx = new SubscribersContext())
                {
                    var provider = WD40.Domain.Engagement.Providers.Registry.Instance[discrepancy.Account.Value.ProviderId];
                    var metadata = await GetMetadataForProviderAsync(provider.SubscriberId);

                    if (!discrepancy.Subscriber.HasValue)
                    {
                        try
                        {
                            result.Succeeded = await subscribersCtx.FromStore(metadata.DatabaseName, metadata.TableName).AddSubscriber(discrepancy);
                            result.WithMessage(SeedDiscrepancy.ResolvedMessage);
                        }
                        catch (Exception e)
                        {
                            result.WithMessage(e.Message);
                        }
                    }
                    else
                    {
                        try
                        {
                            result.Succeeded = await subscribersCtx.FromStore(metadata.DatabaseName, metadata.TableName).EnableSubscriber(discrepancy);
                            result.WithMessage(SeedDiscrepancy.ResolvedMessage);
                        }
                        catch (Exception e)
                        {
                            result.WithMessage(e.Message);
                        }
                    }
                }
            }
            else
            {
                if (!discrepancy.Account.HasValue)
                {
                    // TODO: Add subscriber to Engager
                    throw new NotImplementedException(result.Messages);
                }
                else
                {
                    // TODO: Update account in Engager with active = true
                    throw new NotImplementedException(result.Messages);
                }
            }

            return result;
        }