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

132 lines
4.3 KiB
C#

using Omika.Core.Contracts.Documents;
namespace Omika.Tests.Services;
/// <summary>
/// Verrouille la machine d'état de persistance du courriel (règles §1, §7-§9) :
/// <c>ME_EnvoyerMob</c> est INDÉPENDANT de <c>ME_Envoyer</c> (un envoi WinDev a
/// <c>ME_Envoyer=true</c> mais <c>ME_EnvoyerMob=false</c>).
///
/// <para>
/// Deux chemins donnent <c>ME_EnvoyerMob=true</c>, tous deux « envoyé depuis le
/// mobile » : (1) un envoi SMTP réussi par Omika ; (2) un envoi depuis une
/// MESSAGERIE EXTERNE confirmé par l'utilisateur (choix de messagerie
/// « Externe » — l'application n'a envoyé aucun courriel elle-même, elle
/// enregistre une déclaration).
/// </para>
/// </summary>
public class EmailEnregistrementStateMachineTests
{
// TEST MOBILE 1 : envoi réussi depuis Omika.
[Fact]
public void EnvoiReussiDepuisOmika_EnvoyerVrai_EnvoyerMobVrai_BrouillonFaux()
{
var enregistrement = new EmailEnregistrement
{
Brouillon = false,
Envoyer = true,
EnvoyerMob = true
};
Assert.True(enregistrement.Envoyer);
Assert.False(enregistrement.Brouillon);
Assert.True(enregistrement.EnvoyerMob);
}
// TEST MOBILE 2 : échec SMTP.
[Fact]
public void EchecSmtp_EnvoyerFaux_EnvoyerMobFaux_BrouillonVrai()
{
var enregistrement = new EmailEnregistrement
{
Brouillon = true,
Envoyer = false,
EnvoyerMob = false
};
Assert.False(enregistrement.Envoyer);
Assert.True(enregistrement.Brouillon);
Assert.False(enregistrement.EnvoyerMob);
}
// TEST MOBILE 3 : enregistrement sans envoi (brouillon).
[Fact]
public void EnregistrementSansEnvoi_EnvoyerFaux_EnvoyerMobFaux_BrouillonVrai()
{
var enregistrement = new EmailEnregistrement
{
Brouillon = true,
Envoyer = false,
EnvoyerMob = false
};
Assert.False(enregistrement.Envoyer);
Assert.True(enregistrement.Brouillon);
Assert.False(enregistrement.EnvoyerMob);
}
// TEST MOBILE 4 : un message envoyé par WinDev ne force jamais EnvoyerMob=true.
[Fact]
public void MessageEnvoyeParWinDev_EnvoyerVraiMaisEnvoyerMobFaux()
{
var enregistrement = new EmailEnregistrement
{
Brouillon = false,
Envoyer = true,
EnvoyerMob = false
};
// ME_EnvoyerMob est un champ DISTINCT de ME_Envoyer : il peut rester faux
// alors que le message a été envoyé par WinDev.
Assert.True(enregistrement.Envoyer);
Assert.False(enregistrement.EnvoyerMob);
}
// TEST MOBILE 4 (invariant) : EnvoyerMob n'est PAS dérivé de Envoyer.
[Fact]
public void EnvoyerMob_EstUnChampIndependantDeEnvoyer()
{
// Le record expose les deux drapeaux séparément : aucune dérivation
// EnvoyerMob = Envoyer n'est codée dans le contrat.
Assert.False(new EmailEnregistrement().EnvoyerMob);
Assert.False(new EmailEnregistrement().Envoyer);
}
// TEST MOBILE 5 : envoi déclaré depuis une MESSAGERIE EXTERNE (choix
// « Externe » + confirmation de l'utilisateur). Omika n'a envoyé aucun
// courriel, aucun expéditeur n'est connu, mais le message est bien « envoyé
// par le mobile » : EnvoyerMob = vrai, comme un envoi SMTP réussi.
[Fact]
public void EnvoiDeclareDepuisMessagerieExterne_EnvoyerMobVrai_SansExpediteur()
{
var enregistrement = new EmailEnregistrement
{
Brouillon = false,
Envoyer = true,
EnvoyerMob = true,
AdrExp = null
};
Assert.True(enregistrement.EnvoyerMob);
Assert.False(enregistrement.Brouillon);
Assert.Null(enregistrement.AdrExp);
}
// TEST MOBILE 5 (repli) : réponse « Non » à la confirmation — l'utilisateur
// n'a pas envoyé le courriel depuis sa messagerie : il reste un BROUILLON.
[Fact]
public void ReponseNonALaConfirmationExterne_ResteBrouillon()
{
var enregistrement = new EmailEnregistrement
{
Brouillon = true,
Envoyer = false,
EnvoyerMob = false
};
Assert.True(enregistrement.Brouillon);
Assert.False(enregistrement.Envoyer);
Assert.False(enregistrement.EnvoyerMob);
}
}