using System; using System.Collections.Generic; using Microsoft.AspNetCore.Http; using PolyTrader.Web.Endpoints; using PolyTraderSharp.Services; using Xunit; namespace PolyTrader.Tests.WebUi { /// /// Der gemeinsame Schreibweg der Einstellungs-Endpunkte (#534). /// /// Der Kern ist nicht „meldet einen Fehler", sondern „lässt den Hauptspeicher in Ruhe": /// Vorher wurde die Änderung auch nach einem gescheiterten Schreibvorgang übernommen und als /// Erfolg gemeldet. Bei Risikolimits heißt das, dass das Modul mit Werten handelt, die nirgends /// stehen und nach einem Neustart nicht mehr rekonstruierbar sind. /// public class PersistenceGuardTests { private static TerminalLogger Logger() => new(); [Fact] public void Gelungenes_Schreiben_gibt_keine_Fehlerantwort() { bool geschrieben = false; var result = PersistenceGuard.Write(true, () => geschrieben = true, Logger(), "Testwert"); Assert.Null(result); // null = der Aufrufer darf nachziehen Assert.True(geschrieben); } [Fact] public void Ausnahme_beim_Schreiben_liefert_eine_Fehlerantwort() { var result = PersistenceGuard.Write( true, () => throw new InvalidOperationException("Verbindung weg"), Logger(), "CopyTrading-Einstellungen fuer Konto 1"); Assert.NotNull(result); Assert.IsAssignableFrom(result); Assert.Equal(StatusCodes.Status500InternalServerError, ((IStatusCodeHttpResult)result!).StatusCode); } [Fact] public void Fehlende_Ablage_wird_ebenso_abgelehnt() { bool geschrieben = false; // Ohne Repository waere die Aenderung rein fluechtig — also dasselbe Problem. var result = PersistenceGuard.Write(false, () => geschrieben = true, Logger(), "Testwert"); Assert.NotNull(result); Assert.Equal(StatusCodes.Status503ServiceUnavailable, ((IStatusCodeHttpResult)result!).StatusCode); Assert.False(geschrieben); } /// /// Das eigentliche Versprechen, nachgestellt am Ablauf des Endpunkts: Erst schreiben, den /// Hauptspeicher nur bei Erfolg nachziehen. /// [Theory] [InlineData(true)] [InlineData(false)] public void Hauptspeicher_wird_nur_bei_Erfolg_nachgezogen(bool schreibenGelingt) { var hauptspeicher = new Dictionary { [1] = 5.00m }; var result = PersistenceGuard.Write( true, () => { if (!schreibenGelingt) throw new InvalidOperationException("DB weg"); }, Logger(), "Risikolimit Konto 1"); if (result == null) hauptspeicher[1] = 7.50m; Assert.Equal(schreibenGelingt ? 7.50m : 5.00m, hauptspeicher[1]); } } }