using GmRelay.DiscordBot.Features.Sessions; namespace GmRelay.Bot.Tests.Discord; public sealed class DiscordTimeParserTests { [Fact] public void ParseTimeInput_ShouldTreatInputAsMoscowTime() { var future = DateTimeOffset.UtcNow.AddDays(7); var result = DiscordTimeParser.ParseTimeInput( future.ToString("yyyy-MM-dd '15:00'", System.Globalization.CultureInfo.InvariantCulture)); Assert.True(result.IsSuccess); // 15:00 MSK = 12:00 UTC Assert.Equal(12, result.Value.Hour); Assert.Equal(0, result.Value.Minute); Assert.Equal(TimeSpan.Zero, result.Value.Offset); } [Fact] public void ParseTimeInput_ShouldParseDiscordDateFormat() { var expected = FutureDateAt1930(); var result = DiscordTimeParser.ParseTimeInput( expected.ToString("yyyy-MM-dd HH:mm", System.Globalization.CultureInfo.InvariantCulture)); Assert.True(result.IsSuccess); Assert.Equal(expected.Year, result.Value.Year); Assert.Equal(expected.Month, result.Value.Month); Assert.Equal(expected.Day, result.Value.Day); // Input is treated as Moscow time; 19:30 MSK = 16:30 UTC Assert.Equal(16, result.Value.Hour); Assert.Equal(30, result.Value.Minute); } [Fact] public void ParseTimeInput_ShouldRejectPastDate() { var result = DiscordTimeParser.ParseTimeInput("2020-01-01 00:00"); Assert.False(result.IsSuccess); } [Fact] public void ParseTimeInput_ShouldParseRussianDateFormat() { var expected = FutureDateAt1930(); var result = DiscordTimeParser.ParseTimeInput( expected.ToString("dd.MM.yyyy HH:mm", System.Globalization.CultureInfo.InvariantCulture)); Assert.True(result.IsSuccess); Assert.Equal(expected.Year, result.Value.Year); Assert.Equal(expected.Month, result.Value.Month); Assert.Equal(expected.Day, result.Value.Day); } [Fact] public void ParseTimeInput_ShouldRejectInvalidFormat() { var result = DiscordTimeParser.ParseTimeInput("not-a-date"); Assert.False(result.IsSuccess); Assert.NotNull(result.Error); } private static DateTimeOffset FutureDateAt1930() { var future = DateTimeOffset.UtcNow.AddDays(7); return new DateTimeOffset( future.Year, future.Month, future.Day, 19, 30, 0, TimeSpan.Zero); } }