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")));
}