using DigitalData.MessagingService.Application.Common.Dto; using DigitalData.MessagingService.Client; namespace DigitalData.MessagingService.Tests.Integration; /// /// xUnit collection that serializes all so they share /// the same process-wide static state of . /// [CollectionDefinition(Name)] public sealed class EmailSenderCollection : ICollectionFixture { public const string Name = "EmailSender"; } /// /// Fixture that connects once before all tests in the collection run. /// public sealed class EmailSenderFixture { public EmailSenderFixture() { // EmailSender is a static class with a Lazy. // 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; }); } } } /// /// Integration tests for the static client. /// All tests run inside to share the single /// static connection established by . /// [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(() => 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 EmailContext { Sender = new EmailAccountDto { Username = "test@example.com", Password = "password", SmtpServer = "smtp.example.com" }, Recipients = ["hakanttek@gmail.com"], Subject = "EmailSender.Send Integration Test", Body = "

Sent via EmailSender static client.

", IsHtml = true, }; var exception = Record.Exception(() => EmailSender.Send(email)); Assert.Null(exception); } [Fact] public void Send_WithPlainTextBody_DoesNotThrow() { var email = new EmailContext { Sender = new EmailAccountDto { Username = "test@example.com", Password = "password", SmtpServer = "smtp.example.com" }, Recipients = ["hakanttek@gmail.com"], Subject = "Plain Text Test", Body = "This is a plain text email.", IsHtml = false }; var exception = Record.Exception(() => EmailSender.Send(email)); Assert.Null(exception); } }