Files
PolyTraderSharp/tests/PolyTrader.Tests/SettingsDefaultsTests.cs
T
RichardandClaude Opus 4.8 38f609ed31 CopyTrading Slice 1: Settings-Fundament + detaillierte Erklärungen
Umsetzung des Fable-Plans, Start mit dem risikoarmen Settings-Fundament
(kein Hot-Path/CLOB-Verhalten geändert):

- Alle Copytrading-Settings (alt + neu) haben jetzt [Description]/[DisplayName] ->
  im PropertyGrid als Erklärung sichtbar (Richards Vorgabe). Test erzwingt, dass
  jede einstellbare Option eine Beschreibung trägt.
- ProfitTarget-Default -> 9999 (praktisch deaktiviert); Migration setzt zusätzlich
  bestehende Zeilen per SQL auf 9999 (Entscheidung 2). Take-Profit-LOGIK folgt.
- Neue Account-Settings (noch nicht verdrahtet, für Phase 0.1/1.3/2):
  SellFloorPct (15), MaxSpreadPct (5), MinSellRatioPct (10).
- Neue Master-Trader-Settings: AutoPauseEnabled (Default AN, per Master abschaltbar,
  Entscheidung 3) + MakerEntry (Default aus, Entscheidung 4).
- EF-Migration AddCopytradingBehaviorSettings (neue Spalten + sinnvolle Defaults
  fuer Bestandszeilen) erstellt und auf MySQL angewendet.
- Erklärung dokumentiert einen gefundenen Skalen-Verdacht: PreRedeemLimit wird
  gegen den 0-1-Preis verglichen; Alt-Werte 99.5 triggern nie (-> ggf. 0.995).

Tests: 86 gruen. Build/Smoke gruen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 09:44:50 +02:00

54 lines
1.8 KiB
C#

using System.ComponentModel;
using System.Linq;
using System.Reflection;
using PolyTraderSharp.Models;
using Xunit;
namespace PolyTrader.Tests
{
/// <summary>
/// Fixiert die entscheidungsrelevanten Default-Werte und stellt sicher, dass alle
/// einstellbaren Settings eine [Description] als Erklärung tragen (Richards Vorgabe).
/// </summary>
public class SettingsDefaultsTests
{
[Fact]
public void ProfitTarget_defaults_to_9999_inactive()
{
Assert.Equal(9999m, new CopyTradingAccountSettings().ProfitTarget);
}
[Fact]
public void New_account_settings_have_expected_defaults()
{
var s = new CopyTradingAccountSettings();
Assert.Equal(15.0m, s.SellFloorPct);
Assert.Equal(5.0m, s.MaxSpreadPct);
Assert.Equal(10.0m, s.MinSellRatioPct);
}
[Fact]
public void Master_auto_pause_is_on_by_default_maker_off()
{
var t = new TrackedTrader();
Assert.True(t.AutoPauseEnabled);
Assert.False(t.MakerEntry);
}
[Theory]
[InlineData(typeof(CopyTradingAccountSettings))]
[InlineData(typeof(TrackedTrader))]
public void All_browsable_writable_settings_have_a_description(System.Type type)
{
var missing = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.CanWrite)
.Where(p => p.GetCustomAttribute<BrowsableAttribute>()?.Browsable != false)
.Where(p => string.IsNullOrWhiteSpace(p.GetCustomAttribute<DescriptionAttribute>()?.Description))
.Select(p => p.Name)
.ToList();
Assert.True(missing.Count == 0, $"Ohne [Description]: {string.Join(", ", missing)}");
}
}
}