public async Task ExecuteAsync_NoFollowerFound_Test()
        {
            #region Stubs
            var username    = "******";
            var domain      = "m.s";
            var twitterName = "handle";
            #endregion

            #region Mocks
            var followersDalMock = new Mock <IFollowersDal>(MockBehavior.Strict);
            followersDalMock
            .Setup(x => x.GetFollowerAsync(username, domain))
            .ReturnsAsync((Follower)null);

            var twitterUserDalMock = new Mock <ITwitterUserDal>(MockBehavior.Strict);
            #endregion

            var action = new ProcessUndoFollowUser(followersDalMock.Object, twitterUserDalMock.Object);
            await action.ExecuteAsync(username, domain, twitterName);

            #region Validations
            followersDalMock.VerifyAll();
            twitterUserDalMock.VerifyAll();
            #endregion
        }
        public async Task ExecuteAsync_NoTwitterUserFound_Test()
        {
            #region Stubs
            var username    = "******";
            var domain      = "m.s";
            var twitterName = "handle";

            var follower = new Follower
            {
                Id                   = 1,
                Acct                 = username,
                Host                 = domain,
                Followings           = new List <int>(),
                FollowingsSyncStatus = new Dictionary <int, long>()
            };
            #endregion

            #region Mocks
            var followersDalMock = new Mock <IFollowersDal>(MockBehavior.Strict);
            followersDalMock
            .Setup(x => x.GetFollowerAsync(username, domain))
            .ReturnsAsync(follower);

            var twitterUserDalMock = new Mock <ITwitterUserDal>(MockBehavior.Strict);
            twitterUserDalMock
            .Setup(x => x.GetTwitterUserAsync(twitterName))
            .ReturnsAsync((SyncTwitterUser)null);
            #endregion

            var action = new ProcessUndoFollowUser(followersDalMock.Object, twitterUserDalMock.Object);
            await action.ExecuteAsync(username, domain, twitterName);

            #region Validations
            followersDalMock.VerifyAll();
            twitterUserDalMock.VerifyAll();
            #endregion
        }
        public async Task ExecuteAsync_MultiFollows_Test()
        {
            #region Stubs
            var username    = "******";
            var domain      = "m.s";
            var twitterName = "handle";

            var follower = new Follower
            {
                Id         = 1,
                Acct       = username,
                Host       = domain,
                Followings = new List <int> {
                    2, 3
                },
                FollowingsSyncStatus = new Dictionary <int, long> {
                    { 2, 460 }, { 3, 563 }
                }
            };

            var twitterUser = new SyncTwitterUser
            {
                Id   = 2,
                Acct = twitterName,
                LastTweetPostedId = 460,
                LastTweetSynchronizedForAllFollowersId = 460
            };

            var followerList = new List <Follower>
            {
                new Follower(),
                new Follower()
            };
            #endregion

            #region Mocks
            var followersDalMock = new Mock <IFollowersDal>(MockBehavior.Strict);
            followersDalMock
            .Setup(x => x.GetFollowerAsync(username, domain))
            .ReturnsAsync(follower);

            followersDalMock
            .Setup(x => x.UpdateFollowerAsync(
                       It.Is <Follower>(y => !y.Followings.Contains(twitterUser.Id) &&
                                        !y.FollowingsSyncStatus.ContainsKey(twitterUser.Id))
                       ))
            .Returns(Task.CompletedTask);

            followersDalMock
            .Setup(x => x.GetFollowersAsync(twitterUser.Id))
            .ReturnsAsync(followerList.ToArray());

            var twitterUserDalMock = new Mock <ITwitterUserDal>(MockBehavior.Strict);
            twitterUserDalMock
            .Setup(x => x.GetTwitterUserAsync(twitterName))
            .ReturnsAsync(twitterUser);
            #endregion

            var action = new ProcessUndoFollowUser(followersDalMock.Object, twitterUserDalMock.Object);
            await action.ExecuteAsync(username, domain, twitterName);

            #region Validations
            followersDalMock.VerifyAll();
            twitterUserDalMock.VerifyAll();
            #endregion
        }