using FluentAssertions; using Marathon.Domain.Enums; using Marathon.Infrastructure.Scraping.Parsers; using Microsoft.Extensions.Logging.Abstractions; namespace Marathon.Infrastructure.Tests.Scraping; public sealed class ResultsParserTests { private static string FixturePath(string filename) => Path.Combine( AppContext.BaseDirectory, "Fixtures", "marathonbet", filename); private readonly ResultsParser _sut = new(NullLogger.Instance); [Fact] public async Task ParseAsync_CompletedEvent_ReturnsEventResult() { var html = await File.ReadAllTextAsync(FixturePath("event-completed-sample.html")); var result = await _sut.ParseAsync(html); result.Should().NotBeNull("matchIsComplete=true should yield an EventResult"); } [Fact] public async Task ParseAsync_CompletedEvent_EventIdMatches() { var html = await File.ReadAllTextAsync(FixturePath("event-completed-sample.html")); var result = await _sut.ParseAsync(html); result!.EventId.Value.Should().Be("26456100"); } [Fact] public async Task ParseAsync_CompletedEvent_ScoreParsedCorrectly() { var html = await File.ReadAllTextAsync(FixturePath("event-completed-sample.html")); var result = await _sut.ParseAsync(html); result!.Side1Score.Should().Be(3); result.Side2Score.Should().Be(1); } [Fact] public async Task ParseAsync_CompletedEvent_WinnerIsSide1() { var html = await File.ReadAllTextAsync(FixturePath("event-completed-sample.html")); var result = await _sut.ParseAsync(html); result!.WinnerSide.Should().Be(Side.Side1); } [Fact] public async Task ParseAsync_IncompleteEvent_ReturnsNull() { var html = await File.ReadAllTextAsync(FixturePath("event-football-sample.html")); var result = await _sut.ParseAsync(html); result.Should().BeNull("matchIsComplete=false should return null"); } [Fact] public async Task ParseAsync_EmptyHtml_ReturnsNull() { var result = await _sut.ParseAsync(""); result.Should().BeNull(); } }