2020-08-13 02:55:50 +02:00
|
|
|
|
using System;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
2021-09-11 02:47:02 +02:00
|
|
|
|
using System.Xml;
|
2022-02-03 03:33:45 +01:00
|
|
|
|
using BirdsiteLive.Common.Settings;
|
2021-09-11 02:47:02 +02:00
|
|
|
|
using BirdsiteLive.DAL.Contracts;
|
2020-08-13 02:55:50 +02:00
|
|
|
|
using BirdsiteLive.DAL.Models;
|
2022-02-03 03:33:45 +01:00
|
|
|
|
using BirdsiteLive.Moderation.Actions;
|
2020-08-13 02:55:50 +02:00
|
|
|
|
using BirdsiteLive.Pipeline.Models;
|
|
|
|
|
using BirdsiteLive.Pipeline.Processors;
|
|
|
|
|
using BirdsiteLive.Pipeline.Processors.SubTasks;
|
|
|
|
|
using BirdsiteLive.Twitter.Models;
|
2021-01-16 08:06:27 +01:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
2020-08-13 02:55:50 +02:00
|
|
|
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
|
|
|
using Moq;
|
|
|
|
|
|
|
|
|
|
namespace BirdsiteLive.Pipeline.Tests.Processors
|
|
|
|
|
{
|
|
|
|
|
[TestClass]
|
|
|
|
|
public class SendTweetsToFollowersProcessorTests
|
|
|
|
|
{
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_SameInstance_SharedInbox_OneTweet_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host = "domain.ext";
|
|
|
|
|
var sharedInbox = "/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
2021-09-05 19:58:33 +02:00
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
2020-08-13 02:55:50 +02:00
|
|
|
|
{
|
|
|
|
|
Tweets = new []
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new []
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host,
|
|
|
|
|
SharedInboxRoute = sharedInbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host,
|
|
|
|
|
SharedInboxRoute = sharedInbox
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
|
|
|
|
sendTweetsToSharedInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct),
|
|
|
|
|
It.Is<string>(y => y == host),
|
|
|
|
|
It.Is<Follower[]>(y => y.Length == 2)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
2021-01-16 08:06:27 +01:00
|
|
|
|
|
2021-09-11 02:47:02 +02:00
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
2021-01-16 08:06:27 +01:00
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
2021-09-11 02:47:02 +02:00
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_SharedInbox_OneTweet_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var sharedInbox = "/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
2021-09-05 19:58:33 +02:00
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
2020-08-13 02:55:50 +02:00
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
SharedInboxRoute = sharedInbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
SharedInboxRoute = sharedInbox
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
|
|
|
|
foreach (var host in new [] { host1, host2})
|
|
|
|
|
{
|
|
|
|
|
sendTweetsToSharedInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct),
|
|
|
|
|
It.Is<string>(y => y == host),
|
|
|
|
|
It.Is<Follower[]>(y => y.Length == 1)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
}
|
2021-01-16 08:06:27 +01:00
|
|
|
|
|
2021-09-11 02:47:02 +02:00
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
2021-01-16 08:06:27 +01:00
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
2021-09-11 02:47:02 +02:00
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_SharedInbox_OneTweet_Error_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var sharedInbox = "/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
2021-09-05 19:58:33 +02:00
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
2020-08-13 02:55:50 +02:00
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
SharedInboxRoute = sharedInbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
SharedInboxRoute = sharedInbox
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
|
|
|
|
sendTweetsToSharedInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct),
|
|
|
|
|
It.Is<string>(y => y == host1),
|
|
|
|
|
It.Is<Follower[]>(y => y.Length == 1)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
sendTweetsToSharedInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct),
|
|
|
|
|
It.Is<string>(y => y == host2),
|
|
|
|
|
It.Is<Follower[]>(y => y.Length == 1)))
|
|
|
|
|
.Throws(new Exception());
|
2021-01-16 08:06:27 +01:00
|
|
|
|
|
2021-09-11 02:47:02 +02:00
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
followersDalMock
|
|
|
|
|
.Setup(x => x.UpdateFollowerAsync(It.Is<Follower>(y => y.Id == userId2 && y.PostingErrorCount == 1)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
2021-01-16 08:06:27 +01:00
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
2021-09-11 02:47:02 +02:00
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-11 02:49:49 +02:00
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_SharedInbox_OneTweet_ErrorReset_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var sharedInbox = "/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
SharedInboxRoute = sharedInbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
SharedInboxRoute = sharedInbox,
|
|
|
|
|
PostingErrorCount = 50
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
|
|
|
|
sendTweetsToSharedInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct),
|
|
|
|
|
It.Is<string>(y => y == host1),
|
|
|
|
|
It.Is<Follower[]>(y => y.Length == 1)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
sendTweetsToSharedInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct),
|
|
|
|
|
It.Is<string>(y => y == host2),
|
|
|
|
|
It.Is<Follower[]>(y => y.Length == 1)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
followersDalMock
|
|
|
|
|
.Setup(x => x.UpdateFollowerAsync(It.Is<Follower>(y => y.Id == userId2 && y.PostingErrorCount == 0)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
2021-09-11 02:49:49 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2021-09-11 02:49:49 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2021-09-11 02:49:49 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-11 05:28:36 +02:00
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_SharedInbox_OneTweet_ErrorAndReset_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var sharedInbox = "/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
SharedInboxRoute = sharedInbox,
|
|
|
|
|
PostingErrorCount = 50
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
SharedInboxRoute = sharedInbox,
|
|
|
|
|
PostingErrorCount = 50
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
|
|
|
|
sendTweetsToSharedInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct),
|
|
|
|
|
It.Is<string>(y => y == host1),
|
|
|
|
|
It.Is<Follower[]>(y => y.Length == 1)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
sendTweetsToSharedInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct),
|
|
|
|
|
It.Is<string>(y => y == host2),
|
|
|
|
|
It.Is<Follower[]>(y => y.Length == 1)))
|
|
|
|
|
.Throws(new Exception());
|
|
|
|
|
|
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
followersDalMock
|
|
|
|
|
.Setup(x => x.UpdateFollowerAsync(It.Is<Follower>(y => y.Id == userId1 && y.PostingErrorCount == 0)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
followersDalMock
|
|
|
|
|
.Setup(x => x.UpdateFollowerAsync(It.Is<Follower>(y => y.Id == userId2 && y.PostingErrorCount == 51)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
2021-09-11 05:28:36 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2021-09-11 05:28:36 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2021-09-11 05:28:36 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-13 02:55:50 +02:00
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_SameInstance_Inbox_OneTweet_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host = "domain.ext";
|
|
|
|
|
var inbox = "/user/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
2021-09-05 19:58:33 +02:00
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
2020-08-13 02:55:50 +02:00
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host,
|
|
|
|
|
InboxRoute = inbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host,
|
|
|
|
|
InboxRoute = inbox
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
foreach (var userId in new[] { userId1, userId2 })
|
|
|
|
|
{
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
2021-01-16 08:06:27 +01:00
|
|
|
|
|
2021-09-11 02:47:02 +02:00
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
2021-01-16 08:06:27 +01:00
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
2021-09-11 02:47:02 +02:00
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_Inbox_OneTweet_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var inbox = "/user/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
2021-09-05 19:58:33 +02:00
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
2020-08-13 02:55:50 +02:00
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
InboxRoute = inbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
InboxRoute = inbox
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
foreach (var userId in new[] { userId1, userId2 })
|
|
|
|
|
{
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
2021-01-16 08:06:27 +01:00
|
|
|
|
|
2021-09-11 02:47:02 +02:00
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
2021-01-16 08:06:27 +01:00
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
2021-09-11 02:47:02 +02:00
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_Inbox_OneTweet_Error_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var inbox = "/user/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
2021-09-05 19:58:33 +02:00
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
2020-08-13 02:55:50 +02:00
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
InboxRoute = inbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
InboxRoute = inbox
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId2),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Throws(new Exception());
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
2021-01-16 08:06:27 +01:00
|
|
|
|
|
2021-09-11 02:47:02 +02:00
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
followersDalMock
|
|
|
|
|
.Setup(x => x.UpdateFollowerAsync(It.Is<Follower>(y => y.Id == userId2 && y.PostingErrorCount == 1)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
2021-01-16 08:06:27 +01:00
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
|
|
|
|
followersDalMock.VerifyAll();
|
|
|
|
|
removeFollowerMock.VerifyAll();
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_Inbox_OneTweet_Error_SettingsThreshold_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var inbox = "/user/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
InboxRoute = inbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
InboxRoute = inbox,
|
|
|
|
|
PostingErrorCount = 42
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId2),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Throws(new Exception());
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings
|
|
|
|
|
{
|
|
|
|
|
FailingFollowerCleanUpThreshold = 10
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
|
|
|
|
removeFollowerMock
|
|
|
|
|
.Setup(x => x.ProcessAsync(It.Is<Follower>(y => y.Id == userId2)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
|
|
|
|
followersDalMock.VerifyAll();
|
|
|
|
|
removeFollowerMock.VerifyAll();
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_Inbox_OneTweet_Error_MaxThreshold_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var inbox = "/user/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
InboxRoute = inbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
InboxRoute = inbox,
|
|
|
|
|
PostingErrorCount = 2147483600
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId2),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Throws(new Exception());
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings
|
|
|
|
|
{
|
|
|
|
|
FailingFollowerCleanUpThreshold = 0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
|
|
|
|
removeFollowerMock
|
|
|
|
|
.Setup(x => x.ProcessAsync(It.Is<Follower>(y => y.Id == userId2)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2020-08-13 02:55:50 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
2021-09-11 02:47:02 +02:00
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2020-08-13 02:55:50 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
2021-09-11 02:49:49 +02:00
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_Inbox_OneTweet_ErrorReset_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var inbox = "/user/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
InboxRoute = inbox
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
InboxRoute = inbox,
|
|
|
|
|
PostingErrorCount = 50
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId2),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
followersDalMock
|
|
|
|
|
.Setup(x => x.UpdateFollowerAsync(It.Is<Follower>(y => y.Id == userId2 && y.PostingErrorCount == 0)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
2021-09-11 02:49:49 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2021-09-11 02:49:49 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2021-09-11 02:49:49 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
2021-09-11 05:28:36 +02:00
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
|
public async Task ProcessAsync_MultiInstances_Inbox_OneTweet_ErrorAndReset_Test()
|
|
|
|
|
{
|
|
|
|
|
#region Stubs
|
|
|
|
|
var tweetId = 1;
|
|
|
|
|
var host1 = "domain1.ext";
|
|
|
|
|
var host2 = "domain2.ext";
|
|
|
|
|
var inbox = "/user/inbox";
|
|
|
|
|
var userId1 = 2;
|
|
|
|
|
var userId2 = 3;
|
|
|
|
|
var userAcct = "user";
|
|
|
|
|
|
|
|
|
|
var userWithTweets = new UserWithDataToSync()
|
|
|
|
|
{
|
|
|
|
|
Tweets = new[]
|
|
|
|
|
{
|
|
|
|
|
new ExtractedTweet
|
|
|
|
|
{
|
|
|
|
|
Id = tweetId
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
User = new SyncTwitterUser
|
|
|
|
|
{
|
|
|
|
|
Acct = userAcct
|
|
|
|
|
},
|
|
|
|
|
Followers = new[]
|
|
|
|
|
{
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId1,
|
|
|
|
|
Host = host1,
|
|
|
|
|
InboxRoute = inbox,
|
|
|
|
|
PostingErrorCount = 50
|
|
|
|
|
},
|
|
|
|
|
new Follower
|
|
|
|
|
{
|
|
|
|
|
Id = userId2,
|
|
|
|
|
Host = host2,
|
|
|
|
|
InboxRoute = inbox,
|
|
|
|
|
PostingErrorCount = 50
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Mocks
|
|
|
|
|
var sendTweetsToInboxTaskMock = new Mock<ISendTweetsToInboxTask>(MockBehavior.Strict);
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId1),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
sendTweetsToInboxTaskMock
|
|
|
|
|
.Setup(x => x.ExecuteAsync(
|
|
|
|
|
It.Is<ExtractedTweet[]>(y => y.Length == 1),
|
|
|
|
|
It.Is<Follower>(y => y.Id == userId2),
|
|
|
|
|
It.Is<SyncTwitterUser>(y => y.Acct == userAcct)))
|
|
|
|
|
.Throws(new Exception());
|
|
|
|
|
|
|
|
|
|
var sendTweetsToSharedInboxTaskMock = new Mock<ISendTweetsToSharedInboxTask>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
var followersDalMock = new Mock<IFollowersDal>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
|
followersDalMock
|
|
|
|
|
.Setup(x => x.UpdateFollowerAsync(It.Is<Follower>(y => y.Id == userId1 && y.PostingErrorCount == 0)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
followersDalMock
|
|
|
|
|
.Setup(x => x.UpdateFollowerAsync(It.Is<Follower>(y => y.Id == userId2 && y.PostingErrorCount == 51)))
|
|
|
|
|
.Returns(Task.CompletedTask);
|
|
|
|
|
|
|
|
|
|
var loggerMock = new Mock<ILogger<SendTweetsToFollowersProcessor>>();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
|
|
|
|
|
var settings = new InstanceSettings();
|
|
|
|
|
|
|
|
|
|
var removeFollowerMock = new Mock<IRemoveFollowerAction>(MockBehavior.Strict);
|
2021-09-11 05:28:36 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2022-02-03 03:33:45 +01:00
|
|
|
|
var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, followersDalMock.Object, loggerMock.Object, settings, removeFollowerMock.Object);
|
2021-09-11 05:28:36 +02:00
|
|
|
|
var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
#region Validations
|
|
|
|
|
sendTweetsToInboxTaskMock.VerifyAll();
|
|
|
|
|
sendTweetsToSharedInboxTaskMock.VerifyAll();
|
|
|
|
|
followersDalMock.VerifyAll();
|
2022-02-03 03:33:45 +01:00
|
|
|
|
removeFollowerMock.VerifyAll();
|
2021-09-11 05:28:36 +02:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
2020-08-13 02:55:50 +02:00
|
|
|
|
}
|
|
|
|
|
}
|