diff --git a/src/Core/AdminConsole/Services/EventLoggingListenerService.cs b/src/Core/AdminConsole/Services/EventLoggingListenerService.cs index ec2db121db..53ff3d4d0a 100644 --- a/src/Core/AdminConsole/Services/EventLoggingListenerService.cs +++ b/src/Core/AdminConsole/Services/EventLoggingListenerService.cs @@ -10,9 +10,9 @@ namespace Bit.Core.Services; public abstract class EventLoggingListenerService : BackgroundService { protected readonly IEventMessageHandler _handler; - protected ILogger _logger; + protected ILogger _logger; - protected EventLoggingListenerService(IEventMessageHandler handler, ILogger logger) + protected EventLoggingListenerService(IEventMessageHandler handler, ILogger logger) { _handler = handler; _logger = logger; diff --git a/src/Core/AdminConsole/Services/Implementations/EventIntegrations/AzureServiceBusEventListenerService.cs b/src/Core/AdminConsole/Services/Implementations/EventIntegrations/AzureServiceBusEventListenerService.cs index a4b83b8806..f5eb41c051 100644 --- a/src/Core/AdminConsole/Services/Implementations/EventIntegrations/AzureServiceBusEventListenerService.cs +++ b/src/Core/AdminConsole/Services/Implementations/EventIntegrations/AzureServiceBusEventListenerService.cs @@ -16,7 +16,8 @@ public class AzureServiceBusEventListenerService : EventLoggingL TConfiguration configuration, IEventMessageHandler handler, IAzureServiceBusService serviceBusService, - ILogger> logger) : base(handler, logger) + ILoggerFactory loggerFactory) + : base(handler, CreateLogger(loggerFactory, configuration)) { _processor = serviceBusService.CreateProcessor( topicName: configuration.EventTopicName, @@ -39,6 +40,12 @@ public class AzureServiceBusEventListenerService : EventLoggingL await base.StopAsync(cancellationToken); } + private static ILogger CreateLogger(ILoggerFactory loggerFactory, TConfiguration configuration) + { + return loggerFactory.CreateLogger( + categoryName: $"Bit.Core.Services.AzureServiceBusEventListenerService.{configuration.EventSubscriptionName}"); + } + internal Task ProcessErrorAsync(ProcessErrorEventArgs args) { _logger.LogError( diff --git a/src/Core/AdminConsole/Services/Implementations/EventIntegrations/AzureServiceBusIntegrationListenerService.cs b/src/Core/AdminConsole/Services/Implementations/EventIntegrations/AzureServiceBusIntegrationListenerService.cs index 6db811efd9..037ae7e647 100644 --- a/src/Core/AdminConsole/Services/Implementations/EventIntegrations/AzureServiceBusIntegrationListenerService.cs +++ b/src/Core/AdminConsole/Services/Implementations/EventIntegrations/AzureServiceBusIntegrationListenerService.cs @@ -14,16 +14,17 @@ public class AzureServiceBusIntegrationListenerService : Backgro private readonly IAzureServiceBusService _serviceBusService; private readonly IIntegrationHandler _handler; private readonly ServiceBusProcessor _processor; - private readonly ILogger> _logger; + private readonly ILogger _logger; public AzureServiceBusIntegrationListenerService( TConfiguration configuration, IIntegrationHandler handler, IAzureServiceBusService serviceBusService, - ILogger> logger) + ILoggerFactory loggerFactory) { _handler = handler; - _logger = logger; + _logger = loggerFactory.CreateLogger( + categoryName: $"Bit.Core.Services.AzureServiceBusIntegrationListenerService.{configuration.IntegrationSubscriptionName}"); _maxRetries = configuration.MaxRetries; _serviceBusService = serviceBusService; diff --git a/src/Core/AdminConsole/Services/Implementations/EventIntegrations/RabbitMqEventListenerService.cs b/src/Core/AdminConsole/Services/Implementations/EventIntegrations/RabbitMqEventListenerService.cs index 09ce4ce767..5b089b06a6 100644 --- a/src/Core/AdminConsole/Services/Implementations/EventIntegrations/RabbitMqEventListenerService.cs +++ b/src/Core/AdminConsole/Services/Implementations/EventIntegrations/RabbitMqEventListenerService.cs @@ -19,7 +19,8 @@ public class RabbitMqEventListenerService : EventLoggingListener IEventMessageHandler handler, TConfiguration configuration, IRabbitMqService rabbitMqService, - ILogger> logger) : base(handler, logger) + ILoggerFactory loggerFactory) + : base(handler, CreateLogger(loggerFactory, configuration)) { _queueName = configuration.EventQueueName; _rabbitMqService = rabbitMqService; @@ -66,4 +67,10 @@ public class RabbitMqEventListenerService : EventLoggingListener } base.Dispose(); } + + private static ILogger CreateLogger(ILoggerFactory loggerFactory, TConfiguration configuration) + { + return loggerFactory.CreateLogger( + categoryName: $"Bit.Core.Services.RabbitMqEventListenerService.{configuration.EventQueueName}"); + } } diff --git a/src/Core/AdminConsole/Services/Implementations/EventIntegrations/RabbitMqIntegrationListenerService.cs b/src/Core/AdminConsole/Services/Implementations/EventIntegrations/RabbitMqIntegrationListenerService.cs index e8f368fbe5..59c8782985 100644 --- a/src/Core/AdminConsole/Services/Implementations/EventIntegrations/RabbitMqIntegrationListenerService.cs +++ b/src/Core/AdminConsole/Services/Implementations/EventIntegrations/RabbitMqIntegrationListenerService.cs @@ -20,14 +20,14 @@ public class RabbitMqIntegrationListenerService : BackgroundServ private readonly IIntegrationHandler _handler; private readonly Lazy> _lazyChannel; private readonly IRabbitMqService _rabbitMqService; - private readonly ILogger> _logger; + private readonly ILogger _logger; private readonly TimeProvider _timeProvider; public RabbitMqIntegrationListenerService( IIntegrationHandler handler, TConfiguration configuration, IRabbitMqService rabbitMqService, - ILogger> logger, + ILoggerFactory loggerFactory, TimeProvider timeProvider) { _handler = handler; @@ -36,9 +36,10 @@ public class RabbitMqIntegrationListenerService : BackgroundServ _retryQueueName = configuration.IntegrationRetryQueueName; _queueName = configuration.IntegrationQueueName; _rabbitMqService = rabbitMqService; - _logger = logger; _timeProvider = timeProvider; _lazyChannel = new Lazy>(() => _rabbitMqService.CreateChannelAsync()); + _logger = loggerFactory.CreateLogger( + categoryName: $"Bit.Core.Services.RabbitMqIntegrationListenerService.{configuration.IntegrationQueueName}"); ; } public override async Task StartAsync(CancellationToken cancellationToken) diff --git a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs index 48d3304ab0..c4e7009b4f 100644 --- a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs +++ b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs @@ -890,7 +890,7 @@ public static class ServiceCollectionExtensions configuration: listenerConfiguration, handler: provider.GetRequiredKeyedService(serviceKey: listenerConfiguration.RoutingKey), serviceBusService: provider.GetRequiredService(), - logger: provider.GetRequiredService>>() + loggerFactory: provider.GetRequiredService() ) ) ); @@ -900,7 +900,7 @@ public static class ServiceCollectionExtensions configuration: listenerConfiguration, handler: provider.GetRequiredService>(), serviceBusService: provider.GetRequiredService(), - logger: provider.GetRequiredService>>() + loggerFactory: provider.GetRequiredService() ) ) ); @@ -941,7 +941,7 @@ public static class ServiceCollectionExtensions handler: provider.GetRequiredService(), configuration: repositoryConfiguration, rabbitMqService: provider.GetRequiredService(), - logger: provider.GetRequiredService>>() + loggerFactory: provider.GetRequiredService() ) ) ); @@ -958,7 +958,7 @@ public static class ServiceCollectionExtensions configuration: repositoryConfiguration, handler: provider.GetRequiredService(), serviceBusService: provider.GetRequiredService(), - logger: provider.GetRequiredService>>() + loggerFactory: provider.GetRequiredService() ) ) ); @@ -992,7 +992,7 @@ public static class ServiceCollectionExtensions handler: provider.GetRequiredKeyedService(serviceKey: listenerConfiguration.RoutingKey), configuration: listenerConfiguration, rabbitMqService: provider.GetRequiredService(), - logger: provider.GetRequiredService>>() + loggerFactory: provider.GetRequiredService() ) ) ); @@ -1002,7 +1002,7 @@ public static class ServiceCollectionExtensions handler: provider.GetRequiredService>(), configuration: listenerConfiguration, rabbitMqService: provider.GetRequiredService(), - logger: provider.GetRequiredService>>(), + loggerFactory: provider.GetRequiredService(), timeProvider: provider.GetRequiredService() ) ) diff --git a/test/Core.Test/AdminConsole/Services/AzureServiceBusEventListenerServiceTests.cs b/test/Core.Test/AdminConsole/Services/AzureServiceBusEventListenerServiceTests.cs index fb0adc2119..c6ef3063e2 100644 --- a/test/Core.Test/AdminConsole/Services/AzureServiceBusEventListenerServiceTests.cs +++ b/test/Core.Test/AdminConsole/Services/AzureServiceBusEventListenerServiceTests.cs @@ -1,4 +1,6 @@ -using System.Text.Json; +#nullable enable + +using System.Text.Json; using Azure.Messaging.ServiceBus; using Bit.Core.AdminConsole.Models.Data.EventIntegrations; using Bit.Core.Models.Data; @@ -17,14 +19,31 @@ public class AzureServiceBusEventListenerServiceTests { private const string _messageId = "messageId"; private readonly TestListenerConfiguration _config = new(); + private readonly ILogger _logger = Substitute.For(); private SutProvider> GetSutProvider() { + var loggerFactory = Substitute.For(); + loggerFactory.CreateLogger().ReturnsForAnyArgs(_logger); return new SutProvider>() .SetDependency(_config) + .SetDependency(loggerFactory) .Create(); } + [Fact] + public void Constructor_CreatesLogWithCorrectCategory() + { + var sutProvider = GetSutProvider(); + + var fullName = typeof(AzureServiceBusEventListenerService<>).FullName ?? ""; + var tickIndex = fullName.IndexOf('`'); + var cleanedName = tickIndex >= 0 ? fullName.Substring(0, tickIndex) : fullName; + var categoryName = cleanedName + '.' + _config.EventSubscriptionName; + + sutProvider.GetDependency().Received(1).CreateLogger(categoryName); + } + [Fact] public void Constructor_CreatesProcessor() { @@ -44,12 +63,12 @@ public class AzureServiceBusEventListenerServiceTests await sutProvider.Sut.ProcessErrorAsync(args); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any>()); + Arg.Any>()); } [Fact] @@ -58,26 +77,26 @@ public class AzureServiceBusEventListenerServiceTests var sutProvider = GetSutProvider(); await sutProvider.Sut.ProcessReceivedMessageAsync(string.Empty, _messageId); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any>()); + Arg.Any>()); } [Fact] public async Task ProcessReceivedMessageAsync_InvalidJson_LogsError() { var sutProvider = GetSutProvider(); - await sutProvider.Sut.ProcessReceivedMessageAsync("{ Inavlid JSON }", _messageId); + await sutProvider.Sut.ProcessReceivedMessageAsync("{ Invalid JSON }", _messageId); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), - Arg.Is(o => o.ToString().Contains("Invalid JSON")), + Arg.Is(o => (o.ToString() ?? "").Contains("Invalid JSON")), Arg.Any(), - Arg.Any>()); + Arg.Any>()); } [Fact] @@ -89,12 +108,12 @@ public class AzureServiceBusEventListenerServiceTests _messageId ); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any>()); + Arg.Any>()); } [Fact] @@ -106,12 +125,12 @@ public class AzureServiceBusEventListenerServiceTests _messageId ); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any>()); + Arg.Any>()); } [Theory, BitAutoData] diff --git a/test/Core.Test/AdminConsole/Services/AzureServiceBusIntegrationListenerServiceTests.cs b/test/Core.Test/AdminConsole/Services/AzureServiceBusIntegrationListenerServiceTests.cs index f450863ebf..23627f3962 100644 --- a/test/Core.Test/AdminConsole/Services/AzureServiceBusIntegrationListenerServiceTests.cs +++ b/test/Core.Test/AdminConsole/Services/AzureServiceBusIntegrationListenerServiceTests.cs @@ -1,5 +1,6 @@ #nullable enable +using System.Text.Json; using Azure.Messaging.ServiceBus; using Bit.Core.AdminConsole.Models.Data.EventIntegrations; using Bit.Core.Services; @@ -7,6 +8,7 @@ using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Microsoft.Extensions.Logging; using NSubstitute; +using NSubstitute.ExceptionExtensions; using Xunit; namespace Bit.Core.Test.Services; @@ -15,18 +17,35 @@ namespace Bit.Core.Test.Services; public class AzureServiceBusIntegrationListenerServiceTests { private readonly IIntegrationHandler _handler = Substitute.For(); + private readonly ILogger _logger = Substitute.For(); private readonly IAzureServiceBusService _serviceBusService = Substitute.For(); private readonly TestListenerConfiguration _config = new(); private SutProvider> GetSutProvider() { + var loggerFactory = Substitute.For(); + loggerFactory.CreateLogger().ReturnsForAnyArgs(_logger); return new SutProvider>() .SetDependency(_config) + .SetDependency(loggerFactory) .SetDependency(_handler) .SetDependency(_serviceBusService) .Create(); } + [Fact] + public void Constructor_CreatesLogWithCorrectCategory() + { + var sutProvider = GetSutProvider(); + + var fullName = typeof(AzureServiceBusIntegrationListenerService<>).FullName ?? ""; + var tickIndex = fullName.IndexOf('`'); + var cleanedName = tickIndex >= 0 ? fullName.Substring(0, tickIndex) : fullName; + var categoryName = cleanedName + '.' + _config.IntegrationSubscriptionName; + + sutProvider.GetDependency().Received(1).CreateLogger(categoryName); + } + [Fact] public void Constructor_CreatesProcessor() { @@ -45,7 +64,7 @@ public class AzureServiceBusIntegrationListenerServiceTests var sutProvider = GetSutProvider(); await sutProvider.Sut.ProcessErrorAsync(args); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), Arg.Any(), @@ -63,12 +82,13 @@ public class AzureServiceBusIntegrationListenerServiceTests result.Retryable = false; _handler.HandleAsync(Arg.Any()).Returns(result); - var expected = (IntegrationMessage)IntegrationMessage.FromJson(message.ToJson())!; + var expected = IntegrationMessage.FromJson(message.ToJson()); + Assert.NotNull(expected); Assert.False(await sutProvider.Sut.HandleMessageAsync(message.ToJson())); await _handler.Received(1).HandleAsync(Arg.Is(expected.ToJson())); - await _serviceBusService.DidNotReceiveWithAnyArgs().PublishToRetryAsync(default!); + await _serviceBusService.DidNotReceiveWithAnyArgs().PublishToRetryAsync(Arg.Any()); } [Theory, BitAutoData] @@ -81,12 +101,13 @@ public class AzureServiceBusIntegrationListenerServiceTests _handler.HandleAsync(Arg.Any()).Returns(result); - var expected = (IntegrationMessage)IntegrationMessage.FromJson(message.ToJson())!; + var expected = IntegrationMessage.FromJson(message.ToJson()); + Assert.NotNull(expected); Assert.False(await sutProvider.Sut.HandleMessageAsync(message.ToJson())); await _handler.Received(1).HandleAsync(Arg.Is(expected.ToJson())); - await _serviceBusService.DidNotReceiveWithAnyArgs().PublishToRetryAsync(default!); + await _serviceBusService.DidNotReceiveWithAnyArgs().PublishToRetryAsync(Arg.Any()); } [Theory, BitAutoData] @@ -99,7 +120,8 @@ public class AzureServiceBusIntegrationListenerServiceTests result.Retryable = true; _handler.HandleAsync(Arg.Any()).Returns(result); - var expected = (IntegrationMessage)IntegrationMessage.FromJson(message.ToJson())!; + var expected = IntegrationMessage.FromJson(message.ToJson()); + Assert.NotNull(expected); Assert.True(await sutProvider.Sut.HandleMessageAsync(message.ToJson())); @@ -114,11 +136,30 @@ public class AzureServiceBusIntegrationListenerServiceTests var result = new IntegrationHandlerResult(true, message); _handler.HandleAsync(Arg.Any()).Returns(result); - var expected = (IntegrationMessage)IntegrationMessage.FromJson(message.ToJson())!; + var expected = IntegrationMessage.FromJson(message.ToJson()); + Assert.NotNull(expected); Assert.True(await sutProvider.Sut.HandleMessageAsync(message.ToJson())); await _handler.Received(1).HandleAsync(Arg.Is(expected.ToJson())); - await _serviceBusService.DidNotReceiveWithAnyArgs().PublishToRetryAsync(default!); + await _serviceBusService.DidNotReceiveWithAnyArgs().PublishToRetryAsync(Arg.Any()); + } + + [Fact] + public async Task HandleMessageAsync_UnknownError_LogsError() + { + var sutProvider = GetSutProvider(); + _handler.HandleAsync(Arg.Any()).ThrowsAsync(); + + Assert.True(await sutProvider.Sut.HandleMessageAsync("Bad JSON")); + + _logger.Received(1).Log( + LogLevel.Error, + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any>()); + + await _serviceBusService.DidNotReceiveWithAnyArgs().PublishToRetryAsync(Arg.Any()); } } diff --git a/test/Core.Test/AdminConsole/Services/RabbitMqEventListenerServiceTests.cs b/test/Core.Test/AdminConsole/Services/RabbitMqEventListenerServiceTests.cs index cf1d8f6a0e..22e297a00d 100644 --- a/test/Core.Test/AdminConsole/Services/RabbitMqEventListenerServiceTests.cs +++ b/test/Core.Test/AdminConsole/Services/RabbitMqEventListenerServiceTests.cs @@ -1,4 +1,6 @@ -using System.Text.Json; +#nullable enable + +using System.Text.Json; using Bit.Core.AdminConsole.Models.Data.EventIntegrations; using Bit.Core.Models.Data; using Bit.Core.Services; @@ -17,14 +19,31 @@ namespace Bit.Core.Test.Services; public class RabbitMqEventListenerServiceTests { private readonly TestListenerConfiguration _config = new(); + private readonly ILogger _logger = Substitute.For(); private SutProvider> GetSutProvider() { + var loggerFactory = Substitute.For(); + loggerFactory.CreateLogger().ReturnsForAnyArgs(_logger); return new SutProvider>() .SetDependency(_config) + .SetDependency(loggerFactory) .Create(); } + [Fact] + public void Constructor_CreatesLogWithCorrectCategory() + { + var sutProvider = GetSutProvider(); + + var fullName = typeof(RabbitMqEventListenerService<>).FullName ?? ""; + var tickIndex = fullName.IndexOf('`'); + var cleanedName = tickIndex >= 0 ? fullName.Substring(0, tickIndex) : fullName; + var categoryName = cleanedName + '.' + _config.EventQueueName; + + sutProvider.GetDependency().Received(1).CreateLogger(categoryName); + } + [Fact] public async Task StartAsync_CreatesQueue() { @@ -53,12 +72,12 @@ public class RabbitMqEventListenerServiceTests await sutProvider.Sut.ProcessReceivedMessageAsync(eventArgs); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any>()); + Arg.Any>()); } [Fact] @@ -76,12 +95,12 @@ public class RabbitMqEventListenerServiceTests await sutProvider.Sut.ProcessReceivedMessageAsync(eventArgs); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), - Arg.Is(o => o.ToString().Contains("Invalid JSON")), + Arg.Is(o => (o.ToString() ?? "").Contains("Invalid JSON")), Arg.Any(), - Arg.Any>()); + Arg.Any>()); } [Fact] @@ -99,12 +118,12 @@ public class RabbitMqEventListenerServiceTests await sutProvider.Sut.ProcessReceivedMessageAsync(eventArgs); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any>()); + Arg.Any>()); } [Fact] @@ -122,12 +141,12 @@ public class RabbitMqEventListenerServiceTests await sutProvider.Sut.ProcessReceivedMessageAsync(eventArgs); - sutProvider.GetDependency>>().Received(1).Log( + _logger.Received(1).Log( LogLevel.Error, Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any>()); + Arg.Any>()); } [Theory, BitAutoData] diff --git a/test/Core.Test/AdminConsole/Services/RabbitMqIntegrationListenerServiceTests.cs b/test/Core.Test/AdminConsole/Services/RabbitMqIntegrationListenerServiceTests.cs index df40e17dd4..5fcd121252 100644 --- a/test/Core.Test/AdminConsole/Services/RabbitMqIntegrationListenerServiceTests.cs +++ b/test/Core.Test/AdminConsole/Services/RabbitMqIntegrationListenerServiceTests.cs @@ -1,9 +1,12 @@ -using System.Text; +#nullable enable + +using System.Text; using Bit.Core.AdminConsole.Models.Data.EventIntegrations; using Bit.Core.Services; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Bit.Test.Common.Helpers; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Time.Testing; using NSubstitute; using RabbitMQ.Client; @@ -17,14 +20,18 @@ public class RabbitMqIntegrationListenerServiceTests { private readonly DateTime _now = new DateTime(2014, 3, 2, 1, 0, 0, DateTimeKind.Utc); private readonly IIntegrationHandler _handler = Substitute.For(); + private readonly ILogger _logger = Substitute.For(); private readonly IRabbitMqService _rabbitMqService = Substitute.For(); private readonly TestListenerConfiguration _config = new(); private SutProvider> GetSutProvider() { + var loggerFactory = Substitute.For(); + loggerFactory.CreateLogger().ReturnsForAnyArgs(_logger); var sutProvider = new SutProvider>() .SetDependency(_config) .SetDependency(_handler) + .SetDependency(loggerFactory) .SetDependency(_rabbitMqService) .WithFakeTimeProvider() .Create(); @@ -33,6 +40,19 @@ public class RabbitMqIntegrationListenerServiceTests return sutProvider; } + [Fact] + public void Constructor_CreatesLogWithCorrectCategory() + { + var sutProvider = GetSutProvider(); + + var fullName = typeof(RabbitMqIntegrationListenerService<>).FullName ?? ""; + var tickIndex = fullName.IndexOf('`'); + var cleanedName = tickIndex >= 0 ? fullName.Substring(0, tickIndex) : fullName; + var categoryName = cleanedName + '.' + _config.IntegrationQueueName; + + sutProvider.GetDependency().Received(1).CreateLogger(categoryName); + } + [Fact] public async Task StartAsync_CreatesQueues() { @@ -71,6 +91,7 @@ public class RabbitMqIntegrationListenerServiceTests _handler.HandleAsync(Arg.Any()).Returns(result); var expected = IntegrationMessage.FromJson(message.ToJson()); + Assert.NotNull(expected); await sutProvider.Sut.ProcessReceivedMessageAsync(eventArgs, cancellationToken); @@ -81,10 +102,17 @@ public class RabbitMqIntegrationListenerServiceTests Arg.Is(AssertHelper.AssertPropertyEqual(expected, new[] { "DelayUntilDate" })), Arg.Any()); + _logger.Received().Log( + LogLevel.Warning, + Arg.Any(), + Arg.Is(o => (o.ToString() ?? "").Contains("Non-retryable failure")), + Arg.Any(), + Arg.Any>()); + await _rabbitMqService.DidNotReceiveWithAnyArgs() - .RepublishToRetryQueueAsync(default, default); + .RepublishToRetryQueueAsync(Arg.Any(), Arg.Any()); await _rabbitMqService.DidNotReceiveWithAnyArgs() - .PublishToRetryAsync(default, default, default); + .PublishToRetryAsync(Arg.Any(), Arg.Any(), Arg.Any()); } [Theory, BitAutoData] @@ -110,6 +138,7 @@ public class RabbitMqIntegrationListenerServiceTests _handler.HandleAsync(Arg.Any()).Returns(result); var expected = IntegrationMessage.FromJson(message.ToJson()); + Assert.NotNull(expected); await sutProvider.Sut.ProcessReceivedMessageAsync(eventArgs, cancellationToken); @@ -119,10 +148,17 @@ public class RabbitMqIntegrationListenerServiceTests Arg.Is(AssertHelper.AssertPropertyEqual(expected, new[] { "DelayUntilDate" })), Arg.Any()); + _logger.Received().Log( + LogLevel.Warning, + Arg.Any(), + Arg.Is(o => (o.ToString() ?? "").Contains("Max retry attempts reached")), + Arg.Any(), + Arg.Any>()); + await _rabbitMqService.DidNotReceiveWithAnyArgs() - .RepublishToRetryQueueAsync(default, default); + .RepublishToRetryQueueAsync(Arg.Any(), Arg.Any()); await _rabbitMqService.DidNotReceiveWithAnyArgs() - .PublishToRetryAsync(default, default, default); + .PublishToRetryAsync(Arg.Any(), Arg.Any(), Arg.Any()); } [Theory, BitAutoData] @@ -149,6 +185,7 @@ public class RabbitMqIntegrationListenerServiceTests _handler.HandleAsync(Arg.Any()).Returns(result); var expected = IntegrationMessage.FromJson(message.ToJson()); + Assert.NotNull(expected); await sutProvider.Sut.ProcessReceivedMessageAsync(eventArgs, cancellationToken); @@ -161,9 +198,9 @@ public class RabbitMqIntegrationListenerServiceTests Arg.Any()); await _rabbitMqService.DidNotReceiveWithAnyArgs() - .RepublishToRetryQueueAsync(default, default); + .RepublishToRetryQueueAsync(Arg.Any(), Arg.Any()); await _rabbitMqService.DidNotReceiveWithAnyArgs() - .PublishToDeadLetterAsync(default, default, default); + .PublishToDeadLetterAsync(Arg.Any(), Arg.Any(), Arg.Any()); } [Theory, BitAutoData] @@ -191,11 +228,11 @@ public class RabbitMqIntegrationListenerServiceTests await _handler.Received(1).HandleAsync(Arg.Is(message.ToJson())); await _rabbitMqService.DidNotReceiveWithAnyArgs() - .RepublishToRetryQueueAsync(default, default); + .RepublishToRetryQueueAsync(Arg.Any(), Arg.Any()); await _rabbitMqService.DidNotReceiveWithAnyArgs() - .PublishToRetryAsync(default, default, default); + .PublishToRetryAsync(Arg.Any(), Arg.Any(), Arg.Any()); await _rabbitMqService.DidNotReceiveWithAnyArgs() - .PublishToDeadLetterAsync(default, default, default); + .PublishToDeadLetterAsync(Arg.Any(), Arg.Any(), Arg.Any()); } [Theory, BitAutoData] @@ -221,10 +258,10 @@ public class RabbitMqIntegrationListenerServiceTests await _rabbitMqService.Received(1) .RepublishToRetryQueueAsync(Arg.Any(), Arg.Any()); - await _handler.DidNotReceiveWithAnyArgs().HandleAsync(default); + await _handler.DidNotReceiveWithAnyArgs().HandleAsync(Arg.Any()); await _rabbitMqService.DidNotReceiveWithAnyArgs() - .PublishToRetryAsync(default, default, default); + .PublishToRetryAsync(Arg.Any(), Arg.Any(), Arg.Any()); await _rabbitMqService.DidNotReceiveWithAnyArgs() - .PublishToDeadLetterAsync(default, default, default); + .PublishToDeadLetterAsync(Arg.Any(), Arg.Any(), Arg.Any()); } }