using System.Reflection; using Omika.Core.Constants; using Omika.Core.Observability.Diagnostic; namespace Omika.Tests.Observability.Diagnostic; public class DeviceInfoProviderTests { [Fact] public void PortableProvider_ReturnsUsefulSnapshot() { var provider = new PortableDeviceInfoProvider(); DeviceInfoSnapshot snapshot = provider.GetSnapshot(); Assert.NotNull(snapshot.AppVersion); Assert.NotNull(snapshot.Platform); Assert.NotNull(snapshot.OperatingSystem); Assert.NotNull(snapshot.Architecture); } [Fact] public void Snapshot_ExposesNoForbiddenHardwareIdentifier() { string[] names = typeof(DeviceInfoSnapshot).GetProperties().Select(p => p.Name).ToArray(); Assert.DoesNotContain(names, n => n.Contains("Imei", StringComparison.OrdinalIgnoreCase) || n.Contains("Imsi", StringComparison.OrdinalIgnoreCase) || n.Contains("MacAddress", StringComparison.OrdinalIgnoreCase) || n.Contains("AdvertisingId", StringComparison.OrdinalIgnoreCase) || n.Contains("Serial", StringComparison.OrdinalIgnoreCase) || n.Contains("Sim", StringComparison.OrdinalIgnoreCase) || n.Contains("Fingerprint", StringComparison.OrdinalIgnoreCase)); } [Fact] public void PortableProvider_OperatingSystemIsCanonical_NotOsDescription() { var provider = new PortableDeviceInfoProvider(); DeviceInfoSnapshot snapshot = provider.GetSnapshot(); // Dimension analytique stable (Android/iOS/Windows/…) au lieu d'une chaîne // système longue et variable (ex. « Microsoft Windows 10.0.26200 »). Assert.Equal(snapshot.Platform, snapshot.OperatingSystem); Assert.DoesNotContain("Microsoft", snapshot.OperatingSystem, StringComparison.OrdinalIgnoreCase); } [Fact] public void PortableProvider_ScreenFieldsRemainNull() { // Le portable (Desktop) n'a pas d'écran mobile : les champs restent null. var provider = new PortableDeviceInfoProvider(); DeviceInfoSnapshot snapshot = provider.GetSnapshot(); Assert.Null(snapshot.ScreenWidth); Assert.Null(snapshot.ScreenHeight); Assert.Null(snapshot.LogicalWidth); Assert.Null(snapshot.LogicalHeight); Assert.Null(snapshot.DisplayScale); } [Fact] public void PortableProvider_AppVersionIsNotHardcoded() { var provider = new PortableDeviceInfoProvider(); DeviceInfoSnapshot snapshot = provider.GetSnapshot(); // Source réelle (assembly InformationalVersion) avec repli sur // ApplicationConstants.Version — plus une valeur « 1.0.0.0 » codée en dur. Assert.NotNull(snapshot.AppVersion); Assert.Equal(ApplicationConstants.Version, snapshot.AppVersion); } [Fact] public void ThrowingProvider_HostFallsBackToEmpty_NoThrow() { var host = new OmikaLocalDiagnostics( new LocalDiagnosticOptions { Directory = string.Empty }, deviceInfoProvider: new ThrowingDeviceInfoProvider()); Assert.Same(DeviceInfoSnapshot.Empty, host.DeviceInfo); } private sealed class ThrowingDeviceInfoProvider : IDeviceInfoProvider { public DeviceInfoSnapshot GetSnapshot() => throw new InvalidOperationException("provider défaillant (test)"); } }