Potential gmail history id fix.
This commit is contained in:
@@ -19,6 +19,32 @@ namespace Wino.Core.Tests.Synchronizers;
|
|||||||
|
|
||||||
public sealed class GmailSynchronizerRequestSuccessTests
|
public sealed class GmailSynchronizerRequestSuccessTests
|
||||||
{
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task UpdateAccountSyncIdentifierAsync_EmptyStoredIdentifier_PersistsFirstHistoryCursor()
|
||||||
|
{
|
||||||
|
var changeProcessor = new Mock<IGmailChangeProcessor>(MockBehavior.Strict);
|
||||||
|
changeProcessor
|
||||||
|
.Setup(x => x.UpdateAccountDeltaSynchronizationIdentifierAsync(It.IsAny<Guid>(), "123"))
|
||||||
|
.ReturnsAsync("123");
|
||||||
|
|
||||||
|
var synchronizer = CreateSynchronizer(changeProcessor.Object, synchronizationDeltaIdentifier: string.Empty);
|
||||||
|
|
||||||
|
await InvokeUpdateAccountSyncIdentifierAsync(synchronizer, 123);
|
||||||
|
|
||||||
|
changeProcessor.Verify(x => x.UpdateAccountDeltaSynchronizationIdentifierAsync(It.IsAny<Guid>(), "123"), Times.Once);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task UpdateAccountSyncIdentifierAsync_OlderHistoryCursor_DoesNotRegressStoredCursor()
|
||||||
|
{
|
||||||
|
var changeProcessor = new Mock<IGmailChangeProcessor>(MockBehavior.Strict);
|
||||||
|
var synchronizer = CreateSynchronizer(changeProcessor.Object, synchronizationDeltaIdentifier: "456");
|
||||||
|
|
||||||
|
await InvokeUpdateAccountSyncIdentifierAsync(synchronizer, 123);
|
||||||
|
|
||||||
|
changeProcessor.Verify(x => x.UpdateAccountDeltaSynchronizationIdentifierAsync(It.IsAny<Guid>(), It.IsAny<string>()), Times.Never);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task ProcessSingleNativeRequestResponseAsync_BatchMarkReadRequest_PersistsLocalReadStateForEachMail()
|
public async Task ProcessSingleNativeRequestResponseAsync_BatchMarkReadRequest_PersistsLocalReadStateForEachMail()
|
||||||
{
|
{
|
||||||
@@ -209,13 +235,15 @@ public sealed class GmailSynchronizerRequestSuccessTests
|
|||||||
|
|
||||||
private static GmailSynchronizer CreateSynchronizer(
|
private static GmailSynchronizer CreateSynchronizer(
|
||||||
IGmailChangeProcessor changeProcessor,
|
IGmailChangeProcessor changeProcessor,
|
||||||
IGmailSynchronizerErrorHandlerFactory? errorFactory = null)
|
IGmailSynchronizerErrorHandlerFactory? errorFactory = null,
|
||||||
|
string? synchronizationDeltaIdentifier = null)
|
||||||
{
|
{
|
||||||
var account = new MailAccount
|
var account = new MailAccount
|
||||||
{
|
{
|
||||||
Id = Guid.NewGuid(),
|
Id = Guid.NewGuid(),
|
||||||
Name = "Gmail",
|
Name = "Gmail",
|
||||||
Address = "user@example.com"
|
Address = "user@example.com",
|
||||||
|
SynchronizationDeltaIdentifier = synchronizationDeltaIdentifier
|
||||||
};
|
};
|
||||||
|
|
||||||
var authenticator = new Mock<IGmailAuthenticator>(MockBehavior.Loose);
|
var authenticator = new Mock<IGmailAuthenticator>(MockBehavior.Loose);
|
||||||
@@ -249,4 +277,17 @@ public sealed class GmailSynchronizerRequestSuccessTests
|
|||||||
task.Should().NotBeNull();
|
task.Should().NotBeNull();
|
||||||
await task!;
|
await task!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static async Task InvokeUpdateAccountSyncIdentifierAsync(GmailSynchronizer synchronizer, ulong historyId)
|
||||||
|
{
|
||||||
|
var method = typeof(GmailSynchronizer).GetMethod(
|
||||||
|
"UpdateAccountSyncIdentifierAsync",
|
||||||
|
BindingFlags.Instance | BindingFlags.NonPublic);
|
||||||
|
|
||||||
|
method.Should().NotBeNull();
|
||||||
|
|
||||||
|
var task = method!.Invoke(synchronizer, [historyId]) as Task;
|
||||||
|
task.Should().NotBeNull();
|
||||||
|
await task!;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1897,9 +1897,19 @@ public class GmailSynchronizer : WinoSynchronizer<IClientServiceRequest, Message
|
|||||||
if (historyId == null) return false;
|
if (historyId == null) return false;
|
||||||
|
|
||||||
var newHistoryId = historyId.Value;
|
var newHistoryId = historyId.Value;
|
||||||
|
var currentSynchronizationIdentifier = Account.SynchronizationDeltaIdentifier;
|
||||||
|
|
||||||
return Account.SynchronizationDeltaIdentifier == null ||
|
if (string.IsNullOrWhiteSpace(currentSynchronizationIdentifier))
|
||||||
(ulong.TryParse(Account.SynchronizationDeltaIdentifier, out ulong currentIdentifier) && newHistoryId > currentIdentifier);
|
return true;
|
||||||
|
|
||||||
|
if (!ulong.TryParse(currentSynchronizationIdentifier, out ulong currentIdentifier))
|
||||||
|
{
|
||||||
|
_logger.Warning("Current Gmail history ID '{HistoryId}' is invalid for {Name}. Replacing it with {NewHistoryId}.",
|
||||||
|
currentSynchronizationIdentifier, Account.Name, newHistoryId);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newHistoryId > currentIdentifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task UpdateAccountSyncIdentifierAsync(ulong? historyId)
|
private async Task UpdateAccountSyncIdentifierAsync(ulong? historyId)
|
||||||
|
|||||||
Reference in New Issue
Block a user