public void Can_Get_Invitation()
        {
            //Arrange
            using var factory = new SQLiteDbContextFactory();
            //Arrange
            var user1 = new AppUser {
                Id = "id1", UserName = "******", Email = "*****@*****.**"
            };
            var user2 = new AppUser {
                Id = "id2", UserName = "******", Email = "*****@*****.**"
            };
            var user3 = new AppUser {
                Id = "id3", UserName = "******", Email = "*****@*****.**"
            };
            var request1 = new FriendInvitation
            {
                FriendInvitationId = 1,
                Sender             = user1,
                Invited            = user2,
                InvitedEmail       = user2.Email,
                Status             = FriendInvitationStatus.Pending
            };

            var request2 = new FriendInvitation
            {
                FriendInvitationId = 2,
                Sender             = user3,
                InvitedEmail       = "*****@*****.**",
                Status             = FriendInvitationStatus.Pending
            };

            var result = new FriendInvitation();

            //Act
            using (var context = factory.CreateContext())
            {
                context.Users.Add(user1);
                context.Users.Add(user2);
                context.Users.Add(user3);
                context.SaveChanges();
                context.FriendInvitations.Add(request1);
                context.FriendInvitations.Add(request2);
                context.SaveChanges();
                var friendInvitationRepository = new EFFriendInvitationRepository(context);
                result = friendInvitationRepository.GetInvitation(request1.FriendInvitationId);
            }

            using (var context = factory.CreateContext())
            {
                Assert.Equal(3, context.Users.Count());
                Assert.Equal(2, context.FriendInvitations.Count());
                Assert.Equal(request1.FriendInvitationId, result.FriendInvitationId);
                Assert.Equal(FriendInvitationStatus.Pending, result.Status);
                Assert.Equal(request1.Invited.Id, result.Invited.Id);
                Assert.Equal(request1.InvitedId, result.InvitedId);
                Assert.Equal(request1.InvitedEmail, result.InvitedEmail);
                Assert.Equal(request1.Sender.Id, result.Sender.Id);
                Assert.Equal(request1.SenderId, result.SenderId);
            }
        }
        public void Can_Get_Number_Of_Pending_Invitations_For_CurrentUser()
        {
            //Arrange
            using var factory = new SQLiteDbContextFactory();
            //Arrange
            var user1 = new AppUser {
                Id = "id1", UserName = "******", Email = "*****@*****.**"
            };
            var user2 = new AppUser {
                Id = "id2", UserName = "******", Email = "*****@*****.**"
            };
            var user3 = new AppUser {
                Id = "id3", UserName = "******", Email = "*****@*****.**"
            };
            var user4 = new AppUser {
                Id = "id4", UserName = "******", Email = "*****@*****.**"
            };

            var request1 = new FriendInvitation
            {
                FriendInvitationId = 1,
                Sender             = user1,
                Invited            = user2,
                Status             = FriendInvitationStatus.Pending
            };

            var request2 = new FriendInvitation
            {
                FriendInvitationId = 2,
                Sender             = user3,
                Invited            = user2,
                Status             = FriendInvitationStatus.Rejected
            };

            var request3 = new FriendInvitation
            {
                FriendInvitationId = 3,
                Sender             = user4,
                Invited            = user2,
                Status             = FriendInvitationStatus.Accepted
            };

            var request4 = new FriendInvitation
            {
                FriendInvitationId = 4,
                Sender             = user1,
                Invited            = user3,
                Status             = FriendInvitationStatus.Pending
            };

            var request5 = new FriendInvitation
            {
                FriendInvitationId = 5,
                Sender             = user2,
                Invited            = user3,
                Status             = FriendInvitationStatus.Pending
            };

            int result1;
            int result2;
            int result3;

            //Act
            using (var context = factory.CreateContext())
            {
                context.Users.Add(user1);
                context.Users.Add(user2);
                context.Users.Add(user3);
                context.Users.Add(user4);
                context.SaveChanges();
                context.FriendInvitations.Add(request1);
                context.FriendInvitations.Add(request2);
                context.FriendInvitations.Add(request3);
                context.FriendInvitations.Add(request4);
                context.FriendInvitations.Add(request5);
                context.SaveChanges();
                var friendInvitationRepository = new EFFriendInvitationRepository(context);
                result1 = friendInvitationRepository.GetNumberOfPendingInvitationsForCurrentUser(user1.UserName);
                result2 = friendInvitationRepository.GetNumberOfPendingInvitationsForCurrentUser(user2.UserName);
                result3 = friendInvitationRepository.GetNumberOfPendingInvitationsForCurrentUser(user3.UserName);
            }

            using (var context = factory.CreateContext())
            {
                Assert.Equal(4, context.Users.Count());
                Assert.Equal(5, context.FriendInvitations.Count());
                Assert.Equal(0, result1);
                Assert.Equal(1, result2);
                Assert.Equal(2, result3);
            }
        }
        public void Can_Check_If_Invitation_Was_Received_By_Current_User()
        {
            //Arrange
            using var factory = new SQLiteDbContextFactory();
            //Arrange
            var user1 = new AppUser {
                Id = "id1", UserName = "******", Email = "*****@*****.**"
            };
            var user2 = new AppUser {
                Id = "id2", UserName = "******", Email = "*****@*****.**"
            };
            var user3 = new AppUser {
                Id = "id3", UserName = "******", Email = "*****@*****.**"
            };

            var request1 = new FriendInvitation
            {
                FriendInvitationId = 1,
                Sender             = user1,
                InvitedEmail       = "*****@*****.**",
                Status             = FriendInvitationStatus.Pending
            };

            var request2 = new FriendInvitation
            {
                FriendInvitationId = 2,
                Sender             = user1,
                InvitedEmail       = "*****@*****.**",
                Status             = FriendInvitationStatus.Rejected
            };

            var request3 = new FriendInvitation
            {
                FriendInvitationId = 3,
                Sender             = user3,
                InvitedEmail       = "*****@*****.**",
                Status             = FriendInvitationStatus.Accepted
            };

            var request4 = new FriendInvitation
            {
                FriendInvitationId = 4,
                Sender             = user2,
                Invited            = user1,
                InvitedEmail       = user1.Email,
                Status             = FriendInvitationStatus.Pending
            };

            bool result;

            //Act
            using (var context = factory.CreateContext())
            {
                context.Users.Add(user1);
                context.Users.Add(user2);
                context.Users.Add(user3);
                context.SaveChanges();
                context.FriendInvitations.Add(request1);
                context.FriendInvitations.Add(request2);
                context.FriendInvitations.Add(request3);
                context.FriendInvitations.Add(request4);
                context.SaveChanges();
                var friendInvitationRepository = new EFFriendInvitationRepository(context);
                result = friendInvitationRepository.IfInvitationWasReceivedByCurrentUser(user1.Id, "*****@*****.**");
            }

            using (var context = factory.CreateContext())
            {
                Assert.Equal(3, context.Users.Count());
                Assert.Equal(4, context.FriendInvitations.Count());
                Assert.True(result);
            }
        }
        public void Can_Change_Status()
        {
            //Arrange
            using var factory = new SQLiteDbContextFactory();
            //Arrange
            var user1 = new AppUser {
                Id = "id1", UserName = "******", Email = "*****@*****.**"
            };
            var user2 = new AppUser {
                Id = "id2", UserName = "******", Email = "*****@*****.**"
            };
            var user3 = new AppUser {
                Id = "id3", UserName = "******", Email = "*****@*****.**"
            };
            var user4 = new AppUser {
                Id = "id4", UserName = "******", Email = "*****@*****.**"
            };
            var request1 = new FriendInvitation
            {
                FriendInvitationId = 1,
                Sender             = user1,
                Invited            = user2,
                InvitedEmail       = user2.Email,
                Status             = FriendInvitationStatus.Pending
            };

            var request2 = new FriendInvitation
            {
                FriendInvitationId = 2,
                Sender             = user3,
                InvitedEmail       = "*****@*****.**",
                Status             = FriendInvitationStatus.Pending
            };

            //Act
            using (var context = factory.CreateContext())
            {
                context.Users.Add(user1);
                context.Users.Add(user2);
                context.Users.Add(user3);
                context.Users.Add(user4);
                context.SaveChanges();
                context.FriendInvitations.Add(request1);
                context.FriendInvitations.Add(request2);
                context.SaveChanges();
                var friendInvitationRepository = new EFFriendInvitationRepository(context);
                friendInvitationRepository.ChangeStatus(request1.FriendInvitationId, FriendInvitationStatus.Accepted, user2);
                friendInvitationRepository.ChangeStatus(request2.FriendInvitationId, FriendInvitationStatus.Rejected, user4);
            }

            using (var context = factory.CreateContext())
            {
                var invitations = context.FriendInvitations
                                  .Include(i => i.Invited)
                                  .Include(i => i.Sender)
                                  .OrderBy(i => i.FriendInvitationId).ToList();
                Assert.Equal(4, context.Users.Count());
                Assert.Equal(2, context.FriendInvitations.Count());
                Assert.Equal(request1.FriendInvitationId, invitations[0].FriendInvitationId);
                Assert.Equal(request2.FriendInvitationId, invitations[1].FriendInvitationId);

                Assert.Equal(FriendInvitationStatus.Accepted, invitations[0].Status);
                Assert.Equal(FriendInvitationStatus.Rejected, invitations[1].Status);

                Assert.Equal(request1.Sender.Id, invitations[0].SenderId);
                Assert.Equal(request2.Sender.Id, invitations[1].SenderId);

                Assert.Equal(request1.Invited.Id, invitations[0].InvitedId);
                Assert.Equal(user4.Id, invitations[1].InvitedId);

                Assert.Equal(request1.InvitedEmail, invitations[0].InvitedEmail);
                Assert.Equal(user4.Email, invitations[1].InvitedEmail);
            }
        }
        public void Can_Add_Invitation()
        {
            //Arrange
            using var factory = new SQLiteDbContextFactory();
            //Arrange
            var user1 = new AppUser {
                Id = "id1", UserName = "******", Email = "*****@*****.**"
            };
            var user2 = new AppUser {
                Id = "id2", UserName = "******", Email = "*****@*****.**"
            };
            var user3 = new AppUser {
                Id = "id3", UserName = "******", Email = "*****@*****.**"
            };
            var request1ToAdd = new FriendInvitation
            {
                FriendInvitationId = 1,
                Sender             = user1,
                Invited            = user2,
                InvitedEmail       = user2.Email
            };

            var request2ToAdd = new FriendInvitation
            {
                FriendInvitationId = 2,
                Sender             = user3,
                InvitedEmail       = "*****@*****.**"
            };

            //Act
            using (var context = factory.CreateContext())
            {
                context.Users.Add(user1);
                context.Users.Add(user2);
                context.Users.Add(user3);
                context.SaveChanges();
                var friendInvitationRepository = new EFFriendInvitationRepository(context);
                friendInvitationRepository.AddInvitation(request1ToAdd);
                friendInvitationRepository.AddInvitation(request2ToAdd);
            }

            using (var context = factory.CreateContext())
            {
                var invitations = context.FriendInvitations
                                  .Include(i => i.Invited)
                                  .Include(i => i.Sender)
                                  .OrderBy(i => i.FriendInvitationId).ToList();
                Assert.Equal(3, context.Users.Count());
                Assert.Equal(2, context.FriendInvitations.Count());
                Assert.Equal(request1ToAdd.FriendInvitationId, invitations[0].FriendInvitationId);
                Assert.Equal(request2ToAdd.FriendInvitationId, invitations[1].FriendInvitationId);

                Assert.Equal(FriendInvitationStatus.Pending, invitations[0].Status);
                Assert.Equal(FriendInvitationStatus.Pending, invitations[1].Status);

                Assert.Equal(request1ToAdd.Sender.Id, invitations[0].SenderId);
                Assert.Equal(request2ToAdd.Sender.Id, invitations[1].SenderId);

                Assert.Equal(request1ToAdd.Invited.Id, invitations[0].InvitedId);
                Assert.Null(invitations[1].InvitedId);

                Assert.Equal(request1ToAdd.InvitedEmail, invitations[0].InvitedEmail);
                Assert.Equal("*****@*****.**", invitations[1].InvitedEmail);
            }
        }
        public void Can_Get_Invitations_Received_By_CurrentUser()
        {
            //Arrange
            var user1 = new AppUser {
                Id = "id1", UserName = "******", Email = "*****@*****.**"
            };
            var user2 = new AppUser {
                Id = "id2", UserName = "******", Email = "*****@*****.**"
            };
            var user3 = new AppUser {
                Id = "id3", UserName = "******", Email = "*****@*****.**"
            };
            var user4 = new AppUser {
                Id = "id4", UserName = "******", Email = "*****@*****.**"
            };
            var user5 = new AppUser {
                Id = "id5", UserName = "******", Email = "*****@*****.**"
            };

            var request1 = new FriendInvitation
            {
                FriendInvitationId = 1,
                Sender             = user1,
                Status             = FriendInvitationStatus.Pending,
                Invited            = user3,
                InvitedEmail       = user3.Email
            };

            var request2 = new FriendInvitation
            {
                FriendInvitationId = 2,
                Sender             = user4,
                Status             = FriendInvitationStatus.Rejected,
                Invited            = user1,
                InvitedEmail       = user1.Email
            };

            var request3 = new FriendInvitation
            {
                FriendInvitationId = 3,
                Sender             = user1,
                Status             = FriendInvitationStatus.Pending,
                InvitedEmail       = "*****@*****.**"
            };

            var request4 = new FriendInvitation
            {
                FriendInvitationId = 4,
                Sender             = user1,
                Status             = FriendInvitationStatus.Accepted,
                Invited            = user2,
                InvitedEmail       = user2.Email
            };

            var request5 = new FriendInvitation
            {
                FriendInvitationId = 5,
                Sender             = user5,
                Status             = FriendInvitationStatus.Accepted,
                Invited            = user1,
                InvitedEmail       = user1.Email
            };

            using var factory = new SQLiteDbContextFactory();
            using (var context = factory.CreateContext())
            {
                context.Users.Add(user1);
                context.Users.Add(user2);
                context.Users.Add(user3);
                context.Users.Add(user4);
                context.Users.Add(user5);
                context.FriendInvitations.Add(request1);
                context.FriendInvitations.Add(request2);
                context.FriendInvitations.Add(request3);
                context.FriendInvitations.Add(request4);
                context.FriendInvitations.Add(request5);
                context.SaveChanges();
            }

            //Act
            using (var context = factory.CreateContext())
            {
                var friendInvitationRepository = new EFFriendInvitationRepository(context);
                var result1 = friendInvitationRepository.GetInvitationsReceivedByCurrentUser(user1.Email)
                              .OrderBy(i => i.FriendInvitationId).ToList();
                var result2 = friendInvitationRepository.GetInvitationsReceivedByCurrentUser(user3.Email)
                              .OrderBy(i => i.FriendInvitationId).ToList();
                var result3 = friendInvitationRepository.GetInvitationsReceivedByCurrentUser(user5.Email)
                              .OrderBy(i => i.FriendInvitationId).ToList();
                Assert.Equal(5, context.Users.Count());
                Assert.Equal(5, context.FriendInvitations.Count());
                Assert.Equal(3, result1.Count);
                Assert.Equal(request2.FriendInvitationId, result1[0].FriendInvitationId);
                Assert.Equal(request3.FriendInvitationId, result1[1].FriendInvitationId);
                Assert.Equal(request5.FriendInvitationId, result1[2].FriendInvitationId);
                Assert.Single(result2);
                Assert.Equal(request1.FriendInvitationId, result2[0].FriendInvitationId);
                Assert.Empty(result3);
            }
        }