using System.Net.Http; using Omika.App.Local.Abstractions; using Omika.App.Local.Services; namespace Omika.Tests.Mobile.Local; /// /// Tests du classement des erreurs : une indisponibilité du serveur — coupure réseau /// OU inscription incomplète (aucune URL d'API) — est un état dégradé journalisé en /// Warning/P2, jamais un incident ; une erreur métier conserve son message et sa /// gravité. /// /// Origine : ticket de production du 09/10 (AgendaViewModel), où l'absence d'URL /// d'API remontait en Error/P1 avec un message technique inactionnable. /// public class ReseauMessagesTests { [Fact] public void EstErreurReseau_HttpRequestException_Vrai() => Assert.True(ReseauMessages.EstErreurReseau(new HttpRequestException("Connection failure"))); [Fact] public void EstErreurReseau_ErreurMetier_Faux() => Assert.False(ReseauMessages.EstErreurReseau(new InvalidOperationException("panne métier"))); /// /// Une inscription incomplète n'est PAS une erreur réseau : l'appareil peut être /// parfaitement en ligne. La confondre ferait afficher « hors ligne » et masquerait /// l'action attendue (rescan du QR). /// [Fact] public void EstInscriptionIncomplete_ExceptionDediee_Vrai() { var ex = new MobileEnrollmentRequiredException(); Assert.True(ReseauMessages.EstInscriptionIncomplete(ex)); Assert.False(ReseauMessages.EstErreurReseau(ex)); // L'état reste une InvalidOperationException : les traitements existants qui // le considèrent comme non terminal (session jamais purgée) continuent de // fonctionner. Assert.IsAssignableFrom(ex); } [Fact] public void EstInscriptionIncomplete_InvalidOperationExceptionGenerique_Faux() => Assert.False(ReseauMessages.EstInscriptionIncomplete(new InvalidOperationException("panne métier"))); /// Le classement utilisé AVANT journalisation couvre les deux états dégradés. [Fact] public void EstIndisponibiliteServeur_CouvreReseauEtInscription() { Assert.True(ReseauMessages.EstIndisponibiliteServeur(new HttpRequestException("Connection failure"))); Assert.True(ReseauMessages.EstIndisponibiliteServeur(new MobileEnrollmentRequiredException())); Assert.False(ReseauMessages.EstIndisponibiliteServeur(new InvalidOperationException("panne métier"))); } [Fact] public void Traduire_EchecReseau_MessageStable() => Assert.Equal( "Hors ligne — impossible de contacter le serveur.", ReseauMessages.Traduire(new HttpRequestException("Connection failure"))); /// /// Le message technique « Aucune URL d'API Omika configurée… » n'indiquait pas le /// geste attendu : l'utilisateur reçoit désormais l'action à faire. /// [Fact] public void Traduire_InscriptionIncomplete_IndiqueLAction() => Assert.Equal( "Inscription incomplète — rescannez le QR code pour reconnecter l'application.", ReseauMessages.Traduire(new MobileEnrollmentRequiredException())); [Fact] public void Traduire_ErreurMetier_ConserveLeMessage() => Assert.Equal("panne métier", ReseauMessages.Traduire(new InvalidOperationException("panne métier"))); }