using Microsoft.Extensions.Logging; using Moq; using Orleans.Configuration; using Orleans.Providers.Streams.Common; using Orleans.Streams; using StackExchange.Redis; using Universley.OrleansContrib.StreamsProvider.Redis; namespace RedisStreamsProvider.UnitTests { public class RedisStreamFactoryTests { private readonly Mock _mockConnectionMultiplexer; private readonly Mock _mockLoggerFactory; private readonly Mock _mockServiceProvider; private readonly Mock _mockStreamFailureHandler; private readonly SimpleQueueCacheOptions _simpleQueueCacheOptions; private readonly HashRingStreamQueueMapperOptions _hashRingStreamQueueMapperOptions; private readonly string _providerName = "TestProvider"; public RedisStreamFactoryTests() { _mockConnectionMultiplexer = new Mock(); _mockConnectionMultiplexer.Setup(x => x.GetDatabase(It.IsAny(), It.IsAny())).Returns(new Mock().Object); _mockLoggerFactory = new Mock(); _mockServiceProvider = new Mock(); _mockStreamFailureHandler = new Mock(); _simpleQueueCacheOptions = new SimpleQueueCacheOptions(); _hashRingStreamQueueMapperOptions = new HashRingStreamQueueMapperOptions(); } [Fact] public void Constructor_ShouldThrowArgumentNullException_WhenAnyArgumentIsNull() { Assert.Throws(() => new RedisStreamFactory(null, _mockLoggerFactory.Object, _providerName, _mockStreamFailureHandler.Object, _simpleQueueCacheOptions, _hashRingStreamQueueMapperOptions)); Assert.Throws(() => new RedisStreamFactory(_mockConnectionMultiplexer.Object, null, _providerName, _mockStreamFailureHandler.Object, _simpleQueueCacheOptions, _hashRingStreamQueueMapperOptions)); Assert.Throws(() => new RedisStreamFactory(_mockConnectionMultiplexer.Object, _mockLoggerFactory.Object, null, _mockStreamFailureHandler.Object, _simpleQueueCacheOptions, _hashRingStreamQueueMapperOptions)); Assert.Throws(() => new RedisStreamFactory(_mockConnectionMultiplexer.Object, _mockLoggerFactory.Object, _providerName, null, _simpleQueueCacheOptions, _hashRingStreamQueueMapperOptions)); Assert.Throws(() => new RedisStreamFactory(_mockConnectionMultiplexer.Object, _mockLoggerFactory.Object, _providerName, _mockStreamFailureHandler.Object, null, _hashRingStreamQueueMapperOptions)); Assert.Throws(() => new RedisStreamFactory(_mockConnectionMultiplexer.Object, _mockLoggerFactory.Object, _providerName, _mockStreamFailureHandler.Object, _simpleQueueCacheOptions, null)); } [Fact] public async Task CreateAdapter_ShouldReturnRedisStreamAdapterInstance() { var factory = new RedisStreamFactory(_mockConnectionMultiplexer.Object, _mockLoggerFactory.Object, _providerName, _mockStreamFailureHandler.Object, _simpleQueueCacheOptions, _hashRingStreamQueueMapperOptions); var adapter = await factory.CreateAdapter(); Assert.NotNull(adapter); Assert.IsType(adapter); } [Fact] public async Task GetDeliveryFailureHandler_ShouldReturnStreamFailureHandler() { var factory = new RedisStreamFactory(_mockConnectionMultiplexer.Object, _mockLoggerFactory.Object, _providerName, _mockStreamFailureHandler.Object, _simpleQueueCacheOptions, _hashRingStreamQueueMapperOptions); var handler = await factory.GetDeliveryFailureHandler(new QueueId()); Assert.NotNull(handler); Assert.Equal(_mockStreamFailureHandler.Object, handler); } [Fact] public void GetQueueAdapterCache_ShouldReturnSimpleQueueAdapterCacheInstance() { var factory = new RedisStreamFactory(_mockConnectionMultiplexer.Object, _mockLoggerFactory.Object, _providerName, _mockStreamFailureHandler.Object, _simpleQueueCacheOptions, _hashRingStreamQueueMapperOptions); var cache = factory.GetQueueAdapterCache(); Assert.NotNull(cache); Assert.IsType(cache); } [Fact] public void GetStreamQueueMapper_ShouldReturnHashRingBasedStreamQueueMapperInstance() { var factory = new RedisStreamFactory(_mockConnectionMultiplexer.Object, _mockLoggerFactory.Object, _providerName, _mockStreamFailureHandler.Object, _simpleQueueCacheOptions, _hashRingStreamQueueMapperOptions); var mapper = factory.GetStreamQueueMapper(); Assert.NotNull(mapper); Assert.IsType(mapper); } } }