using ClawdDotNet.App.Settings; using Shouldly; namespace ClawdDotNet.App.Tests.Settings; /// /// Was mit den Einstellungen geschieht, die es hier nicht mehr gibt (#528, Stufe 1). /// /// Der Anlass. Fünf Schlüssel sind aus in die /// Instanz gewandert. System.Text.Json überliest unbekannte Schlüssel wortlos, und /// Save schreibt sie danach nicht wieder — wer ein eigenes Log- oder /// Sicherungsverzeichnis eingetragen hatte, verlöre den Wert also, ohne es zu erfahren. /// Ein Umzug ohne Ausweichlogik ist in Ordnung; einer ohne Ansage nicht. /// /// Bewusst keine Übernahme in die Instanzen: Ein anwendungsweiter Pfad, in alle /// Instanzen kopiert, wäre wieder derselbe Ordner für alle — also genau der Zustand, den /// Stufe 1 beseitigt. /// public sealed class SettingsManagerTests : IDisposable { private readonly string _dir = Path.Combine( Path.GetTempPath(), "clawd-tests", "settings-" + Guid.NewGuid().ToString("N")[..8]); private string Datei => Path.Combine(_dir, "Settings.json"); public SettingsManagerTests() => Directory.CreateDirectory(_dir); public void Dispose() { try { Directory.Delete(_dir, recursive: true); } catch { /* Ein liegengebliebener Testordner faerbt keinen Lauf rot. */ } } private SettingsManager Geladen(string json) { File.WriteAllText(Datei, json); var manager = new SettingsManager(_dir); manager.Load(); return manager; } [Fact] public void Eine_alte_Datei_meldet_ihre_aufgegebenen_Schluessel() { var manager = Geladen(""" { "logDirectory": "/var/log/clawd", "backupDirectory": "/srv/sicherungen", "backupKeepCount": 30, "autoBackupEnabled": true, "autoBackupTime": "02:30", "minimumLogLevel": "Debug" } """); manager.AbandonedKeys.ShouldBe( ["logDirectory", "backupDirectory", "backupKeepCount", "autoBackupEnabled", "autoBackupTime"], ignoreOrder: true); } [Fact] public void Was_die_Datei_sonst_enthaelt_wird_weiter_gelesen() { // Die Ansage darf nichts daran ändern, dass der Rest ankommt. var manager = Geladen(""" { "logDirectory": "/var/log/clawd", "minimumLogLevel": "Debug", "maxLogLinesInUi": 4000 } """); manager.AppSettings.MinimumLogLevel.ShouldBe("Debug"); manager.AppSettings.MaxLogLinesInUi.ShouldBe(4000); } [Fact] public void Eine_frische_Datei_meldet_nichts() { Geladen("""{ "minimumLogLevel": "Info" }""").AbandonedKeys.ShouldBeEmpty(); } [Fact] public void Speichern_wird_die_aufgegebenen_Schluessel_los() { var manager = Geladen("""{ "logDirectory": "/var/log/clawd" }"""); manager.Save(); File.ReadAllText(Datei).ShouldNotContain("logDirectory"); // Und der zweite Ladevorgang hat nichts mehr zu melden. var erneut = new SettingsManager(_dir); erneut.Load(); erneut.AbandonedKeys.ShouldBeEmpty(); } [Fact] public void Eine_unlesbare_Datei_verhindert_den_Start_nicht() { var manager = Geladen("{ das ist kein JSON"); manager.AppSettings.MinimumLogLevel.ShouldBe("Info"); manager.AbandonedKeys.ShouldBeEmpty(); } }