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]);
}
}
}