using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; using DotNetCore.CAP.Infrastructure; using DotNetCore.CAP.Models; using DotNetCore.CAP.Processor; using DotNetCore.CAP.Processor.States; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Moq; using Xunit; namespace DotNetCore.CAP.Test { public class DefaultDispatcherTest { private CancellationTokenSource _cancellationTokenSource; private ProcessingContext _context; private IServiceProvider _provider; private Mock _mockStorageConnection; private Mock _mockQueueExecutorFactory; private Mock _mockQueueExecutor; public DefaultDispatcherTest() { _mockStorageConnection = new Mock(); _mockQueueExecutorFactory = new Mock(); _mockQueueExecutor = new Mock(); _mockQueueExecutorFactory.Setup(x => x.GetInstance(MessageType.Publish)).Returns(_mockQueueExecutor.Object); _cancellationTokenSource = new CancellationTokenSource(); var services = new ServiceCollection(); services.AddTransient(); services.AddLogging(); services.Configure>(x => { }); services.AddOptions(); services.AddSingleton(_mockStorageConnection.Object); services.AddSingleton(_mockQueueExecutorFactory.Object); _provider = services.BuildServiceProvider(); _context = new ProcessingContext(_provider, _cancellationTokenSource.Token); } [Fact] public void MockTest() { Assert.NotNull(_provider.GetServices()); } [Fact] public async void ProcessAsync_CancellationTokenCancelled_ThrowsImmediately() { // Arrange _cancellationTokenSource.Cancel(); var fixture = Create(); // Act await Assert.ThrowsAsync(() => fixture.ProcessAsync(_context)); } [Fact] public async Task ProcessAsync() { // Arrange var job = new CapPublishedMessage { }; var mockFetchedJob = Mock.Get(Mock.Of(fj => fj.MessageId == 42 && fj.MessageType == MessageType.Publish )); _mockStorageConnection .Setup(m => m.FetchNextMessageAsync()) .ReturnsAsync(mockFetchedJob.Object).Verifiable(); _mockQueueExecutor .Setup(x => x.ExecuteAsync(_mockStorageConnection.Object, mockFetchedJob.Object)) .Returns(Task.FromResult(OperateResult.Success)); var fixture = Create(); // Act await fixture.ProcessAsync(_context); // Assert _mockStorageConnection.VerifyAll(); } private DefaultDispatcher Create() => _provider.GetService(); } }