Files
DigitalData.MessagingService/tests/DigitalData.MessagingService.Tests/Integration/EmailSenderTests.cs
TekH d7878d8ff8 Refactor namespace and project structure
Replaced `DigitalData.MessagingService.Client.DependencyInjection`
namespace with `DigitalData.MessagingService.Client` across the
codebase to simplify and streamline the project structure.

Removed unused `Microsoft.Extensions.Logging` and `System`
dependencies from `EmailSender.cs`. Updated project references
in `DigitalData.MessagingService.Tests.csproj` to reflect the
namespace and project restructuring. Adjusted `using` directives
in test files to align with the new namespace.
2026-07-29 12:35:57 +02:00

111 lines
3.6 KiB
C#

using DigitalData.MessagingService.Client;
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);
}
}