Add RabbitMQ integration tests and URL parsing logic
Enhanced test coverage for RabbitMQ integration by adding: - New package references for dependency injection, logging, and RabbitMQ. - `EmailSenderCollection` and `EmailSenderFixture` for managing static client lifecycle in integration tests. - Integration tests for `EmailSender` and `OutgoingEmailPublisher` to verify connection management, message publishing, and serialization. - `EmailSenderUrlOverloadTests` to validate URL-based connection overload behavior. - `RabbitMqTestConfig` for centralized RabbitMQ test configuration. - Unit tests for URL parsing logic in `EmailSenderUrlParsingTests`. These changes improve reliability, maintainability, and test coverage for the messaging service.
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
using DigitalData.MessagingService.Client.DependencyInjection;
|
||||
using DigitalData.MessagingService.Publisher.Abstraction;
|
||||
|
||||
namespace DigitalData.MessagingService.Tests.Integration;
|
||||
|
||||
/// <summary>
|
||||
/// xUnit collection that serializes all <see cref="EmailSenderTests"/> so they share
|
||||
/// the same process-wide static state of <see cref="EmailSender.LazyProvider"/>.
|
||||
/// </summary>
|
||||
[CollectionDefinition(Name)]
|
||||
public sealed class EmailSenderCollection : ICollectionFixture<EmailSenderFixture>
|
||||
{
|
||||
public const string Name = "EmailSender";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fixture that connects <see cref="EmailSender"/> once before all tests in the collection run.
|
||||
/// </summary>
|
||||
public sealed class EmailSenderFixture
|
||||
{
|
||||
public EmailSenderFixture()
|
||||
{
|
||||
// EmailSender is a static class with a Lazy<IServiceProvider>.
|
||||
// ConnectRabbitMq can only be called successfully once per process.
|
||||
if (!EmailSender.IsConnected)
|
||||
{
|
||||
EmailSender.ConnectRabbitMq(cfg =>
|
||||
{
|
||||
cfg.HostName = RabbitMqTestConfig.HostName;
|
||||
cfg.Port = RabbitMqTestConfig.Port;
|
||||
cfg.UserName = RabbitMqTestConfig.UserName;
|
||||
cfg.Password = RabbitMqTestConfig.Password;
|
||||
cfg.VirtualHost = RabbitMqTestConfig.VirtualHost;
|
||||
cfg.QueueName = RabbitMqTestConfig.QueueName;
|
||||
cfg.ExchangeName = RabbitMqTestConfig.ExchangeName;
|
||||
cfg.RoutingKey = RabbitMqTestConfig.RoutingKey;
|
||||
cfg.DlqQueueName = RabbitMqTestConfig.DlqQueueName;
|
||||
cfg.DlqExchangeName = RabbitMqTestConfig.DlqExchangeName;
|
||||
cfg.DlqRoutingKey = RabbitMqTestConfig.DlqRoutingKey;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Integration tests for the <see cref="EmailSender"/> static client.
|
||||
/// All tests run inside <see cref="EmailSenderCollection"/> to share the single
|
||||
/// static connection established by <see cref="EmailSenderFixture"/>.
|
||||
/// </summary>
|
||||
[Collection(EmailSenderCollection.Name)]
|
||||
public sealed class EmailSenderTests
|
||||
{
|
||||
[Fact]
|
||||
public void IsConnected_AfterConnectRabbitMq_ReturnsTrue()
|
||||
{
|
||||
Assert.True(EmailSender.IsConnected);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ConnectRabbitMq_WhenAlreadyConnected_WithThrowException_ThrowsInvalidOperationException()
|
||||
{
|
||||
Assert.Throws<InvalidOperationException>(() =>
|
||||
EmailSender.ConnectRabbitMq(cfg => { }, OnReconnect.ThrowException));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ConnectRabbitMq_WhenAlreadyConnected_WithIgnore_DoesNotThrow()
|
||||
{
|
||||
var exception = Record.Exception(() =>
|
||||
EmailSender.ConnectRabbitMq(cfg => { }, OnReconnect.Ignore));
|
||||
|
||||
Assert.Null(exception);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Send_WithValidEmail_DoesNotThrow()
|
||||
{
|
||||
var email = new OutgoingEmailEvent
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
Recipient = "hakanttek@gmail.com",
|
||||
Subject = "EmailSender.Send Integration Test",
|
||||
Body = "<p>Sent via EmailSender static client.</p>",
|
||||
IsHtml = true,
|
||||
QueuedAt = DateTime.Now
|
||||
};
|
||||
|
||||
var exception = Record.Exception(() => EmailSender.Send(email));
|
||||
|
||||
Assert.Null(exception);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Send_WithPlainTextBody_DoesNotThrow()
|
||||
{
|
||||
var email = new OutgoingEmailEvent
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
Recipient = "hakanttek@gmail.com",
|
||||
Subject = "Plain Text Test",
|
||||
Body = "This is a plain text email.",
|
||||
IsHtml = false,
|
||||
QueuedAt = DateTime.Now
|
||||
};
|
||||
|
||||
var exception = Record.Exception(() => EmailSender.Send(email));
|
||||
|
||||
Assert.Null(exception);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user