diff --git a/test/MediatR.Tests/NotificationPublisherTests.cs b/test/MediatR.Tests/NotificationPublisherTests.cs index 052d5230..40999052 100644 --- a/test/MediatR.Tests/NotificationPublisherTests.cs +++ b/test/MediatR.Tests/NotificationPublisherTests.cs @@ -1,6 +1,82 @@ -namespace MediatR.Tests; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; +using MediatR.NotificationPublishers; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Xunit; +using Xunit.Abstractions; + +namespace MediatR.Tests; public class NotificationPublisherTests { - + private readonly ITestOutputHelper _output; + + public NotificationPublisherTests(ITestOutputHelper output) => _output = output; + + public class Notification : INotification + { + } + + public class FirstHandler : INotificationHandler + { + public async Task Handle(Notification notification, CancellationToken cancellationToken) + => await Task.Delay(500, cancellationToken); + } + public class SecondHandler : INotificationHandler + { + public async Task Handle(Notification notification, CancellationToken cancellationToken) + => await Task.Delay(250, cancellationToken); + } + + [Fact] + public async Task Should_handle_sequentially_by_default() + { + var services = new ServiceCollection(); + services.AddMediatR(cfg => + { + cfg.RegisterServicesFromAssemblyContaining(); + }); + var serviceProvider = services.BuildServiceProvider(); + + var mediator = serviceProvider.GetRequiredService(); + + var timer = new Stopwatch(); + timer.Start(); + + await mediator.Publish(new Notification()); + + timer.Stop(); + + timer.ElapsedMilliseconds.ShouldBeGreaterThan(750); + + _output.WriteLine(timer.ElapsedMilliseconds.ToString()); + } + + + [Fact] + public async Task Should_handle_in_parallel_with_when_all() + { + var services = new ServiceCollection(); + services.AddMediatR(cfg => + { + cfg.RegisterServicesFromAssemblyContaining(); + cfg.NotificationPublisherType = typeof(TaskWhenAllPublisher); + }); + var serviceProvider = services.BuildServiceProvider(); + + var mediator = serviceProvider.GetRequiredService(); + + var timer = new Stopwatch(); + timer.Start(); + + await mediator.Publish(new Notification()); + + timer.Stop(); + + timer.ElapsedMilliseconds.ShouldBeLessThan(750); + + _output.WriteLine(timer.ElapsedMilliseconds.ToString()); + } } \ No newline at end of file