using FluentAssertions; using Marathon.Infrastructure.Scraping.Parsers; using Microsoft.Extensions.Logging.Abstractions; namespace Marathon.Infrastructure.Tests.Scraping; public sealed class ServerTimeProviderTests { private readonly ServerTimeProvider _sut = new(NullLogger.Instance); private static readonly TimeSpan MoscowOffset = TimeSpan.FromHours(3); [Fact] public void ExtractServerTime_ValidInitData_ReturnsMoscowTime() { const string html = @""; var result = _sut.ExtractServerTime(html); result.Should().NotBeNull(); result!.Value.Year.Should().Be(2026); result.Value.Month.Should().Be(5); result.Value.Day.Should().Be(5); result.Value.Hour.Should().Be(0); result.Value.Minute.Should().Be(42); result.Value.Second.Should().Be(28); result.Value.Offset.Should().Be(MoscowOffset); } [Fact] public void ExtractServerTime_MissingInitData_ReturnsNull() { const string html = "No initData here."; _sut.ExtractServerTime(html).Should().BeNull(); } [Fact] public void ExtractServerTime_ExtraWhitespaceAroundKey_ParsesCorrectly() { const string html = @""; var result = _sut.ExtractServerTime(html); result.Should().NotBeNull(); result!.Value.Month.Should().Be(1); result.Value.Day.Should().Be(15); } }