public void NotAddBadgeToUser_WhenUserDoesNotHaveRequiredContributions()
        {
            // arrange
            var userProvider     = new Mock <IUserProvider>();
            var usersRepository  = new Mock <IRepository <User> >();
            var badgesRepository = new Mock <IRepository <Badge> >();
            var unitOfWork       = new Mock <IUnitOfWork>();

            var user = new User()
            {
                Id = 1, ContributionsCount = 10
            };
            var users = new List <User>()
            {
                user
            };

            var badge = new Badge()
            {
                RequiredContributions = 20
            };
            var badges = new List <Badge>()
            {
                badge
            };

            user.Badges.Add(badge);

            userProvider.Setup(x => x.LoggedUser).Returns(user);
            usersRepository.Setup(x => x.All(It.IsAny <Expression <Func <User, bool> > >()))
            .Returns(users);
            badgesRepository.Setup(x => x.All(It.IsAny <Expression <Func <Badge, bool> > >()))
            .Returns(badges);

            var userContributionsIntereptor = new UserContributionsInterceptor(
                userProvider.Object,
                usersRepository.Object,
                badgesRepository.Object,
                unitOfWork.Object);

            var invocation = new Mock <IInvocation>();

            // act
            userContributionsIntereptor.Intercept(invocation.Object);

            // assert
            Assert.AreEqual(1, user.Badges.Count);
        }
        public void AddBadgeToUser_WhenUserHasRequiredContributionsAndHasntStillAquiredBadge()
        {
            // arrange
            var userProvider     = new Mock <IUserProvider>();
            var usersRepository  = new Mock <IRepository <User> >();
            var badgesRepository = new Mock <IRepository <Badge> >();
            var unitOfWork       = new Mock <IUnitOfWork>();

            var user = new User()
            {
                Id = 1, ContributionsCount = 30
            };
            var users = new List <User>()
            {
                user
            };

            var badge = new Badge()
            {
                RequiredContributions = 20, Name = "SomeName"
            };
            var badges = new List <Badge>()
            {
                badge
            };

            userProvider.Setup(x => x.LoggedUser).Returns(user);
            usersRepository.Setup(x => x.All(It.IsAny <Expression <Func <User, bool> > >()))
            .Returns(users);
            badgesRepository.Setup(x => x.All(It.IsAny <Expression <Func <Badge, bool> > >()))
            .Returns(badges);

            var userContributionsIntereptor = new UserContributionsInterceptor(
                userProvider.Object,
                usersRepository.Object,
                badgesRepository.Object,
                unitOfWork.Object);

            var invocation = new Mock <IInvocation>();

            // act
            userContributionsIntereptor.Intercept(invocation.Object);

            // assert
            Assert.AreSame(badge, user.Badges.First());
        }
        public void IncrementUsersContrbitions_WhenSuchUserExists()
        {
            // arrange
            var userProvider     = new Mock <IUserProvider>();
            var usersRepository  = new Mock <IRepository <User> >();
            var badgesRepository = new Mock <IRepository <Badge> >();
            var unitOfWork       = new Mock <IUnitOfWork>();

            var user = new User()
            {
                Id = 1
            };
            var users = new List <User>()
            {
                user
            };
            var badges = new List <Badge>();

            userProvider.Setup(x => x.LoggedUser).Returns(user);
            usersRepository.Setup(x => x.All(It.IsAny <Expression <Func <User, bool> > >()))
            .Returns(users);
            badgesRepository.Setup(x => x.All(It.IsAny <Expression <Func <Badge, bool> > >()))
            .Returns(badges);

            var userContributionsIntereptor = new UserContributionsInterceptor(
                userProvider.Object,
                usersRepository.Object,
                badgesRepository.Object,
                unitOfWork.Object);

            var invocation = new Mock <IInvocation>();

            // act
            userContributionsIntereptor.Intercept(invocation.Object);

            // assert
            Assert.AreEqual(1, user.ContributionsCount);
        }