using System.Collections.Generic; using System.Threading.Tasks; using PolyTraderSharp.Models; using PolyTraderSharp.Services; namespace PolyTrader.Tests.Fakes { /// /// In-Memory-Stub für . Zeichnet Aufrufe auf und liefert steuerbare /// Antworten, damit die Service-Interaktionen (SELL-Leiter, Startup-Reconciliation) ohne echten /// CLOB integrationstestbar sind. Bewusst simpel und synchron (Task.FromResult). /// public sealed class FakeClobClient : IClobClient { public sealed record PlacedOrder(string TokenId, string Side, decimal Usdc, decimal Price, string OrderType); // Aufzeichnungen public List Placed { get; } = new(); public List CanceledOrderIds { get; } = new(); public List<(string AssetId, decimal NewPrice, string Side)> ConflictCancels { get; } = new(); // Steuerbare Antworten /// Ergebnis von PlaceOrderAsync (Default "OK"). Queue hat Vorrang, sonst dieser Wert. public string PlaceResult { get; set; } = "OK"; public Queue PlaceResults { get; } = new(); public bool CancelResult { get; set; } = true; /// Offene Orders je Asset, die GetOpenOrdersAsync zurückgibt. public Dictionary> OpenOrdersByAsset { get; } = new(); public Task PlaceOrderAsync( AccountState account, string tokenId, string sideStr, decimal investAmountUsd, decimal limitPrice, string orderType = "FOK", bool debugPayloadLog = false, bool isNegRisk = false, int actualFeeBps = 0, decimal? overrideTickSize = null, int? overrideMakerDecimals = null, int? overrideTakerDecimals = null) { Placed.Add(new PlacedOrder(tokenId, sideStr, investAmountUsd, limitPrice, orderType)); string result = PlaceResults.Count > 0 ? PlaceResults.Dequeue() : PlaceResult; return Task.FromResult(result); } public Task CancelConflictingOrdersAsync(AccountState acc, string assetId, decimal newPrice, string sideStr) { ConflictCancels.Add((assetId, newPrice, sideStr)); return Task.CompletedTask; } public Task> GetOpenOrdersAsync(AccountState acc, string assetId) { if (OpenOrdersByAsset.TryGetValue(assetId, out var list)) return Task.FromResult(new List<(string, string, decimal)>(list)); return Task.FromResult(new List<(string, string, decimal)>()); } public Task CancelOrderAsync(AccountState acc, string orderId) { CanceledOrderIds.Add(orderId); return Task.FromResult(CancelResult); } } }