81 lines
2.6 KiB
C#
81 lines
2.6 KiB
C#
|
|
using FluentAssertions;
|
||
|
|
using Wino.Core.Domain.Enums;
|
||
|
|
using Wino.Core.Domain.Interfaces;
|
||
|
|
using Wino.Core.Domain.Models.Synchronization;
|
||
|
|
using Wino.Core.Services;
|
||
|
|
using Xunit;
|
||
|
|
|
||
|
|
namespace Wino.Core.Tests.Services;
|
||
|
|
|
||
|
|
public class SynchronizationResultTests
|
||
|
|
{
|
||
|
|
[Fact]
|
||
|
|
public void Mail_result_merge_issues_should_mark_success_as_partial_and_set_exception()
|
||
|
|
{
|
||
|
|
var result = MailSynchronizationResult.Completed([]);
|
||
|
|
var issues = new[]
|
||
|
|
{
|
||
|
|
new SynchronizationIssue
|
||
|
|
{
|
||
|
|
Message = "Create event failed",
|
||
|
|
OperationType = "RequestExecution",
|
||
|
|
Severity = SynchronizerErrorSeverity.Fatal
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
result.MergeIssues(issues);
|
||
|
|
|
||
|
|
result.CompletedState.Should().Be(SynchronizationCompletedState.PartiallyCompleted);
|
||
|
|
result.Issues.Should().ContainSingle();
|
||
|
|
result.Exception.Should().NotBeNull();
|
||
|
|
result.Exception!.Message.Should().Be("Create event failed");
|
||
|
|
}
|
||
|
|
|
||
|
|
[Fact]
|
||
|
|
public void Calendar_result_merge_issues_should_mark_success_as_partial_and_preserve_issue()
|
||
|
|
{
|
||
|
|
var result = CalendarSynchronizationResult.Empty;
|
||
|
|
var issues = new[]
|
||
|
|
{
|
||
|
|
new SynchronizationIssue
|
||
|
|
{
|
||
|
|
Message = "Calendar API rate limit",
|
||
|
|
OperationType = "CalendarSync",
|
||
|
|
Severity = SynchronizerErrorSeverity.Transient
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
result.MergeIssues(issues);
|
||
|
|
|
||
|
|
result.CompletedState.Should().Be(SynchronizationCompletedState.PartiallyCompleted);
|
||
|
|
result.Issues.Should().ContainSingle(issue => issue.Message == "Calendar API rate limit");
|
||
|
|
result.Exception.Should().NotBeNull();
|
||
|
|
result.Exception!.Message.Should().Be("Calendar API rate limit");
|
||
|
|
}
|
||
|
|
|
||
|
|
[Fact]
|
||
|
|
public async Task Error_factory_should_record_handled_metadata_on_context()
|
||
|
|
{
|
||
|
|
var factory = new SynchronizerErrorHandlingFactory();
|
||
|
|
factory.RegisterHandler(new TestErrorHandler());
|
||
|
|
|
||
|
|
var context = new SynchronizerErrorContext
|
||
|
|
{
|
||
|
|
ErrorMessage = "Handled sync error"
|
||
|
|
};
|
||
|
|
|
||
|
|
var handled = await factory.HandleErrorAsync(context);
|
||
|
|
|
||
|
|
handled.Should().BeTrue();
|
||
|
|
context.WasHandled.Should().BeTrue();
|
||
|
|
context.HandledBy.Should().Be(nameof(TestErrorHandler));
|
||
|
|
}
|
||
|
|
|
||
|
|
private sealed class TestErrorHandler : ISynchronizerErrorHandler
|
||
|
|
{
|
||
|
|
public bool CanHandle(SynchronizerErrorContext error) => true;
|
||
|
|
|
||
|
|
public Task<bool> HandleAsync(SynchronizerErrorContext error) => Task.FromResult(true);
|
||
|
|
}
|
||
|
|
}
|