Files
Omika/tests/Omika.Tests/Mobile/Local/NavigationServiceTests.cs
T
2026-10-23 18:46:50 +02:00

203 lines
6.5 KiB
C#

using Omika.App.Navigation;
namespace Omika.Tests.Mobile.Local;
/// <summary>
/// Tests de l'abstraction de navigation : page initiale, sélection, changement
/// de page, page active, fonctions secondaires smartphone.
/// </summary>
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);
}
}