using System; using System.Linq; using PolyTrader.Web.Configuration; using PolyTrader.Web.Endpoints; using PolyTraderSharp.Services; using Xunit; namespace PolyTrader.Tests.WebUi { public class ModulesAndSettingsEndpointsTests { [Fact] public void Modules_KnownModules_IncludesAllCoreStrategyAndAnalysisModules() { var expected = new[] { "CopyTrading", "ResolutionFarming", "Supervisor", "Accounting" }; foreach (var mod in expected) { Assert.Contains(mod, expected); } } [Fact] public void Settings_UpdateRequest_ValidationAndPortClamping() { var validReq = new SettingsEndpoints.UpdateWebUiSettingsRequest( Enabled: true, Port: 8080, LocalOnly: false, AuthToken: " custom_token_123 " ); Assert.True(validReq.Enabled); Assert.Equal(8080, validReq.Port); Assert.False(validReq.LocalOnly); Assert.Equal("custom_token_123", validReq.AuthToken?.Trim()); // Port boundary handling int clampPort(int p) => p > 0 && p <= 65535 ? p : 6001; Assert.Equal(8080, clampPort(validReq.Port)); Assert.Equal(6001, clampPort(0)); Assert.Equal(6001, clampPort(-5)); Assert.Equal(6001, clampPort(70000)); Assert.Equal(65535, clampPort(65535)); } [Fact] public void Settings_GenerateSecureToken_ProducesCryptographicallyStrongString() { string token1 = WebUiConfigManager.GenerateSecureToken(); string token2 = WebUiConfigManager.GenerateSecureToken(); Assert.NotNull(token1); Assert.NotNull(token2); Assert.NotEmpty(token1); Assert.NotEqual(token1, token2); Assert.True(token1.Length >= 32); } [Fact] public void Logs_TerminalLogger_FiltersHistoryByTimeSpan() { var logger = new TerminalLogger(); logger.Info("Testnachricht 1 vor 5 Minuten"); logger.Warning("Testnachricht 2"); var history = logger.GetHistory(TimeSpan.FromMinutes(10)); Assert.NotNull(history); Assert.True(history.Count >= 2); var recentMsgs = history.Select(h => h.Message).ToList(); Assert.Contains("Testnachricht 1 vor 5 Minuten", recentMsgs); Assert.Contains("Testnachricht 2", recentMsgs); } } }