using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Headless;
using Avalonia.VisualTree;
using Omika.App.Local.Abstractions;
using Omika.App.Local.Models;
using Omika.App.Services;
using Omika.App.ViewModels;
using Omika.App.Views;
using Xunit;
namespace Omika.Tests.Mobile;
///
/// Fiche intervention : les cartes « Courriels » et « Rapports » passent par le
/// serveur (liste + création pour l'une, catalogue des modèles et champs calculés
/// côté serveur pour l'autre). Hors connexion elles deviennent INACTIVES — sans
/// jamais être masquées : l'action existe, elle est seulement momentanément
/// impossible.
///
///
/// Vérification faite sur la vue RÉELLE rendue (session Avalonia headless) avec le
/// vrai ViewModel : les liaisons XAML sont compilées, un faux DataContext ne
/// prouverait donc rien.
///
///
[Collection("ApplicationRuntimeContext")]
public sealed class InterventionDetailOfflineActionsTests : IDisposable
{
private readonly HeadlessUnitTestSession _session =
HeadlessUnitTestSession.StartNew(typeof(LayoutTestAppBuilder));
public void Dispose() => _session.Dispose();
private sealed class FauxReseau : INetworkConnectivity
{
public bool Online { get; set; } = true;
public Task IsOnlineAsync(CancellationToken cancellationToken = default)
=> Task.FromResult(Online);
}
/// État observé d'une carte, lu sur le thread Avalonia puis comparé hors session.
private sealed record EtatCarte(
string Libelle,
bool Actif,
bool Visible,
double Largeur,
double Hauteur,
double Opacite,
bool IndiceOuvrir);
///
/// ViewModel réel : seules les dépendances non utilisées par le rendu de la
/// fiche restent nulles (aucun chargement, aucun appel réseau n'est déclenché).
///
private static InterventionDetailViewModel CreerViewModel()
=> new(
null!, null!, null!, null!, null!, null!, null!, null!,
new PermissionService(), null!, null!, new FauxReseau())
{
Intervention = new InterventionDetail
{
InterventionGuid = Guid.NewGuid(),
Reference = "INT-001",
Titre = "Intervention",
Etat = "En cours"
}
};
/// Carte cliquable dont le libellé est exactement .
private static Button Carte(Visual racine, string titre)
=> racine.GetVisualDescendants()
.OfType