using Microsoft.Extensions.Logging; using Omika.App.Services; namespace Omika.Tests.Mobile.Local; /// /// Tests de la journalisation applicative persistante. /// /// Enjeu : sans fichier de journal, un repli silencieux de la lecture de date /// (métadonnée absente, format non géré, échec de lecture) est indiscernable /// d'un fonctionnement normal sur un appareil réel. /// public class AppLogTests : IDisposable { private readonly string _directory; public AppLogTests() { _directory = Path.Combine(Path.GetTempPath(), "omika-log-tests", Guid.NewGuid().ToString("N")); } public void Dispose() { if (Directory.Exists(_directory)) { Directory.Delete(_directory, recursive: true); } GC.SuppressFinalize(this); } [Fact] public void Configure_CreeLeDossierEtRetourneLeFichierCourant() { string? path = AppLog.Configure(_directory); Assert.NotNull(path); Assert.True(Directory.Exists(_directory)); Assert.EndsWith(".log", path); } [Fact] public void Write_PersisteLaLigneSurDisque() { AppLog.Configure(_directory); AppLog.Write(LogLevel.Information, "TestCategorie", "DocumentDate: Source=SystemFallback"); string contenu = File.ReadAllText(AppLog.CurrentFilePath!); Assert.Contains("DocumentDate: Source=SystemFallback", contenu, StringComparison.Ordinal); Assert.Contains("[Information]", contenu, StringComparison.Ordinal); Assert.Contains("TestCategorie", contenu, StringComparison.Ordinal); } [Fact] public void AppFileLogger_EcritDansLeFichier() { AppLog.Configure(_directory); var logger = new AppFileLogger(); logger.LogInformation("DocumentDate: File={FileName}, Source={Source}", "IMG_1.jpg", "EXIF DateTimeOriginal"); string contenu = File.ReadAllText(AppLog.CurrentFilePath!); Assert.Contains("IMG_1.jpg", contenu, StringComparison.Ordinal); Assert.Contains("EXIF DateTimeOriginal", contenu, StringComparison.Ordinal); } [Fact] public void AppFileLogger_IgnoreLesNiveauxInferieursAInformation() { AppLog.Configure(_directory); var logger = new AppFileLogger(); logger.LogDebug("trace de debug non attendue"); Assert.False(logger.IsEnabled(LogLevel.Debug)); if (File.Exists(AppLog.CurrentFilePath!)) { Assert.DoesNotContain("trace de debug non attendue", File.ReadAllText(AppLog.CurrentFilePath!)); } } [Fact] public void Configure_PurgeLesJournauxTropAnciens() { Directory.CreateDirectory(_directory); string ancien = Path.Combine(_directory, "omika-20000101.log"); File.WriteAllText(ancien, "vieux journal"); File.SetLastWriteTime(ancien, DateTime.Now.AddDays(-10)); AppLog.Configure(_directory); Assert.False(File.Exists(ancien)); } [Fact] public void Write_NeLeveJamaisMemeSiLaDestinationEstInvalide() { // Un échec de journalisation ne doit jamais perturber l'utilisateur. AppLog.Configure("\0invalide\0"); AppLog.Write(LogLevel.Warning, "TestCategorie", "message"); } }