Zwei Tests zur Zeitzonen-Umstellung aus dem letzten Commit: der Zeitstempel eines Logeintrags traegt den Versatz der ANZEIGE-Zone (nicht den des Systems), und die abgelegte JSONL-Zeile traegt ihn mit. Sie liegen bewusst in AppTimeZoneTests - dort steht der uebrige Zeitzonen-Zustand, und innerhalb einer Klasse laufen Tests nacheinander. Das genuegte aber nicht. Von sechs Laeufen fiel einer um und liess sich danach nicht wieder einfangen. Die Ursache ist kein einzelner Test, sondern die Bauart: Mehrere Bausteine halten prozessweiten Zustand, den Tests bewusst umstellen - AppTimeZone, SecretProtection, die Diagnosezaehler von AccountIdSetJson. xUnit fuehrt Testklassen standardmaessig nebenlaeufig aus, also sieht eine Klasse mitten im eigenen Lauf, was eine andere gerade umgestellt hat. Neu ist das nicht, aber die Zeitzonen-Umstellung hat es verschaerft: Seit die Logzeitstempel der Anzeige-Zeitzone folgen, haengt jedes LogMessageEventArgs an AppTimeZone - waehrend AppTimeZoneTests dieselbe Einstellung nach Auckland und zurueck dreht. Deshalb laufen die Testklassen jetzt nacheinander, und die Zaehlerpruefungen arbeiten mit der Differenz statt mit absoluten Werten. Kosten: 4-5 s statt 3 s Laufzeit. Ein Testlauf, dem man glauben kann, ist das allemal wert - danach sechs Laeufe in Folge gruen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
97 lines
3.7 KiB
C#
97 lines
3.7 KiB
C#
using System.ComponentModel.DataAnnotations;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using PolyTrader.Modules.CopyTrading.Persistence.Ef;
|
|
using PolyTraderSharp.Models;
|
|
using Xunit;
|
|
|
|
namespace PolyTrader.Tests
|
|
{
|
|
/// <summary>
|
|
/// Sichert die Befunde des Linux-Sichttests vom 26.08.2026 ab
|
|
/// (docs/pruefplaene/BEFUND-Linux-Betrieb-2026-08-26.md), damit sie nicht zurückkehren.
|
|
/// </summary>
|
|
public class LinuxFindingsTests
|
|
{
|
|
// ── B-5: Windows-Pfad als Standardwert unter Linux ──────────────────────────────
|
|
|
|
[Fact]
|
|
public void Mullvad_default_path_matches_the_platform()
|
|
{
|
|
string expected = System.OperatingSystem.IsWindows()
|
|
? @"C:\Program Files\Mullvad VPN\resources\mullvad.exe"
|
|
: "/usr/bin/mullvad";
|
|
|
|
Assert.Equal(expected, ServerSettings.DefaultMullvadCliPath);
|
|
Assert.Equal(expected, new ServerSettings().MullvadCliPath);
|
|
}
|
|
|
|
// ── B-14: mehrzeilige Texte in einzeiligen Feldern ──────────────────────────────
|
|
|
|
[Theory]
|
|
[InlineData(nameof(TrackedTrader.Description))]
|
|
[InlineData(nameof(TrackedTrader.Reasoning))]
|
|
public void Long_free_text_properties_are_marked_multiline(string propertyName)
|
|
{
|
|
var p = typeof(TrackedTrader).GetProperty(propertyName)!;
|
|
var attr = p.GetCustomAttribute<DataTypeAttribute>();
|
|
|
|
Assert.NotNull(attr);
|
|
Assert.Equal(DataType.MultilineText, attr!.DataType);
|
|
}
|
|
|
|
// ── B-15: ein fehlerhafter Datensatz legt die Modul-Hydration lahm ──────────────
|
|
|
|
[Fact]
|
|
public void Assigned_accounts_round_trip_through_json()
|
|
{
|
|
var set = new System.Collections.Generic.HashSet<int> { 1, 2 };
|
|
Assert.Equal(set, AccountIdSetJson.Deserialize(AccountIdSetJson.Serialize(set)));
|
|
}
|
|
|
|
[Fact]
|
|
public void Empty_column_becomes_an_empty_assignment()
|
|
{
|
|
Assert.Empty(AccountIdSetJson.Deserialize(null));
|
|
Assert.Empty(AccountIdSetJson.Deserialize(""));
|
|
Assert.Empty(AccountIdSetJson.Deserialize("[]"));
|
|
}
|
|
|
|
// Der Zaehler ist prozessweit. Deshalb wird die DIFFERENZ geprueft und nicht der
|
|
// absolute Wert - so bleibt der Test auch dann richtig, wenn vorher schon jemand
|
|
// einen unlesbaren Wert durchgereicht hat.
|
|
|
|
[Fact]
|
|
public void Plain_number_list_is_still_understood()
|
|
{
|
|
int before = AccountIdSetJson.MalformedCount;
|
|
|
|
Assert.Equal(new System.Collections.Generic.HashSet<int> { 1, 2 },
|
|
AccountIdSetJson.Deserialize("1,2"));
|
|
Assert.Equal(before, AccountIdSetJson.MalformedCount);
|
|
}
|
|
|
|
[Fact]
|
|
public void Unreadable_value_yields_an_empty_set_and_is_counted()
|
|
{
|
|
int before = AccountIdSetJson.MalformedCount;
|
|
|
|
// Der Fall aus dem Test: kaputter Wert statt JSON-Array. Frueher warf die
|
|
// EF-Wertkonvertierung hier und es wurde KEIN einziger Trader geladen.
|
|
Assert.Empty(AccountIdSetJson.Deserialize("{kaputt"));
|
|
|
|
Assert.Equal(before + 1, AccountIdSetJson.MalformedCount);
|
|
Assert.Equal("{kaputt", AccountIdSetJson.LastMalformedValue);
|
|
}
|
|
|
|
[Fact]
|
|
public void Text_that_is_not_a_number_list_is_not_silently_accepted()
|
|
{
|
|
int before = AccountIdSetJson.MalformedCount;
|
|
|
|
Assert.Empty(AccountIdSetJson.Deserialize("1,zwei"));
|
|
Assert.Equal(before + 1, AccountIdSetJson.MalformedCount);
|
|
}
|
|
}
|
|
}
|