Files
Omika/tests/Omika.Tests/Services/MailKitEmailSenderTests.cs
T
2026-10-23 18:46:50 +02:00

166 lines
6.0 KiB
C#

using Omika.Core.Interfaces;
using Omika.Core.Services;
namespace Omika.Tests.Services;
/// <summary>
/// Tests unitaires de <see cref="MailKitEmailSender"/> : 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.
/// </summary>
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<EmailEnvoiException>(() =>
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<EmailEnvoiException>(() =>
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<EmailEnvoiException>(() =>
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<EmailEnvoiException>(() =>
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<EmailEnvoiException>(() =>
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<EmailEnvoiException>(() =>
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<EmailEnvoiException>(() =>
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);
}
}