示例#1
0
        public async Task ShouldNofityNewConversation()
        {
            // Arrange
            var fbChange = new FbHookChange {
                Value = new FbHookChangeValue {
                    ThreadId = "original_conversation_id"
                }
            };
            var fbMessage = new FbMessage {
                Id = "fb_1", Content = "Test_Message", SenderId = "user_1", ReceiverId = "user_2", SendTime = DateTime.UtcNow
            };
            var sender = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };
            var receiver = new SocialUser {
                Id = 2, OriginalId = "user_2"
            };
            IDependencyResolver dependencyResolver = MockDependecyResolverForTestingCreateConversation(fbChange, fbMessage, sender, receiver).Object;
            var strategy = new NewMessageStrategy(dependencyResolver);

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

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

            // Assert
            Assert.Equal(1, processResult.NewConversations.Count());
            Assert.Equal(0, processResult.UpdatedConversations.Count());
            Assert.Equal(0, processResult.NewMessages.Count());
        }
示例#2
0
        public async Task ShouldUpdateConversatonAndSaveChanges()
        {
            // Arrange
            var fbChange = new FbHookChange {
                Value = new FbHookChangeValue {
                    ThreadId = "original_conversation_id"
                }
            };
            var fbMessage = new FbMessage {
                Id = "fb_1", Content = "Test_Message", SenderId = "user_1", ReceiverId = "user_2", SendTime = DateTime.UtcNow
            };
            var sender = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };
            var receiver = new SocialUser {
                Id = 2, OriginalId = "user_2"
            };
            var conversation = new Conversation {
                OriginalId = fbChange.Value.ThreadId
            };

            Mock <IDependencyResolver> dependencyResolverMock = MockDependecyResolverForTestingUpdateConversation(conversation, fbChange, fbMessage, sender, receiver);
            var conversationServiceMock = new Mock <IConversationService>();

            // If we can find a un-closed conversation, then we will add the new message to un-closed conversation.
            conversationServiceMock.Setup(t => t.GetUnClosedConversation(fbChange.Value.ThreadId)).Returns(conversation);
            dependencyResolverMock.Setup(t => t.Resolve <IConversationService>()).Returns(conversationServiceMock.Object);
            var strategy       = new NewMessageStrategy(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", IfConvertMessageToConversation = true, SocialUser = new SocialUser {
                    Id = 3
                }
            };

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

            // Assert
            conversationServiceMock.Verify(t => t.UpdateAsync(It.IsAny <Conversation>()), "Should update conversation to db.");
            uowMock.Verify(t => t.SaveChangesAsync(), "Should save changes.");
        }
示例#3
0
        public async Task ShouldIngoreDuplicatedMessages()
        {
            // Arrange
            var fbChange = new FbHookChange
            {
                Value = new FbHookChangeValue {
                    ThreadId = "th_1"
                }
            };
            var fbClientMock = new Mock <IFbClient>();

            fbClientMock.Setup(t => t.GetMessagesFromConversationId("token", "th_1", 10)).ReturnsAsync(
                new List <FbMessage>
            {
                new FbMessage {
                    Id = "fb_1", SenderId = "user_1", ReceiverId = "user_2"
                }
            });
            var messageServiceMock = new Mock <IMessageService>();

            messageServiceMock.Setup(t => t.FindAll()).Returns(new List <Message>
            {
                new Message {
                    Source = MessageSource.FacebookMessage, OriginalId = "fb_1"
                }                                                                   // duplicate message
            }.AsQueryable());

            var dependencyResolverMock = new Mock <IDependencyResolver>();

            dependencyResolverMock.Setup(t => t.Resolve <IFbClient>()).Returns(fbClientMock.Object);
            dependencyResolverMock.Setup(t => t.Resolve <IMessageService>()).Returns(messageServiceMock.Object);

            var strategy      = new NewMessageStrategy(dependencyResolverMock.Object);
            var socialAccount = new SocialAccount {
                Token = "token", IfConvertMessageToConversation = true
            };

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

            // Assert
            Assert.False(processResult.NewMessages.Any());
            Assert.False(processResult.NewConversations.Any());
            Assert.False(processResult.UpdatedConversations.Any());
        }
示例#4
0
        public async Task ShouldIgnore_IfDisabledConvertMessageToConversation()
        {
            // Arrange
            var dependencyResolverMock = new Mock <IDependencyResolver>();
            var strategy      = new NewMessageStrategy(dependencyResolverMock.Object);
            var socialAccount = new SocialAccount
            {
                IfConvertMessageToConversation = false
            };

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

            // Assert
            Assert.False(processResult.NewMessages.Any());
            Assert.False(processResult.NewConversations.Any());
            Assert.False(processResult.UpdatedConversations.Any());
        }
示例#5
0
        public async Task ShouldAddMessageToUnClosedConversation()
        {
            // Arrange
            var fbChange = new FbHookChange {
                Value = new FbHookChangeValue {
                    ThreadId = "original_conversation_id"
                }
            };
            var fbMessage = new FbMessage {
                Id = "fb_1", Content = "Test_Message", SenderId = "user_1", ReceiverId = "user_2", SendTime = DateTime.UtcNow
            };
            var sender = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };
            var receiver = new SocialUser {
                Id = 2, OriginalId = "user_2"
            };
            var conversation = new Conversation {
                OriginalId = fbChange.Value.ThreadId
            };
            IDependencyResolver dependencyResolver = MockDependecyResolverForTestingUpdateConversation(conversation, fbChange, fbMessage, sender, receiver).Object;
            var strategy = new NewMessageStrategy(dependencyResolver);

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

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

            // Assert
            var message = processResult.UpdatedConversations.First().Messages.FirstOrDefault(t => t.OriginalId == fbMessage.Id);

            Assert.NotNull(message);
            Assert.Equal(MessageSource.FacebookMessage, message.Source);
            Assert.Equal(fbMessage.Id, message.OriginalId);
            Assert.Equal(sender.Id, message.SenderId);
            Assert.Equal(receiver.Id, message.ReceiverId);
            Assert.Equal(fbMessage.Content, message.Content);
        }
示例#6
0
        public void ShouldNotMatchStrategy()
        {
            // Arrange
            var dependencyResolverMock = new Mock <IDependencyResolver>();
            var strategy     = new NewMessageStrategy(dependencyResolverMock.Object);
            var fbHookChange = new FbHookChange
            {
                Field = "post",
                Value = new FbHookChangeValue
                {
                    ThreadId = "123"
                }
            };

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

            // Assert
            Assert.False(isMatch);
        }
示例#7
0
        public async Task ShouldUpdateConversatonWhenAddNewMessageToUnClosedConversation()
        {
            // Arrange
            var fbChange = new FbHookChange {
                Value = new FbHookChangeValue {
                    ThreadId = "original_conversation_id"
                }
            };
            var fbMessage = new FbMessage {
                Id = "fb_1", Content = "Test_Message", SenderId = "user_1", ReceiverId = "user_2", SendTime = DateTime.UtcNow
            };
            var sender = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };
            var receiver = new SocialUser {
                Id = 2, OriginalId = "user_2"
            };
            var conversation = new Conversation {
                OriginalId = fbChange.Value.ThreadId
            };
            IDependencyResolver dependencyResolver = MockDependecyResolverForTestingUpdateConversation(conversation, fbChange, fbMessage, sender, receiver).Object;
            var strategy = new NewMessageStrategy(dependencyResolver);

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

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

            // Assert
            Assert.Equal(1, processResult.UpdatedConversations.Count());
            Assert.Equal(false, conversation.IfRead);
            Assert.Equal(ConversationStatus.PendingInternal, conversation.Status);
            Assert.Equal(sender.Id, conversation.LastMessageSenderId);
            Assert.Equal(fbMessage.SendTime, conversation.LastMessageSentTime);
        }
示例#8
0
        public async Task ShouldAddMessageWhenCreateNewConversation()
        {
            // Arrange
            var fbChange = new FbHookChange {
                Value = new FbHookChangeValue {
                    ThreadId = "original_conversation_id"
                }
            };
            var fbMessage = new FbMessage {
                Id = "fb_1", Link = "http://test.com", Content = "Test_Message", SenderId = "user_1", ReceiverId = "user_2", SendTime = DateTime.UtcNow
            };
            var sender = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };
            var receiver = new SocialUser {
                Id = 2, OriginalId = "user_2"
            };
            IDependencyResolver dependencyResolver = MockDependecyResolverForTestingCreateConversation(fbChange, fbMessage, sender, receiver).Object;
            var strategy = new NewMessageStrategy(dependencyResolver);

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

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

            // Assert
            var messages = processResult.NewConversations.First().Messages;

            Assert.Equal(1, messages.Count());
            var message = messages.First();

            Assert.Equal(MessageSource.FacebookMessage, message.Source);
            Assert.Equal(fbMessage.Id, message.OriginalId);
            Assert.Equal(sender.Id, message.SenderId);
            Assert.Equal(receiver.Id, message.ReceiverId);
            Assert.Equal(fbMessage.Content, message.Content);
        }
示例#9
0
        public async Task ShouldSetValueForNewConversation()
        {
            // Arrange
            var fbChange = new FbHookChange {
                Value = new FbHookChangeValue {
                    ThreadId = "original_conversation_id"
                }
            };
            var fbMessage = new FbMessage {
                Id = "fb_1", Content = "Test_Message", SenderId = "user_1", ReceiverId = "user_2", SendTime = DateTime.UtcNow
            };
            var sender = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };
            var receiver = new SocialUser {
                Id = 2, OriginalId = "user_2"
            };
            IDependencyResolver dependencyResolver = MockDependecyResolverForTestingCreateConversation(fbChange, fbMessage, sender, receiver).Object;
            var strategy = new NewMessageStrategy(dependencyResolver);

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

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

            // Assert
            var converssation = processResult.NewConversations.First();

            Assert.Equal(ConversationSource.FacebookMessage, converssation.Source);
            Assert.Equal(ConversationStatus.New, converssation.Status);
            Assert.Equal("original_conversation_id", converssation.OriginalId);
            Assert.Equal(ConversationPriority.Normal, converssation.Priority);
            Assert.Equal(1, converssation.LastMessageSenderId);
            Assert.Equal(fbMessage.SendTime, converssation.LastMessageSentTime);
            Assert.Equal("Test_Message", converssation.Subject);
        }
示例#10
0
        public async Task ShouldNotUpdateLastMessageIfMessageIsOlderThanExistingMessage()
        {
            // Arrange
            var fbChange = new FbHookChange {
                Value = new FbHookChangeValue {
                    ThreadId = "original_conversation_id"
                }
            };
            var fbMessage = new FbMessage {
                Id = "fb_1", Content = "Test_Message", SenderId = "user_1", ReceiverId = "user_2", SendTime = new DateTime(1999, 1, 1, 0, 0, 0, DateTimeKind.Utc)
            };
            var sender = new SocialUser {
                Id = 1, OriginalId = "user_1"
            };
            var receiver = new SocialUser {
                Id = 2, OriginalId = "user_2"
            };
            var conversation = new Conversation {
                OriginalId = fbChange.Value.ThreadId, LastMessageSenderId = 888, LastMessageSentTime = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc)
            };
            IDependencyResolver dependencyResolver = MockDependecyResolverForTestingUpdateConversation(conversation, fbChange, fbMessage, sender, receiver).Object;
            var strategy = new NewMessageStrategy(dependencyResolver);

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

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

            // Assert
            Assert.Equal(888, conversation.LastMessageSenderId);
            Assert.Equal(new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc), conversation.LastMessageSentTime);
        }