public async Task ShouldIgnoreDuplicatedMessage()
        {
            // Arrange
            var fbHookChange = MakeFbHootChangeForComment();
            var fbComment    = MakeFbComment();
            var sender       = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };

            var dependencyResolverMock = MockDependencyResolver(fbHookChange, fbComment, sender);
            var messageServiceMock     = new Mock <IMessageService>();

            // make duplicate message
            messageServiceMock.Setup(t => t.FindAll()).Returns(new List <Message> {
                new Message {
                    OriginalId = fbComment.id
                }
            }.AsQueryable());
            dependencyResolverMock.Setup(t => t.Resolve <IMessageService>()).Returns(messageServiceMock.Object);
            var strategy      = new NewCommentStrategy(dependencyResolverMock.Object);
            var socialAccount = new SocialAccount {
                Token = "token", IfConvertVisitorPostToConversation = true
            };

            // Act
            var processResult = await strategy.Process(socialAccount, fbHookChange);

            // Assert
            Assert.False(processResult.NewMessages.Any());
            Assert.False(processResult.NewConversations.Any());
            Assert.False(processResult.UpdatedConversations.Any());
        }
        public async Task ShouldSetParentForComment()
        {
            // Arrange
            var fbHookChange = MakeFbHootChangeForComment();
            var fbComment    = MakeFbComment();

            fbComment.parent = null;
            var sender = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };

            var dependencyResolverMock = MockDependencyResolver(fbHookChange, fbComment, sender);
            var messageServiceMock     = new Mock <IMessageService>();

            // mock parent data
            messageServiceMock.Setup(t => t.FindByOriginalId(MessageSource.FacebookPost, fbComment.PostId)).Returns(new Message {
                Id = 111, SenderId = 222
            });
            dependencyResolverMock.Setup(t => t.Resolve <IMessageService>()).Returns(messageServiceMock.Object);
            var strategy = new NewCommentStrategy(dependencyResolverMock.Object);

            strategy.UnitOfWorkManager = MockUnitOfWorkManager().Object;
            var socialAccount = new SocialAccount {
                Token = "token", IfConvertVisitorPostToConversation = true
            };

            // Act
            var processResult = await strategy.Process(socialAccount, fbHookChange);

            // Assert
            var message = processResult.UpdatedConversations.First().Messages.First(t => t.OriginalId == "comment_1");

            Assert.Equal(111, message.ParentId);
            Assert.Equal(222, message.ReceiverId);
        }
        public async Task ShouldCreateMessageForComment()
        {
            // Arrange
            var fbHookChange = MakeFbHootChangeForComment();
            var fbComment    = MakeFbComment();
            var sender       = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };

            var dependencyResolverMock = MockDependencyResolver(fbHookChange, fbComment, sender);
            var strategy = new NewCommentStrategy(dependencyResolverMock.Object);

            strategy.UnitOfWorkManager = MockUnitOfWorkManager().Object;
            var socialAccount = new SocialAccount {
                Token = "token", IfConvertVisitorPostToConversation = true
            };

            // Act
            var processResult = await strategy.Process(socialAccount, fbHookChange);

            // Assert
            var message = processResult.UpdatedConversations.First().Messages.First(t => t.OriginalId == "comment_1");

            Assert.NotNull(message);
            Assert.Equal(MessageSource.FacebookPostComment, message.Source);
            Assert.Equal(fbComment.id, message.OriginalId);
            Assert.Equal(sender.Id, message.SenderId);
            Assert.Equal(fbComment.message, message.Content);
        }
        public async Task ShouldUpdateConversation()
        {
            // Arrange
            var fbHookChange = MakeFbHootChangeForComment();
            var fbComment    = MakeFbComment();
            var sender       = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };

            var dependencyResolverMock = MockDependencyResolver(fbHookChange, fbComment, sender);
            var strategy = new NewCommentStrategy(dependencyResolverMock.Object);

            strategy.UnitOfWorkManager = MockUnitOfWorkManager().Object;
            var socialAccount = new SocialAccount {
                Token = "token", IfConvertVisitorPostToConversation = true
            };

            // Act
            var processResult = await strategy.Process(socialAccount, fbHookChange);

            // Assert
            var conversation = processResult.UpdatedConversations.First();

            Assert.NotNull(conversation);
            Assert.Equal(sender.Id, conversation.LastMessageSenderId);
            Assert.Equal(fbComment.created_time, conversation.LastMessageSentTime);
            Assert.Equal(ConversationStatus.PendingInternal, conversation.Status);
        }
        public async Task ShouldNotifyNewMessage()
        {
            // Arrange
            var fbHookChange = MakeFbHootChangeForComment();
            var fbComment    = MakeFbComment();
            var sender       = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };

            var dependencyResolverMock = MockDependencyResolver(fbHookChange, fbComment, sender);
            var strategy = new NewCommentStrategy(dependencyResolverMock.Object);

            strategy.UnitOfWorkManager = MockUnitOfWorkManager().Object;
            var socialAccount = new SocialAccount {
                Token = "token", IfConvertVisitorPostToConversation = true
            };

            // Act
            var processResult = await strategy.Process(socialAccount, fbHookChange);

            // Assert
            Assert.Equal(0, processResult.NewConversations.Count());
            Assert.Equal(1, processResult.UpdatedConversations.Count());
            Assert.Equal(1, processResult.NewMessages.Count());
        }
        public void ShouldNotMatchStrategy()
        {
            // Arrange
            var dependencyResolverMock = new Mock <IDependencyResolver>();
            var strategy     = new NewCommentStrategy(dependencyResolverMock.Object);
            var fbHookChange = new FbHookChange
            {
                Field = "feed",
                Value = new FbHookChangeValue
                {
                    Item   = "post",
                    PostId = "post_1",
                    Verb   = "add"
                }
            };

            // Act
            bool isMatch = strategy.IsMatch(fbHookChange);

            // Assert
            Assert.False(isMatch);
        }
        public async Task ShouldUpdateAndSaveChanges()
        {
            // Arrange
            var fbHookChange = MakeFbHootChangeForComment();
            var fbComment    = MakeFbComment();
            var sender       = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };

            var dependencyResolverMock  = MockDependencyResolver(fbHookChange, fbComment, sender);
            var conversationServiceMock = new Mock <IConversationService>();

            conversationServiceMock.Setup(t => t.FindAll()).Returns(new List <Conversation>
            {
                new Conversation {
                    OriginalId = fbComment.PostId
                }
            }.AsQueryable());
            dependencyResolverMock.Setup(t => t.Resolve <IConversationService>()).Returns(conversationServiceMock.Object);
            var strategy       = new NewCommentStrategy(dependencyResolverMock.Object);
            var uowMock        = new Mock <IUnitOfWork>();
            var uowManagerMock = new Mock <IUnitOfWorkManager>();

            uowManagerMock.Setup(t => t.Current).Returns(uowMock.Object);
            strategy.UnitOfWorkManager = uowManagerMock.Object;
            var socialAccount = new SocialAccount {
                Token = "token", IfConvertVisitorPostToConversation = true
            };

            // Act
            var processResult = await strategy.Process(socialAccount, fbHookChange);

            // Assert
            conversationServiceMock.Verify(t => t.UpdateAsync(It.IsAny <Conversation>()), "Should update conversation to db.");
            uowMock.Verify(t => t.SaveChangesAsync(), "Should save changes.");
        }
        public async Task ShouldUpdateConversationToVisibleForWallPost()
        {
            // Arrange
            var fbHookChange = MakeFbHootChangeForComment();
            var fbComment    = MakeFbComment();
            var sender       = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };

            var dependencyResolverMock  = MockDependencyResolver(fbHookChange, fbComment, sender);
            var conversationServiceMock = new Mock <IConversationService>();

            conversationServiceMock.Setup(t => t.FindAll()).Returns(new List <Conversation>
            {
                new Conversation {
                    OriginalId = fbComment.PostId,
                    Source     = ConversationSource.FacebookWallPost,
                    IsHidden   = true
                }
            }.AsQueryable());
            dependencyResolverMock.Setup(t => t.Resolve <IConversationService>()).Returns(conversationServiceMock.Object);
            var strategy = new NewCommentStrategy(dependencyResolverMock.Object);

            strategy.UnitOfWorkManager = MockUnitOfWorkManager().Object;
            var socialAccount = new SocialAccount {
                Token = "token", IfConvertVisitorPostToConversation = true
            };

            // Act
            var processResult = await strategy.Process(socialAccount, fbHookChange);

            // Assert
            var conversation = processResult.UpdatedConversations.First();

            Assert.False(conversation.IsHidden);
        }