using Microsoft.Extensions.Logging; using Moq; using Orleans.Streams; using StackExchange.Redis; using Universley.OrleansContrib.StreamsProvider.Redis; namespace RedisStreamsProvider.UnitTests { public class RedisStreamReceiverTests { private readonly Mock _mockDatabase; private readonly Mock> _mockLogger; private readonly QueueId _queueId; private readonly RedisStreamReceiver _receiver; public RedisStreamReceiverTests() { _mockDatabase = new Mock(); _mockLogger = new Mock>(); _queueId = QueueId.GetQueueId("testQueue", 0, 0); // Added the missing 'hash' parameter _receiver = new RedisStreamReceiver(_queueId, _mockDatabase.Object, _mockLogger.Object); } [Fact] public async Task GetQueueMessagesAsync_ReturnsBatches() { // Arrange var streamEntries = new[] { new StreamEntry("1-0", new NameValueEntry[2] {new NameValueEntry("namespace", "testNamespace"), new NameValueEntry("key", "testKey")}), new StreamEntry("2-0", new NameValueEntry[2] {new NameValueEntry("namespace", "testNamespace"), new NameValueEntry("key", "testKey")}) }; _mockDatabase.Setup(db => db.StreamReadGroupAsync( It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), CommandFlags.None)) .ReturnsAsync(streamEntries); // Act var result = await _receiver.GetQueueMessagesAsync(10); // Assert Assert.NotNull(result); Assert.Equal(2, result.Count); } [Fact] public async Task Initialize_CreatesConsumerGroup() { // Arrange _mockDatabase.Setup(db => db.StreamCreateConsumerGroupAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), CommandFlags.None)) .ReturnsAsync(true); // Act await _receiver.Initialize(TimeSpan.FromSeconds(5)); // Assert _mockDatabase.Verify(db => db.StreamCreateConsumerGroupAsync(_queueId.ToString(), "consumer", "$", true, CommandFlags.None), Times.Once); } [Fact] public async Task MessagesDeliveredAsync_AcknowledgesMessages() { // Arrange var messages = new List { new RedisStreamBatchContainer(new StreamEntry("1-0", new NameValueEntry[2] {new NameValueEntry("namespace", "testNamespace"), new NameValueEntry("key", "testKey")})), new RedisStreamBatchContainer(new StreamEntry("2-0", new NameValueEntry[2] {new NameValueEntry("namespace", "testNamespace"), new NameValueEntry("key", "testKey")})) }; _mockDatabase.Setup(db => db.StreamAcknowledgeAsync(It.IsAny(), It.IsAny(), It.IsAny(), CommandFlags.None)) .ReturnsAsync(2); // Act await _receiver.MessagesDeliveredAsync(messages); // Assert _mockDatabase.Verify(db => db.StreamAcknowledgeAsync(_queueId.ToString(), "consumer", "1-0", CommandFlags.None), Times.Once); _mockDatabase.Verify(db => db.StreamAcknowledgeAsync(_queueId.ToString(), "consumer", "2-0", CommandFlags.None), Times.Once); } [Fact] public async Task Shutdown_WaitsForPendingTasks() { // Arrange var tcs = new TaskCompletionSource(); _mockDatabase.Setup(db => db.StreamReadGroupAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), CommandFlags.None)) .Returns(tcs.Task); // Act var getMessagesTask = _receiver.GetQueueMessagesAsync(10); await _receiver.Shutdown(TimeSpan.FromSeconds(5)); // Assert Assert.True(getMessagesTask.IsCompleted); } } }