using System.Collections.Generic; using System.Threading.Tasks; using BirdsiteLive.DAL.Contracts; using BirdsiteLive.DAL.Models; using BirdsiteLive.Domain.BusinessUseCases; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; namespace BirdsiteLive.Domain.Tests.BusinessUseCases { [TestClass] public class ProcessUnfollowUserTests { [TestMethod] public async Task ExecuteAsync_NoFollowerFound_Test() { #region Stubs var username = "testest"; var domain = "m.s"; var twitterName = "handle"; #endregion #region Mocks var followersDalMock = new Mock(MockBehavior.Strict); followersDalMock .Setup(x => x.GetFollowerAsync(username, domain)) .ReturnsAsync((Follower) null); var twitterUserDalMock = new Mock(MockBehavior.Strict); #endregion var action = new ProcessUndoFollowUser(followersDalMock.Object, twitterUserDalMock.Object); await action.ExecuteAsync(username, domain, twitterName ); #region Validations followersDalMock.VerifyAll(); twitterUserDalMock.VerifyAll(); #endregion } [TestMethod] public async Task ExecuteAsync_NoTwitterUserFound_Test() { #region Stubs var username = "testest"; var domain = "m.s"; var twitterName = "handle"; var follower = new Follower { Id = 1, Acct = username, Host = domain, Followings = new List(), FollowingsSyncStatus = new Dictionary() }; #endregion #region Mocks var followersDalMock = new Mock(MockBehavior.Strict); followersDalMock .Setup(x => x.GetFollowerAsync(username, domain)) .ReturnsAsync(follower); var twitterUserDalMock = new Mock(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 } [TestMethod] public async Task ExecuteAsync_MultiFollows_Test() { #region Stubs var username = "testest"; var domain = "m.s"; var twitterName = "handle"; var follower = new Follower { Id = 1, Acct = username, Host = domain, Followings = new List { 2, 3 }, FollowingsSyncStatus = new Dictionary { { 2, 460 }, { 3, 563} } }; var twitterUser = new SyncTwitterUser { Id = 2, Acct = twitterName, LastTweetPostedId = 460, LastTweetSynchronizedForAllFollowersId = 460 }; var followerList = new List { new Follower(), new Follower() }; #endregion #region Mocks var followersDalMock = new Mock(MockBehavior.Strict); followersDalMock .Setup(x => x.GetFollowerAsync(username, domain)) .ReturnsAsync(follower); followersDalMock .Setup(x => x.UpdateFollowerAsync( It.Is(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(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 } [TestMethod] public async Task ExecuteAsync_CleanUp_Test() { #region Stubs var username = "testest"; var domain = "m.s"; var twitterName = "handle"; var follower = new Follower { Id = 1, Acct = username, Host = domain, Followings = new List { 2 }, FollowingsSyncStatus = new Dictionary { { 2, 460 } } }; var twitterUser = new SyncTwitterUser { Id = 2, Acct = twitterName, LastTweetPostedId = 460, LastTweetSynchronizedForAllFollowersId = 460 }; var followerList = new List(); #endregion #region Mocks var followersDalMock = new Mock(MockBehavior.Strict); followersDalMock .Setup(x => x.GetFollowerAsync(username, domain)) .ReturnsAsync(follower); followersDalMock .Setup(x => x.DeleteFollowerAsync( It.Is(y => y == username), It.Is(y => y == domain) )) .Returns(Task.CompletedTask); followersDalMock .Setup(x => x.GetFollowersAsync(twitterUser.Id)) .ReturnsAsync(followerList.ToArray()); var twitterUserDalMock = new Mock(MockBehavior.Strict); twitterUserDalMock .Setup(x => x.GetTwitterUserAsync(twitterName)) .ReturnsAsync(twitterUser); twitterUserDalMock .Setup(x => x.DeleteTwitterUserAsync( It.Is(y => y == twitterName) )) .Returns(Task.CompletedTask); #endregion var action = new ProcessUndoFollowUser(followersDalMock.Object, twitterUserDalMock.Object); await action.ExecuteAsync(username, domain, twitterName); #region Validations followersDalMock.VerifyAll(); twitterUserDalMock.VerifyAll(); #endregion } } }