public void Index_AnonymousUser_PrivateWishlist_Throws404Exception()
        {
            Member member = new Member
            {
                UserAccount = new User
                {
                    UserName = "******"
                },
                WishListVisibility = WishListVisibility.Private
            };

            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();

            Mock<DbSet<Member>> memberDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<Member> { member }.AsQueryable());
            memberDbSetStub.Setup(db => db.Find(member.UserId)).Returns(member);
            dbStub.Setup(db => db.Members).Returns(memberDbSetStub.Object);

            Mock<ControllerContext> context = new Mock<ControllerContext>();
            context.Setup(c => c.HttpContext.User.Identity.IsAuthenticated).Returns(false);

            WishlistController controller = new WishlistController(dbStub.Object, idGetter: null)
            {
                ControllerContext = context.Object
            };

            Assert.That(async () => await controller.Index(member.UserAccount.UserName), Throws.InstanceOf<HttpException>().And.Matches<HttpException>(ex => ex.GetHttpCode() == 404));
        }
        public async void Index_CurrentMemberWishlist_ReturnsMatchingModel()
        {
            Member member = new Member
            {
                UserId = UserId,
                UserAccount = new User
                {
                    UserName = "******"
                }
            };

            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();

            Mock<DbSet<Member>> memberDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<Member> { member }.AsQueryable());
            memberDbSetStub.Setup(db => db.FindAsync(member.UserId)).ReturnsAsync(member);
            dbStub.Setup(db => db.Members).Returns(memberDbSetStub.Object);

            Mock<ControllerContext> context = new Mock<ControllerContext>();
            context.Setup(c => c.HttpContext.User.Identity).Returns<IIdentity>(null);
            context.Setup(c => c.HttpContext.User.Identity.IsAuthenticated).Returns(true);

            Mock<IGuidUserIdGetter> idGetterStub = new Mock<IGuidUserIdGetter>();
            idGetterStub.Setup(id => id.GetUserId(It.IsAny<IIdentity>())).Returns(member.UserId);

            WishlistController controller = new WishlistController(dbStub.Object, idGetterStub.Object)
            {
                ControllerContext = context.Object
            };

            var result = await controller.Index(null) as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<Member>());

            var model = (Member)result.Model;

            Assert.That(model.UserId, Is.EqualTo(UserId));
        }
        public async void Index_AnonymousUser_PublicWishlist_ReturnsMatchingModel()
        {
            Member member = new Member
            {
                UserAccount = new User
                {
                    UserName = "******"
                },
                UserId = UserId,
                WishListVisibility = WishListVisibility.Public,
                Wishlist = new List<Product>()
            };

            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();

            Mock<DbSet<Member>> memberDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<Member> { member }.AsQueryable());
            memberDbSetStub.Setup(db => db.FindAsync(member.UserId)).ReturnsAsync(member);
            dbStub.Setup(db => db.Members).Returns(memberDbSetStub.Object);

            Mock<ControllerContext> context = new Mock<ControllerContext>();
            context.Setup(c => c.HttpContext.User.Identity.IsAuthenticated).Returns(false);

            WishlistController controller = new WishlistController(dbStub.Object, idGetter: null)
            {
                ControllerContext = context.Object
            };

            var result = await controller.Index(member.UserAccount.UserName) as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<Member>());

            var model = (Member)result.Model;

            Assert.That(model.Wishlist, Is.EqualTo(member.Wishlist));
        }
        public async void Index_WishlistOwnerFound_FriendsOnly_NotFriends_Throws404Exception()
        {
            Member wishlistOwner = new Member
            {
                UserAccount = new User
                {
                    UserName = "******"
                },
                UserId = Id,
                WishListVisibility = WishListVisibility.FriendsOnly,
                RequestedFriendships = new List<Friendship>(),
                ReceivedFriendships = new List<Friendship>(),
            };

            Member currentMember = new Member
            {
                UserId = UserId
            };

            List<Member> members = new List<Member>
            {
                wishlistOwner,
                currentMember
            };

            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();

            Mock<DbSet<Member>> memberDbSetStub = TestHelpers.GetFakeAsyncDbSet(members.AsQueryable());
            memberDbSetStub.Setup(db => db.FindAsync(currentMember.UserId)).ReturnsAsync(currentMember);
            memberDbSetStub.Setup(db => db.FindAsync(wishlistOwner.UserId)).ReturnsAsync(wishlistOwner);
            memberDbSetStub.SetupForInclude();
            dbStub.Setup(db => db.Members).Returns(memberDbSetStub.Object);

            Mock<ControllerContext> context = new Mock<ControllerContext>();
            context.Setup(c => c.HttpContext.User.Identity).Returns<IIdentity>(null);
            context.Setup(c => c.HttpContext.User.Identity.IsAuthenticated).Returns(true);

            Mock<IGuidUserIdGetter> idGetterStub = new Mock<IGuidUserIdGetter>();
            idGetterStub.Setup(id => id.GetUserId(It.IsAny<IIdentity>())).Returns(currentMember.UserId);

            WishlistController controller = new WishlistController(dbStub.Object, idGetterStub.Object)
            {
                ControllerContext = context.Object
            };

            var result = await controller.Index(wishlistOwner.UserAccount.UserName) as RedirectToRouteResult;

            Assert.That(result != null);
            Assert.That(result.RouteValues["controller"], Is.EqualTo("FriendList"));
            Assert.That(result.RouteValues["action"], Is.EqualTo("Index"));
        }
        public void Index_WishlistOwnerFound_Private_Throws404Exception()
        {
            Member wishlistOwner = new Member
            {
                UserAccount = new User
                {
                    UserName = "******"
                },
                UserId = Id,
                WishListVisibility = WishListVisibility.Private
            };

            Member currentMember = new Member
            {
                UserId = UserId
            };

            List<Member> members = new List<Member>
            {
                wishlistOwner,
                currentMember
            };

            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();

            Mock<DbSet<Member>> memberDbSetStub = TestHelpers.GetFakeAsyncDbSet(members.AsQueryable());
            memberDbSetStub.Setup(db => db.FindAsync(currentMember.UserId)).ReturnsAsync(currentMember);
            memberDbSetStub.Setup(db => db.FindAsync(wishlistOwner.UserId)).ReturnsAsync(wishlistOwner);
            memberDbSetStub.SetupForInclude();
            dbStub.Setup(db => db.Members).Returns(memberDbSetStub.Object);

            Mock<ControllerContext> context = new Mock<ControllerContext>();
            context.Setup(c => c.HttpContext.User.Identity).Returns<IIdentity>(null);
            context.Setup(c => c.HttpContext.User.Identity.IsAuthenticated).Returns(true);

            Mock<IGuidUserIdGetter> idGetterStub = new Mock<IGuidUserIdGetter>();
            idGetterStub.Setup(id => id.GetUserId(It.IsAny<IIdentity>())).Returns(currentMember.UserId);

            WishlistController controller = new WishlistController(dbStub.Object, idGetterStub.Object)
            {
                ControllerContext = context.Object
            };

            Assert.That(async () => await controller.Index(wishlistOwner.UserAccount.UserName), Throws.InstanceOf<HttpException>().And.Matches<HttpException>(ex => ex.GetHttpCode() == 404));
        }