using Omika.Core.Interfaces; using Omika.Core.Services; namespace Omika.Tests.Services; /// /// Tests unitaires de : les validations qui /// échouent AVANT toute connexion SMTP (configuration incomplète, destinataire /// manquant) sont déterministes et testables sans serveur de messagerie. /// /// Depuis la refonte de la résolution SMTP, le message utilisateur NOMME le champ /// manquant (« Configuration SMTP « compte » incomplète : le serveur de messagerie /// n'est pas renseigné. ») : le message générique unique ne permettait pas de /// savoir quoi corriger, dans la fiche de la société ou dans les préférences. /// public class MailKitEmailSenderTests { private static SmtpConfiguration Config( string? serveur = "smtp.test", string? email = "expediteur@test.fr", string? login = "expediteur@test.fr") => new() { Id = "cfg", Email = email, Login = login, Serveur = serveur, Port = 587, Cryptage = 2 }; [Fact] public async Task EnvoyerAsync_SansServeur_LeveConfigurationIncomplete() { var sender = new MailKitEmailSender(); EmailEnvoiException ex = await Assert.ThrowsAsync(() => sender.EnvoyerAsync( new EmailMessage { Sujet = "Sujet", Destinataires = new[] { "dest@test.fr" } }, Config(serveur: null))); Assert.Equal(EmailEnvoiErreurType.ConfigurationIncomplete, ex.Type); Assert.StartsWith("Configuration SMTP", ex.Message); Assert.Contains("serveur", ex.Message, StringComparison.OrdinalIgnoreCase); } [Fact] public async Task EnvoyerAsync_SansDestinataire_LeveDestinataireInvalide() { var sender = new MailKitEmailSender(); EmailEnvoiException ex = await Assert.ThrowsAsync(() => sender.EnvoyerAsync( new EmailMessage { Sujet = "Sujet", Destinataires = [] }, Config())); Assert.Equal(EmailEnvoiErreurType.DestinataireInvalide, ex.Type); Assert.Equal("Veuillez renseigner au moins un destinataire.", ex.Message); } [Fact] public async Task EnvoyerAsync_SansExpediteur_LeveConfigurationIncomplete() { var sender = new MailKitEmailSender(); EmailEnvoiException ex = await Assert.ThrowsAsync(() => sender.EnvoyerAsync( new EmailMessage { Sujet = "Sujet", Destinataires = new[] { "dest@test.fr" } }, Config(email: null, login: null))); Assert.Equal(EmailEnvoiErreurType.ConfigurationIncomplete, ex.Type); } [Fact] public async Task EnvoyerAsync_SansMotDePasse_LeveConfigurationIncomplete() { var sender = new MailKitEmailSender(); EmailEnvoiException ex = await Assert.ThrowsAsync(() => sender.EnvoyerAsync( new EmailMessage { Sujet = "Sujet", Destinataires = new[] { "dest@test.fr" } }, Config())); Assert.Equal(EmailEnvoiErreurType.ConfigurationIncomplete, ex.Type); Assert.StartsWith("Configuration SMTP", ex.Message); Assert.Contains("mot de passe", ex.Message, StringComparison.OrdinalIgnoreCase); } // ===== Validation de configuration avant connexion (aucun appel SMTP) ===== [Fact] public async Task EnvoyerAsync_PortInvalide_LeveConfigurationIncomplete() { var sender = new MailKitEmailSender(); var config = new SmtpConfiguration { Id = "cfg", Email = "expediteur@test.fr", Login = "expediteur@test.fr", Serveur = "smtp.test", Port = 0, Cryptage = 2, MotDePasse = "secret" }; EmailEnvoiException ex = await Assert.ThrowsAsync(() => sender.EnvoyerAsync( new EmailMessage { Sujet = "Sujet", Destinataires = new[] { "dest@test.fr" } }, config)); Assert.Equal(EmailEnvoiErreurType.ConfigurationIncomplete, ex.Type); Assert.StartsWith("Configuration SMTP", ex.Message); Assert.Contains("port", ex.Message, StringComparison.OrdinalIgnoreCase); } [Fact] public async Task EnvoyerAsync_CryptageInvalide_LeveConfigurationIncomplete() { var sender = new MailKitEmailSender(); var config = new SmtpConfiguration { Id = "cfg", Email = "expediteur@test.fr", Login = "expediteur@test.fr", Serveur = "smtp.test", Port = 587, Cryptage = 9, MotDePasse = "secret" }; EmailEnvoiException ex = await Assert.ThrowsAsync(() => sender.EnvoyerAsync( new EmailMessage { Sujet = "Sujet", Destinataires = new[] { "dest@test.fr" } }, config)); Assert.Equal(EmailEnvoiErreurType.ConfigurationIncomplete, ex.Type); Assert.StartsWith("Configuration SMTP", ex.Message); Assert.Contains("cryptage", ex.Message, StringComparison.OrdinalIgnoreCase); } [Fact] public async Task EnvoyerAsync_LoginVideAvecMotDePasse_LeveConfigurationIncomplete() { var sender = new MailKitEmailSender(); var config = new SmtpConfiguration { Id = "cfg", Email = "expediteur@test.fr", Login = null, Serveur = "smtp.test", Port = 587, Cryptage = 2, MotDePasse = "secret" }; EmailEnvoiException ex = await Assert.ThrowsAsync(() => sender.EnvoyerAsync( new EmailMessage { Sujet = "Sujet", Destinataires = new[] { "dest@test.fr" } }, config)); Assert.Equal(EmailEnvoiErreurType.ConfigurationIncomplete, ex.Type); Assert.StartsWith("Configuration SMTP", ex.Message); Assert.Contains("login", ex.Message, StringComparison.OrdinalIgnoreCase); } }