using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; using BirdsiteLive.ActivityPub.Models; using BirdsiteLive.DAL.Contracts; using BirdsiteLive.DAL.Models; using BirdsiteLive.Domain; using BirdsiteLive.Pipeline.Processors.SubTasks; using BirdsiteLive.Twitter.Models; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; namespace BirdsiteLive.Pipeline.Tests.Processors.SubTasks { [TestClass] public class SendTweetsToSharedInboxTests { [TestMethod] public async Task ExecuteAsync_SingleTweet_Test() { #region Stubs var tweetId = 10; var tweets = new List { new ExtractedTweet { Id = tweetId, } }; var noteId = "noteId"; var note = new Note() { id = noteId }; var twitterHandle = "Test"; var twitterUserId = 7; var twitterUser = new SyncTwitterUser { Id = twitterUserId, Acct = twitterHandle }; var host = "domain.ext"; var inbox = "/inbox"; var followers = new List { new Follower { Id = 1, Host = host, SharedInboxRoute = inbox, FollowingsSyncStatus = new Dictionary { { twitterUserId, 9 } } }, new Follower { Id = 2, Host = host, SharedInboxRoute = inbox, FollowingsSyncStatus = new Dictionary { { twitterUserId, 8 } } }, new Follower { Id = 3, Host = host, SharedInboxRoute = inbox, FollowingsSyncStatus = new Dictionary { { twitterUserId, 7 } } } }; #endregion #region Mocks var activityPubService = new Mock(MockBehavior.Strict); activityPubService .Setup(x => x.PostNewNoteActivity( It.Is(y => y.id == noteId), It.Is(y => y == twitterHandle), It.Is(y => y == tweetId.ToString()), It.Is(y => y == host), It.Is(y => y == inbox))) .ReturnsAsync(HttpStatusCode.Accepted); var statusServiceMock = new Mock(MockBehavior.Strict); statusServiceMock .Setup(x => x.GetStatus( It.Is(y => y == twitterHandle), It.Is(y => y.Id == tweetId))) .Returns(note); var followersDalMock = new Mock(MockBehavior.Strict); foreach (var follower in followers) { followersDalMock .Setup(x => x.UpdateFollowerAsync( It.Is(y => y.Id == follower.Id && y.FollowingsSyncStatus[twitterUserId] == tweetId))) .Returns(Task.CompletedTask); } #endregion var task = new SendTweetsToSharedInboxTask(activityPubService.Object, statusServiceMock.Object, followersDalMock.Object); await task.ExecuteAsync(tweets.ToArray(), twitterUser, host, followers.ToArray()); #region Validations activityPubService.VerifyAll(); statusServiceMock.VerifyAll(); followersDalMock.VerifyAll(); #endregion } [TestMethod] public async Task ExecuteAsync_MultipleTweets_Test() { #region Stubs var tweetId1 = 10; var tweetId2 = 11; var tweetId3 = 12; var tweets = new List(); foreach (var tweetId in new[] { tweetId1, tweetId2, tweetId3 }) { tweets.Add(new ExtractedTweet { Id = tweetId }); } var twitterHandle = "Test"; var twitterUserId = 7; var twitterUser = new SyncTwitterUser { Id = twitterUserId, Acct = twitterHandle }; var host = "domain.ext"; var inbox = "/inbox"; var followers = new List { new Follower { Id = 1, Host = host, SharedInboxRoute = inbox, FollowingsSyncStatus = new Dictionary {{twitterUserId, 10}} }, new Follower { Id = 2, Host = host, SharedInboxRoute = inbox, FollowingsSyncStatus = new Dictionary {{twitterUserId, 8}} }, new Follower { Id = 3, Host = host, SharedInboxRoute = inbox, FollowingsSyncStatus = new Dictionary {{twitterUserId, 7}} } }; #endregion #region Mocks var activityPubService = new Mock(MockBehavior.Strict); foreach (var tweetId in new[] { tweetId2, tweetId3 }) { activityPubService .Setup(x => x.PostNewNoteActivity( It.Is(y => y.id == tweetId.ToString()), It.Is(y => y == twitterHandle), It.Is(y => y == tweetId.ToString()), It.Is(y => y == host), It.Is(y => y == inbox))) .ReturnsAsync(HttpStatusCode.Accepted); } var statusServiceMock = new Mock(MockBehavior.Strict); foreach (var tweetId in new[] { tweetId2, tweetId3 }) { statusServiceMock .Setup(x => x.GetStatus( It.Is(y => y == twitterHandle), It.Is(y => y.Id == tweetId))) .Returns(new Note { id = tweetId.ToString() }); } var followersDalMock = new Mock(MockBehavior.Strict); foreach (var follower in followers) { followersDalMock .Setup(x => x.UpdateFollowerAsync( It.Is(y => y.Id == follower.Id && y.FollowingsSyncStatus[twitterUserId] == tweetId3))) .Returns(Task.CompletedTask); } #endregion var task = new SendTweetsToSharedInboxTask(activityPubService.Object, statusServiceMock.Object, followersDalMock.Object); await task.ExecuteAsync(tweets.ToArray(), twitterUser, host, followers.ToArray()); #region Validations activityPubService.VerifyAll(); statusServiceMock.VerifyAll(); followersDalMock.VerifyAll(); #endregion } [TestMethod] [ExpectedException(typeof(Exception))] public async Task ExecuteAsync_MultipleTweets_Error_Test() { #region Stubs var tweetId1 = 10; var tweetId2 = 11; var tweetId3 = 12; var tweets = new List(); foreach (var tweetId in new[] { tweetId1, tweetId2, tweetId3 }) { tweets.Add(new ExtractedTweet { Id = tweetId }); } var twitterHandle = "Test"; var twitterUserId = 7; var twitterUser = new SyncTwitterUser { Id = twitterUserId, Acct = twitterHandle }; var host = "domain.ext"; var inbox = "/inbox"; var followers = new List { new Follower { Id = 1, Host = host, SharedInboxRoute = inbox, FollowingsSyncStatus = new Dictionary {{twitterUserId, 10}} }, new Follower { Id = 2, Host = host, SharedInboxRoute = inbox, FollowingsSyncStatus = new Dictionary {{twitterUserId, 8}} }, new Follower { Id = 3, Host = host, SharedInboxRoute = inbox, FollowingsSyncStatus = new Dictionary {{twitterUserId, 7}} } }; #endregion #region Mocks var activityPubService = new Mock(MockBehavior.Strict); activityPubService .Setup(x => x.PostNewNoteActivity( It.Is(y => y.id == tweetId2.ToString()), It.Is(y => y == twitterHandle), It.Is(y => y == tweetId2.ToString()), It.Is(y => y == host), It.Is(y => y == inbox))) .ReturnsAsync(HttpStatusCode.Accepted); activityPubService .Setup(x => x.PostNewNoteActivity( It.Is(y => y.id == tweetId3.ToString()), It.Is(y => y == twitterHandle), It.Is(y => y == tweetId3.ToString()), It.Is(y => y == host), It.Is(y => y == inbox))) .ReturnsAsync(HttpStatusCode.InternalServerError); var statusServiceMock = new Mock(MockBehavior.Strict); foreach (var tweetId in new[] { tweetId2, tweetId3 }) { statusServiceMock .Setup(x => x.GetStatus( It.Is(y => y == twitterHandle), It.Is(y => y.Id == tweetId))) .Returns(new Note { id = tweetId.ToString() }); } var followersDalMock = new Mock(MockBehavior.Strict); foreach (var follower in followers) { followersDalMock .Setup(x => x.UpdateFollowerAsync( It.Is(y => y.Id == follower.Id && y.FollowingsSyncStatus[twitterUserId] == tweetId2))) .Returns(Task.CompletedTask); } #endregion var task = new SendTweetsToSharedInboxTask(activityPubService.Object, statusServiceMock.Object, followersDalMock.Object); try { await task.ExecuteAsync(tweets.ToArray(), twitterUser, host, followers.ToArray()); } finally { #region Validations activityPubService.VerifyAll(); statusServiceMock.VerifyAll(); followersDalMock.VerifyAll(); #endregion } } } }