public void CreateConversationMessagesViewModelTest()
        {
            for (int i = 0; i < this.conversationMessages.Count; i++)
            {
                for (int j = 0; j < this.conversationMessages[i].Count; j++)
                {

                    MockServiceProxy serviceProxy = new MockServiceProxy() { Messages = this.conversationMessages[i][j].m_Item2};
                    MockDataContextWrapper dataContext = new MockDataContextWrapper(new MockDatabase() { });
                    MockUserSettings userSettings = new MockUserSettings();
                    userSettings.Save(owners[i]);

                    UserModel recipient = null;
                    foreach (UserModel user in this.conversationMessages[i][j].m_Item1.ConversationParticipants)
                    {
                        if (!user.Equals(userSettings.Me))
                        {
                            recipient = user;
                        }
                    }

                    ConversationMessagesViewModel messages = new ConversationMessagesViewModel(serviceProxy, dataContext, userSettings, this.conversationMessages[i][j].m_Item1.ConversationId, recipient);
                    NotifyPropertyChangedTester propertyChangedTester = new NotifyPropertyChangedTester(messages);
                    NotifyCollectionChangedTester<MessageModel> collectionChangedTester = new NotifyCollectionChangedTester<MessageModel>(messages.Messages);
                    messages.LoadMessagesForConversations();

                    Assert.AreEqual(1, propertyChangedTester.Changes.Count, "IsLoaded property changed event was not generated");
                    propertyChangedTester.AssertChange(0, "IsLoading");

                    Assert.AreEqual(this.conversationMessages[i][j].m_Item2.Count, collectionChangedTester.Count, "Number of messages in notify collection changed doesn't match");
                }
            }
        }
        public void HandlePushNotificationExistingConversationTest()
        {
            List<List<ConversationModel>>  conversations = new List<List<ConversationModel>>();
            List<UserModel>  owners = new List<UserModel>();
            this.LoadConversations(conversations, owners);

            for (int i = 0; i < conversations.Count; i++)
            {
                if (conversations[i].Count == 0)
                {
                    return;
                }

                MockServiceProxy serviceProxy = new MockServiceProxy() { Conversations = conversations[i] };
                MockUserSettings userSettings = new MockUserSettings();
                MockDataContextWrapper dataContextWrapper = new MockDataContextWrapper(new MockDatabase() { Conversations = conversations[i] });
                userSettings.Save(owners[i]);

                using (AllConversationsViewModel allConversations = new AllConversationsViewModel(serviceProxy, userSettings, dataContextWrapper))
                {
                    allConversations.LoadInitialConversations();

                    NotifyCollectionChangedTester<ConversationModel> collectionChangedTester = new NotifyCollectionChangedTester<ConversationModel>(allConversations.Conversations);
                    long existingConversationId = conversations[i].Count > 0 ? conversations[i][0].ConversationId : long.MaxValue;
                    int existingConversationUserId = -1;

                    foreach (UserModel user in conversations[i][0].ConversationParticipants)
                    {
                        if (user.Id != owners[i].Id)
                        {
                            existingConversationUserId = user.Id;
                        }
                    }

                    foreach (ConversationModel conversation in conversations[i])
                    {
                        foreach (UserModel user in conversation.ConversationParticipants)
                        {
                            if (user.Id != owners[i].Id)
                            {
                                Assert.AreEqual(conversation, allConversations.GetConversationFromConversationId(conversation.ConversationId), "Conversation cannot be retrieved by guid");
                                Assert.AreEqual(conversation, allConversations.GetConversation(user.Id), "Conversation cannot be retrieved by recipient");
                            }
                        }
                    }

                    PushNotificationEvent pushEvent = new PushNotificationEvent(this, (long)2000, existingConversationId, "test", DateTime.Now.Ticks, "HandlePushNotificationExistingConversationTest" + i.ToString(), existingConversationUserId);
                    Messenger.Default.Send<PushNotificationEvent>(pushEvent);

                    Assert.AreEqual(collectionChangedTester.Count, 1, "Push notification was not handled. The new conversation was not added to the collection");
                }
            }
        }
        public void HandlePushNotificationTest()
        {
            for (int i = 0; i < this.conversationMessages.Count; i++)
            {
                for (int j = 0; j < this.conversationMessages[i].Count; j++)
                {
                    MockServiceProxy serviceProxy = new MockServiceProxy()
                    {
                        Messages = this.conversationMessages[i][j].m_Item2
                    };
                    MockUserSettings userSettings = new MockUserSettings();
                    userSettings.Save(owners[i]);

                    UserModel recipient = null;
                    foreach (UserModel user in this.conversationMessages[i][j].m_Item1.ConversationParticipants)
                    {
                        if (!user.Equals(userSettings.Me))
                        {
                            recipient = user;
                        }
                    }

                    ConversationMessagesViewModel messages = new ConversationMessagesViewModel(serviceProxy, userSettings, this.conversationMessages[i][j].m_Item1.ConversationId, recipient);

                    messages.LoadMessagesForConversations();

                    Random random = new Random((int)DateTime.Now.Ticks);
                    long   existingConversationId     = this.conversationMessages[i][j].m_Item2.Count > 0 ? this.conversationMessages[i][j].m_Item2[0].ConversationId : long.MaxValue;
                    int    existingConversationUserId = this.conversationMessages[i][j].m_Item2.Count > 0 ? this.conversationMessages[i][j].m_Item2[0].Sender.Id : random.Next(1000, 2000);

                    PushNotificationEvent pushEvent = new PushNotificationEvent(this, (long)2000, existingConversationId, "test", DateTime.Now.Ticks, "ConversationMessagesHandlePushNotificationTest" + i.ToString(), existingConversationUserId);

                    int messageCountBeforePush = messages.Messages.Count;
                    NotifyCollectionChangedTester <MessageModel> collectionChangedTester = new NotifyCollectionChangedTester <MessageModel>(messages.Messages);
                    Messenger.Default.Send <PushNotificationEvent>(pushEvent);

                    Assert.AreEqual(1, collectionChangedTester.Count, "Collection changed event was not generated");
                    Assert.AreEqual(messageCountBeforePush + 1, messages.Messages.Count, "Push notification was not handled properly");
                }
            }
        }
        public void CreateConversationMessagesViewModelTest()
        {
            for (int i = 0; i < this.conversationMessages.Count; i++)
            {
                for (int j = 0; j < this.conversationMessages[i].Count; j++)
                {
                    MockServiceProxy serviceProxy = new MockServiceProxy()
                    {
                        Messages = this.conversationMessages[i][j].m_Item2
                    };
                    MockDataContextWrapper dataContext = new MockDataContextWrapper(new MockDatabase()
                    {
                    });
                    MockUserSettings userSettings = new MockUserSettings();
                    userSettings.Save(owners[i]);

                    UserModel recipient = null;
                    foreach (UserModel user in this.conversationMessages[i][j].m_Item1.ConversationParticipants)
                    {
                        if (!user.Equals(userSettings.Me))
                        {
                            recipient = user;
                        }
                    }

                    ConversationMessagesViewModel messages = new ConversationMessagesViewModel(serviceProxy, dataContext, userSettings, this.conversationMessages[i][j].m_Item1.ConversationId, recipient);
                    NotifyPropertyChangedTester   propertyChangedTester = new NotifyPropertyChangedTester(messages);
                    NotifyCollectionChangedTester <MessageModel> collectionChangedTester = new NotifyCollectionChangedTester <MessageModel>(messages.Messages);
                    messages.LoadMessagesForConversations();

                    Assert.AreEqual(1, propertyChangedTester.Changes.Count, "IsLoaded property changed event was not generated");
                    propertyChangedTester.AssertChange(0, "IsLoading");

                    Assert.AreEqual(this.conversationMessages[i][j].m_Item2.Count, collectionChangedTester.Count, "Number of messages in notify collection changed doesn't match");
                }
            }
        }
        public void HandlePushNotificationForDifferentConversationTest()
        {
            for (int i = 0; i < this.conversationMessages.Count; i++)
            {
                for (int j = 0; j < this.conversationMessages[i].Count; j++)
                {

                    MockServiceProxy serviceProxy = new MockServiceProxy() { Messages = this.conversationMessages[i][j].m_Item2 };
                    MockUserSettings userSettings = new MockUserSettings();
                    userSettings.Save(owners[i]);

                    UserModel recipient = null;
                    foreach (UserModel user in this.conversationMessages[i][j].m_Item1.ConversationParticipants)
                    {
                        if (!user.Equals(userSettings.Me))
                        {
                            recipient = user;
                        }
                    }

                    ConversationMessagesViewModel messages = new ConversationMessagesViewModel(serviceProxy, userSettings, this.conversationMessages[i][j].m_Item1.ConversationId, recipient);

                    messages.LoadMessagesForConversations();

                    Random random = new Random((int)DateTime.Now.Ticks);
                    long differentConversationId = long.MaxValue;
                    int differentConversationUserId = random.Next(1000, 2000);

                    PushNotificationEvent pushEvent = new PushNotificationEvent(this, (long)2000, differentConversationId, "test", DateTime.Now.Ticks, "ConversationMessagesHandlePushNotificationTest" + i.ToString(), differentConversationUserId);

                    int messageCountBeforePush = messages.Messages.Count;
                    NotifyCollectionChangedTester<MessageModel> collectionChangedTester = new NotifyCollectionChangedTester<MessageModel>(messages.Messages);
                    Messenger.Default.Send<PushNotificationEvent>(pushEvent);

                    Assert.AreEqual(0, collectionChangedTester.Count, "Collection changed was generated when it should not be");
                    Assert.AreEqual(messageCountBeforePush, messages.Messages.Count, "Push notification was not handled properly");
                }
            }
        }
        public void SendNewMessageTest()
        {
            for (int i = 0; i < this.conversationMessages.Count; i++)
            {
                for (int j = 0; j < this.conversationMessages[i].Count; j++)
                {

                    MockServiceProxy serviceProxy = new MockServiceProxy() { Messages = this.conversationMessages[i][j].m_Item2 };
                    MockUserSettings userSettings = new MockUserSettings();
                    userSettings.Save(owners[i]);

                    UserModel recipient = null;
                    foreach (UserModel user in this.conversationMessages[i][j].m_Item1.ConversationParticipants)
                    {
                        if (!user.Equals(userSettings.Me))
                        {
                            recipient = user;
                        }
                    }

                    ConversationMessagesViewModel messages = new ConversationMessagesViewModel(serviceProxy, userSettings, this.conversationMessages[i][j].m_Item1.ConversationId, recipient);

                    messages.LoadMessagesForConversations();

                    NotifyCollectionChangedTester<MessageModel> collectionChangedTester = new NotifyCollectionChangedTester<MessageModel>(messages.Messages);

                    /*************************************************
                     * SendMessage chat heads enabled
                     * ***********************************************/

                    int messageCountBeforeNewMessage = messages.Messages.Count;

                    // Send a new message.
                    // The mock proxy will invoke the callback immediately
                    messages.SendNewMessage("SendNewMessageTest message chatheads disabled" + DateTime.Now.Ticks);

                    Assert.AreEqual(1, collectionChangedTester.Count, "Collection changed event was not generated");
                    Assert.AreEqual(messageCountBeforeNewMessage + 1, messages.Messages.Count, "New message was not added to the collection");

                    /*************************************************
                     * SendMessage chat heads enabled
                     * ***********************************************/

                    // Send another message but this time with chatheads enabled.
                    // Ensure that quit application event is generated.
                    messageCountBeforeNewMessage = messages.Messages.Count;
                    userSettings.ChatHeadEnabled = true;
                    bool quitEventGenerated = false;
                    collectionChangedTester.Count = 0;
                    Messenger.Default.Register<QuitApplicationEvent>(this, (QuitApplicationEvent e) => { quitEventGenerated = true; });

                    messages.SendNewMessage("SendNewMessageTest message chatheads disabled" + DateTime.Now.Ticks);

                    Assert.AreEqual(1, collectionChangedTester.Count, "IsLoaded property changed event was not generated");
                    Assert.AreEqual(messageCountBeforeNewMessage + 1, messages.Messages.Count, "New messaged was not added to the collection");

                    /*************************************************
                     * SendMessage simulate failure
                     * ***********************************************/
                    // Remember the count before new message
                    messageCountBeforeNewMessage = messages.Messages.Count;

                    // Set chat heads to enabled to true and
                    userSettings.ChatHeadEnabled = true;
                    // Simulate failure to true
                    serviceProxy.SimulateSendMessageFailure = true;

                    // Set quitEventGenerated to false
                    quitEventGenerated = false;

                    collectionChangedTester.Count = 0;
                    Messenger.Default.Register<QuitApplicationEvent>(this, (QuitApplicationEvent e) => { quitEventGenerated = true; });

                    messages.SendNewMessage("SendNewMessageTest message chatheads disabled" + DateTime.Now.Ticks);

                    Assert.AreEqual(0, collectionChangedTester.Count, "IsLoaded property changed event was not generated");
                    Assert.AreEqual(messageCountBeforeNewMessage, messages.Messages.Count, "New messaged was not added to the collection");
                    Assert.AreEqual(false, quitEventGenerated, "Quit Application event was not generated");
                }
            }
        }
        public void HandlePushNotificationNewConversationTest()
        {
            List<List<ConversationModel>> conversations = new List<List<ConversationModel>>();
            List<UserModel> owners = new List<UserModel>();
            this.LoadConversations(conversations, owners);

            for (int i = 0; i < conversations.Count; i++)
            {
                MockServiceProxy serviceProxy = new MockServiceProxy() { Conversations = conversations[i] };
                MockUserSettings userSettings = new MockUserSettings();
                MockDataContextWrapper dataContextWrapper = new MockDataContextWrapper(new MockDatabase() { Conversations = conversations[i] });
                userSettings.Save(owners[i]);

                using (AllConversationsViewModel allConversations = new AllConversationsViewModel(serviceProxy, userSettings, dataContextWrapper))
                {
                    allConversations.LoadInitialConversations();

                    NotifyCollectionChangedTester<ConversationModel> collectionChangedTester = new NotifyCollectionChangedTester<ConversationModel>(allConversations.Conversations);
                    int newUserId = 5000;
                    long newConversationId = long.MaxValue;
                    Messenger.Default.Send<PushNotificationEvent>(new PushNotificationEvent(this, (long)2000, newConversationId, "test", DateTime.Now.Ticks, "HandlePushNotificationNewConversationTest" + i.ToString(), newUserId));

                    // We should be able to retrieve the new conversation by recipient and by conversation id
                    Assert.AreNotEqual(null, allConversations.GetConversation(newUserId));
                    Assert.AreNotEqual(null, allConversations.GetConversationFromConversationId(newConversationId));

                    // There should be one collection changed event
                    Assert.AreEqual(collectionChangedTester.Count, 1, "Push notification was not handled. The new conversation was not added to the collection");
                }
            }
        }
        public void ServiceUpdateExistingConversationTest()
        {
            List<List<ConversationModel>> conversations = new List<List<ConversationModel>>();
            List<UserModel> owners = new List<UserModel>();
            this.LoadConversations(conversations, owners);

            for (int i = 0; i < conversations.Count; i++)
            {
                if (conversations[i].Count == 0)
                {
                    return;
                }

                List<ConversationModel> serviceConversation = new List<ConversationModel>();
                for (int j = 0; j < conversations[i].Count; j++)
                {
                    ConversationModel newConversation = new ConversationModel();
                    newConversation.ConversationId = conversations[i][j].ConversationId;
                    newConversation.ConversationParticipants = conversations[i][j].ConversationParticipants;
                    newConversation.LastPostUtcTime = DateTime.Now;
                    newConversation.LastPostPreview = "New message for conversation" + j.ToString();
                    serviceConversation.Add(newConversation);
                }

                MockServiceProxy serviceProxy = new MockServiceProxy() { Conversations = serviceConversation };
                MockUserSettings userSettings = new MockUserSettings();
                MockDataContextWrapper dataContextWrapper = new MockDataContextWrapper(new MockDatabase() { Conversations = conversations[i] });
                userSettings.Save(owners[i]);

                using (AllConversationsViewModel allConversations = new AllConversationsViewModel(serviceProxy, userSettings, dataContextWrapper))
                {
                    allConversations.LoadInitialConversations();

                    NotifyCollectionChangedTester<ConversationModel> collectionChangedTester = new NotifyCollectionChangedTester<ConversationModel>(allConversations.Conversations);

                    while (!allConversations.IsLoaded)
                    {
                        System.Threading.Thread.Sleep(1000);
                    }

                    Assert.AreEqual(collectionChangedTester.Count, serviceConversation.Count, "Service proxy changes weren't generated");

                    for (int j = 0; j < allConversations.Conversations.Count; j++)
                    {
                        Assert.AreEqual(allConversations.Conversations[j].LastPostUtcTime, serviceConversation[j].LastPostUtcTime, "Date didn't match with the service proxy update");
                        Assert.AreEqual(allConversations.Conversations[j].LastPostPreview, serviceConversation[j].LastPostPreview, "preview didn't match with the service proxy update");
                    }
                }
            }
        }
        public void ServiceAddNewConversationTest()
        {
            List<List<ConversationModel>> conversations = new List<List<ConversationModel>>();
            List<UserModel> owners = new List<UserModel>();
            this.LoadConversations(conversations, owners);

            for (int i = 0; i < conversations.Count; i++)
            {
                if (conversations[i].Count == 0)
                {
                    return;
                }

                int newConversations = 3;
                MockUserSettings userSettings = new MockUserSettings();
                MockDataContextWrapper dataContextWrapper = new MockDataContextWrapper(new MockDatabase() { Conversations = conversations[i] });
                userSettings.Save(owners[i]);

                Random random = new Random((int)DateTime.Now.Ticks);
                List<ConversationModel> serviceConversation = new List<ConversationModel>();
                serviceConversation.AddRange(conversations[i]);
                long conversationIdGenerator = long.MaxValue;
                for (int j = 0; j < newConversations; j++)
                {
                    ConversationModel newConversation = new ConversationModel();
                    newConversation.ConversationId = conversationIdGenerator--;
                    newConversation.ConversationParticipants = new List<UserModel>();
                    newConversation.ConversationParticipants.Add(userSettings.Me);
                    newConversation.ConversationParticipants.Add(new UserModel() { Id = random.Next(100, 2000), Name = "ServiceAddNewConversationTestUser" + j.ToString(), PhoneNumber = "425 111 1111" });
                    newConversation.LastPostUtcTime = DateTime.Now;
                    newConversation.LastPostPreview = "New message for conversation" + j.ToString();
                    serviceConversation.Add(newConversation);
                }

                MockServiceProxy serviceProxy = new MockServiceProxy() { Conversations = serviceConversation };

                using (AllConversationsViewModel allConversations = new AllConversationsViewModel(serviceProxy, userSettings, dataContextWrapper))
                {
                    allConversations.LoadInitialConversations();

                    NotifyCollectionChangedTester<ConversationModel> collectionChangedTester = new NotifyCollectionChangedTester<ConversationModel>(allConversations.Conversations);

                    while (!allConversations.IsLoaded)
                    {
                        System.Threading.Thread.Sleep(1000);
                    }

                    Assert.AreEqual(newConversations, collectionChangedTester.Count, "Service proxy changes weren't generated");

                    for (int j = 0; j < allConversations.Conversations.Count; j++)
                    {
                        Assert.AreEqual(allConversations.Conversations[j].LastPostUtcTime, serviceConversation[j].LastPostUtcTime, "Date didn't match with the service proxy update");
                        Assert.AreEqual(allConversations.Conversations[j].LastPostPreview, serviceConversation[j].LastPostPreview, "preview didn't match with the service proxy update");
                    }

                    Assert.AreEqual(((MockTable<ConversationModel>)dataContextWrapper.Table<ConversationModel>()).Count, serviceConversation.Count, "New conversation was not inserted in to the database");
                }
            }
        }
        public void NewAllConversationsViewModelTest()
        {
            List<List<ConversationModel>> conversations = new List<List<ConversationModel>>();
            List<UserModel> owners = new List<UserModel>();
            this.LoadConversations(conversations, owners);

            for (int i = 0; i < conversations.Count; i++)
            {
                MockServiceProxy serviceProxy = new MockServiceProxy() { };
                MockUserSettings userSettings = new MockUserSettings();
                MockDataContextWrapper dataContextWrapper = new MockDataContextWrapper(new MockDatabase() { Conversations = conversations[i] });
                userSettings.Save(owners[i]);

                using (AllConversationsViewModel allConversations = new AllConversationsViewModel(serviceProxy, userSettings, dataContextWrapper))
                {
                    NotifyPropertyChangedTester propertyChangedTester = new NotifyPropertyChangedTester(allConversations);
                    NotifyCollectionChangedTester<ConversationModel> collectionChangedTester = new NotifyCollectionChangedTester<ConversationModel>(allConversations.Conversations);
                    allConversations.LoadInitialConversations();

                    while (!allConversations.IsLoaded)
                    {
                        System.Threading.Thread.Sleep(1000);
                    }

                    Assert.AreEqual(1, propertyChangedTester.Changes.Count, "IsLoaded property changed event was not generated");
                    propertyChangedTester.AssertChange(0, "IsLoaded");

                    Assert.AreEqual(conversations[i].Count, collectionChangedTester.Count, "Number of conversations in notify collection changed doesn't match");
                }
            }
        }
        public void SendNewMessageTest()
        {
            for (int i = 0; i < this.conversationMessages.Count; i++)
            {
                for (int j = 0; j < this.conversationMessages[i].Count; j++)
                {
                    MockServiceProxy serviceProxy = new MockServiceProxy()
                    {
                        Messages = this.conversationMessages[i][j].m_Item2
                    };
                    MockUserSettings userSettings = new MockUserSettings();
                    userSettings.Save(owners[i]);

                    UserModel recipient = null;
                    foreach (UserModel user in this.conversationMessages[i][j].m_Item1.ConversationParticipants)
                    {
                        if (!user.Equals(userSettings.Me))
                        {
                            recipient = user;
                        }
                    }

                    ConversationMessagesViewModel messages = new ConversationMessagesViewModel(serviceProxy, userSettings, this.conversationMessages[i][j].m_Item1.ConversationId, recipient);

                    messages.LoadMessagesForConversations();

                    NotifyCollectionChangedTester <MessageModel> collectionChangedTester = new NotifyCollectionChangedTester <MessageModel>(messages.Messages);

                    /*************************************************
                    * SendMessage chat heads enabled
                    * ***********************************************/

                    int messageCountBeforeNewMessage = messages.Messages.Count;

                    // Send a new message.
                    // The mock proxy will invoke the callback immediately
                    messages.SendNewMessage("SendNewMessageTest message chatheads disabled" + DateTime.Now.Ticks);

                    Assert.AreEqual(1, collectionChangedTester.Count, "Collection changed event was not generated");
                    Assert.AreEqual(messageCountBeforeNewMessage + 1, messages.Messages.Count, "New message was not added to the collection");

                    /*************************************************
                    * SendMessage chat heads enabled
                    * ***********************************************/

                    // Send another message but this time with chatheads enabled.
                    // Ensure that quit application event is generated.
                    messageCountBeforeNewMessage = messages.Messages.Count;
                    userSettings.ChatHeadEnabled = true;
                    bool quitEventGenerated = false;
                    collectionChangedTester.Count = 0;
                    Messenger.Default.Register <QuitApplicationEvent>(this, (QuitApplicationEvent e) => { quitEventGenerated = true; });

                    messages.SendNewMessage("SendNewMessageTest message chatheads disabled" + DateTime.Now.Ticks);

                    Assert.AreEqual(1, collectionChangedTester.Count, "IsLoaded property changed event was not generated");
                    Assert.AreEqual(messageCountBeforeNewMessage + 1, messages.Messages.Count, "New messaged was not added to the collection");

                    /*************************************************
                    * SendMessage simulate failure
                    * ***********************************************/
                    // Remember the count before new message
                    messageCountBeforeNewMessage = messages.Messages.Count;

                    // Set chat heads to enabled to true and
                    userSettings.ChatHeadEnabled = true;
                    // Simulate failure to true
                    serviceProxy.SimulateSendMessageFailure = true;

                    // Set quitEventGenerated to false
                    quitEventGenerated = false;

                    collectionChangedTester.Count = 0;
                    Messenger.Default.Register <QuitApplicationEvent>(this, (QuitApplicationEvent e) => { quitEventGenerated = true; });

                    messages.SendNewMessage("SendNewMessageTest message chatheads disabled" + DateTime.Now.Ticks);

                    Assert.AreEqual(0, collectionChangedTester.Count, "IsLoaded property changed event was not generated");
                    Assert.AreEqual(messageCountBeforeNewMessage, messages.Messages.Count, "New messaged was not added to the collection");
                    Assert.AreEqual(false, quitEventGenerated, "Quit Application event was not generated");
                }
            }
        }