using File.Application.Events; using FluentAssertions; using Microsoft.Extensions.Logging; using Moq; using Xunit; namespace BuildFlow.File.Tests; /// /// 6 个领域事件处理器测试。这些 Handler(INotificationHandler<TEvent>)仅记录日志,无异常分支, /// 通过 INotification 触发,断言:正常完成且恰好记录一次 Information 日志。 /// 触发方式:直接 new XxxEventHandler(logger).Handle(event, ct)。 /// public class FileEventHandlersTests { private static void VerifyLoggedOnce(Mock> logger) where T : class { logger.Verify(l => l.Log( LogLevel.Information, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>()), Times.Once); } [Fact] public async Task ShareDownloaded_记录日志且不抛异常() { var logger = new Mock>(); var handler = new ShareDownloadedEventHandler(logger.Object); await handler.Handle(new ShareDownloadedEvent(Guid.NewGuid(), "token-xyz"), CancellationToken.None); VerifyLoggedOnce(logger); } [Fact] public async Task FileDeleted_记录日志且不抛异常() { var logger = new Mock>(); var handler = new FileDeletedEventHandler(logger.Object); await handler.Handle(new FileDeletedEvent("bucket", "key"), CancellationToken.None); VerifyLoggedOnce(logger); } [Fact] public async Task FolderDeleted_记录日志且不抛异常() { var logger = new Mock>(); var handler = new FolderDeletedEventHandler(logger.Object); await handler.Handle(new FolderDeletedEvent(Guid.NewGuid(), "user-001"), CancellationToken.None); VerifyLoggedOnce(logger); } [Fact] public async Task FolderCreated_记录日志且不抛异常() { var logger = new Mock>(); var handler = new FolderCreatedEventHandler(logger.Object); await handler.Handle(new FolderCreatedEvent(Guid.NewGuid(), "user-001"), CancellationToken.None); VerifyLoggedOnce(logger); } [Fact] public async Task ShareCreated_记录日志且不抛异常() { var logger = new Mock>(); var handler = new ShareCreatedEventHandler(logger.Object); await handler.Handle(new ShareCreatedEvent(Guid.NewGuid(), "user-001"), CancellationToken.None); VerifyLoggedOnce(logger); } [Fact] public async Task FileUploaded_记录日志且不抛异常() { var logger = new Mock>(); var handler = new FileUploadedEventHandler(logger.Object); await handler.Handle(new FileUploadedEvent("bucket", "key"), CancellationToken.None); VerifyLoggedOnce(logger); } }