using Omika.App.Navigation; namespace Omika.Tests.Mobile.Local; /// /// Tests de l'abstraction de navigation : page initiale, sélection, changement /// de page, page active, fonctions secondaires smartphone. /// public class NavigationServiceTests { private readonly NavigationService _navigation; public NavigationServiceTests() { _navigation = new NavigationService(); } [Fact] public void PageInitiale_Home() { // Assert Assert.Equal(AppPage.Home, _navigation.CurrentPage); } [Fact] public void NavigationItems_ContientToutesLesPages() { // Assert Assert.Equal(7, _navigation.Items.Count); Assert.Contains(_navigation.Items, i => i.Page == AppPage.Home); Assert.Contains(_navigation.Items, i => i.Page == AppPage.Interventions); Assert.Contains(_navigation.Items, i => i.Page == AppPage.Dossiers); Assert.Contains(_navigation.Items, i => i.Page == AppPage.Collaborateurs); Assert.Contains(_navigation.Items, i => i.Page == AppPage.Clients); Assert.Contains(_navigation.Items, i => i.Page == AppPage.Sites); Assert.Contains(_navigation.Items, i => i.Page == AppPage.Parametres); } [Fact] public void NavigateTo_ChangePage() { // Act _navigation.NavigateTo(AppPage.Interventions); // Assert Assert.Equal(AppPage.Interventions, _navigation.CurrentPage); } [Fact] public void NavigateTo_MemePage_NeChangePas() { // Act _navigation.NavigateTo(AppPage.Home); // Assert : la page reste Home. Assert.Equal(AppPage.Home, _navigation.CurrentPage); } [Fact] public void NavigateTo_LeveEvenement() { // Arrange AppPage? received = null; _navigation.PageChanged += (_, page) => received = page; // Act _navigation.NavigateTo(AppPage.Dossiers); // Assert Assert.Equal(AppPage.Dossiers, received); } [Fact] public void FonctionsSecondaires_Accessibles() { // Assert : Sites et Paramètres sont secondaires (menu "Plus" smartphone). Assert.Contains(_navigation.SecondaryMobileItems, i => i.Page == AppPage.Sites); Assert.Contains(_navigation.SecondaryMobileItems, i => i.Page == AppPage.Parametres); } [Fact] public void FonctionsPrimaires_Maximum5() { // Assert : au plus 5 accès directs dans la barre basse smartphone. Assert.True(_navigation.PrimaryMobileItems.Count <= 5); } [Fact] public void FonctionsPrimaires_ContientAccesPrincipaux() { // Assert : Agenda, Interventions, Dossiers, Équipe sont primaires. Assert.Contains(_navigation.PrimaryMobileItems, i => i.Page == AppPage.Home); Assert.Contains(_navigation.PrimaryMobileItems, i => i.Page == AppPage.Interventions); Assert.Contains(_navigation.PrimaryMobileItems, i => i.Page == AppPage.Dossiers); Assert.Contains(_navigation.PrimaryMobileItems, i => i.Page == AppPage.Collaborateurs); } [Fact] public void Navigation_NeDeclencheAucunAppelAPI() { // Le NavigationService est purement visuel : il ne référence aucun client API. // Ce test vérifie simplement que naviguer ne lève pas d'exception et // que la page change sans effet de bord réseau. _navigation.NavigateTo(AppPage.Sites); Assert.Equal(AppPage.Sites, _navigation.CurrentPage); } [Fact] public void GoBack_SansHistorique_NeFaitRien() { // La page initiale est Home et l'historique est vide. Assert.False(_navigation.CanGoBack); // Act _navigation.GoBack(); // Assert Assert.Equal(AppPage.Home, _navigation.CurrentPage); } [Fact] public void GoBack_RetournePagePrecedente() { // Arrange : Home -> RendezVousDetail. _navigation.NavigateTo(AppPage.RendezVousDetail, Guid.NewGuid()); // Act _navigation.GoBack(); // Assert Assert.Equal(AppPage.Home, _navigation.CurrentPage); } [Fact] public void GoBack_RestaureParametre() { // Arrange : Home -> RendezVousDetail -> InterventionDetail. Guid rendezVousId = Guid.NewGuid(); _navigation.NavigateTo(AppPage.RendezVousDetail, rendezVousId); _navigation.NavigateTo(AppPage.InterventionDetail, Guid.NewGuid()); // Act _navigation.GoBack(); // Assert : retour au rendez-vous avec son paramètre d'origine. Assert.Equal(AppPage.RendezVousDetail, _navigation.CurrentPage); Assert.Equal(rendezVousId, _navigation.CurrentParameter); } [Fact] public void NavigateTo_EmpileHistorique() { // Arrange : Home -> Interventions -> InterventionDetail. _navigation.NavigateTo(AppPage.Interventions); _navigation.NavigateTo(AppPage.InterventionDetail, Guid.NewGuid()); // Act / Assert : deux retours successifs remontent l'historique. _navigation.GoBack(); Assert.Equal(AppPage.Interventions, _navigation.CurrentPage); _navigation.GoBack(); Assert.Equal(AppPage.Home, _navigation.CurrentPage); Assert.False(_navigation.CanGoBack); } [Fact] public void Replace_RemplaceSansEmpiler() { // Arrange : Home -> RendezVousDetail (historique = [Home]). _navigation.NavigateTo(AppPage.RendezVousDetail, Guid.NewGuid()); // Act : remplacement (ex. après la sauvegarde d'un formulaire). Guid newInterventionId = Guid.NewGuid(); _navigation.Replace(AppPage.InterventionDetail, newInterventionId); // Assert : la page courante est remplacée. Assert.Equal(AppPage.InterventionDetail, _navigation.CurrentPage); Assert.Equal(newInterventionId, _navigation.CurrentParameter); // Le retour revient à la page d'avant le rendez-vous (Home), pas au rendez-vous. _navigation.GoBack(); Assert.Equal(AppPage.Home, _navigation.CurrentPage); } [Fact] public void NavigateTo_MemePage_NeEmpilePas() { // Arrange : Home -> Interventions (Home est empilé). _navigation.NavigateTo(AppPage.Interventions); Assert.True(_navigation.CanGoBack); // Act : re-navigation sur la même page (aucune nouvelle entrée). _navigation.NavigateTo(AppPage.Interventions); // Assert : le retour revient à Home (une seule entrée empilée). _navigation.GoBack(); Assert.Equal(AppPage.Home, _navigation.CurrentPage); Assert.False(_navigation.CanGoBack); } }