using Application.Dto.Email;
using Service.EmailServices;
namespace WebApi.Test.Application;
///
/// EmailMessageApplication 单元测试
///
public class EmailMessageApplicationTest : BaseApplicationTest
{
private readonly IEmailMessageRepository _emailRepository;
private readonly ITransactionRecordRepository _transactionRepository;
private readonly IEmailHandleService _emailHandleService;
private readonly IEmailSyncService _emailSyncService;
private readonly ILogger _logger;
private readonly EmailMessageApplication _application;
public EmailMessageApplicationTest()
{
_emailRepository = Substitute.For();
_transactionRepository = Substitute.For();
_emailHandleService = Substitute.For();
_emailSyncService = Substitute.For();
_logger = CreateMockLogger();
_application = new EmailMessageApplication(
_emailRepository,
_transactionRepository,
_emailHandleService,
_emailSyncService,
_logger);
}
#region GetListAsync Tests
[Fact]
public async Task GetListAsync_正常查询_应返回邮件列表()
{
// Arrange
var emailList = new List
{
new() { Id = 1, Subject = "测试邮件1", From = "test@example.com", ReceivedDate = DateTime.Now },
new() { Id = 2, Subject = "测试邮件2", From = "test2@example.com", ReceivedDate = DateTime.Now }
};
_emailRepository.GetPagedListAsync(Arg.Any(), Arg.Any())
.Returns((emailList, DateTime.Now, 2L));
_emailRepository.GetTotalCountAsync().Returns(2L);
_transactionRepository.GetCountByEmailIdAsync(Arg.Any()).Returns(5);
var request = new EmailQueryRequest();
// Act
var result = await _application.GetListAsync(request);
// Assert
result.Should().NotBeNull();
result.Data.Should().HaveCount(2);
result.Total.Should().Be(2);
result.Data[0].TransactionCount.Should().Be(5);
}
#endregion
#region GetByIdAsync Tests
[Fact]
public async Task GetByIdAsync_存在的邮件_应返回邮件详情()
{
// Arrange
var email = new EmailMessage
{
Id = 1,
Subject = "测试邮件",
From = "test@example.com",
Body = "邮件内容",
To = "接收人 ",
ReceivedDate = DateTime.Now
};
_emailRepository.GetByIdAsync(1).Returns(email);
_transactionRepository.GetCountByEmailIdAsync(1).Returns(3);
// Act
var result = await _application.GetByIdAsync(1);
// Assert
result.Should().NotBeNull();
result.Id.Should().Be(1);
result.Subject.Should().Be("测试邮件");
result.TransactionCount.Should().Be(3);
result.ToName.Should().Be("接收人");
}
[Fact]
public async Task GetByIdAsync_邮件不存在_应抛出NotFoundException()
{
// Arrange
_emailRepository.GetByIdAsync(999).Returns((EmailMessage?)null);
// Act & Assert
await Assert.ThrowsAsync(() => _application.GetByIdAsync(999));
}
#endregion
#region DeleteByIdAsync Tests
[Fact]
public async Task DeleteByIdAsync_成功删除_应不抛出异常()
{
// Arrange
_emailRepository.DeleteAsync(1).Returns(true);
// Act
await _application.DeleteByIdAsync(1);
// Assert
await _emailRepository.Received(1).DeleteAsync(1);
}
[Fact]
public async Task DeleteByIdAsync_删除失败_应抛出BusinessException()
{
// Arrange
_emailRepository.DeleteAsync(999).Returns(false);
// Act & Assert
await Assert.ThrowsAsync(() => _application.DeleteByIdAsync(999));
}
#endregion
#region RefreshTransactionRecordsAsync Tests
[Fact]
public async Task RefreshTransactionRecordsAsync_邮件存在且刷新成功_应不抛出异常()
{
// Arrange
var email = new EmailMessage { Id = 1, Subject = "测试邮件" };
_emailRepository.GetByIdAsync(1).Returns(email);
_emailHandleService.RefreshTransactionRecordsAsync(1).Returns(true);
// Act
await _application.RefreshTransactionRecordsAsync(1);
// Assert
await _emailHandleService.Received(1).RefreshTransactionRecordsAsync(1);
}
[Fact]
public async Task RefreshTransactionRecordsAsync_邮件不存在_应抛出NotFoundException()
{
// Arrange
_emailRepository.GetByIdAsync(999).Returns((EmailMessage?)null);
// Act & Assert
await Assert.ThrowsAsync(() =>
_application.RefreshTransactionRecordsAsync(999));
}
[Fact]
public async Task RefreshTransactionRecordsAsync_刷新失败_应抛出BusinessException()
{
// Arrange
var email = new EmailMessage { Id = 1, Subject = "测试邮件" };
_emailRepository.GetByIdAsync(1).Returns(email);
_emailHandleService.RefreshTransactionRecordsAsync(1).Returns(false);
// Act & Assert
await Assert.ThrowsAsync(() =>
_application.RefreshTransactionRecordsAsync(1));
}
#endregion
#region SyncEmailsAsync Tests
[Fact]
public async Task SyncEmailsAsync_应调用邮件同步服务()
{
// Act
await _application.SyncEmailsAsync();
// Assert
await _emailSyncService.Received(1).SyncEmailsAsync();
}
#endregion
}