using Marathon.UI.Services;
using DomainEventId = Marathon.Domain.ValueObjects.EventId;
namespace Marathon.UI.Tests.Support;
///
/// In-memory for bUnit tests.
/// Seed via / / .
///
public sealed class FakeEventBrowsingService : IEventBrowsingService
{
public List UpcomingItems { get; } = new();
public List LiveItems { get; } = new();
public EventDetail? Detail { get; set; }
public List SportCodes { get; } = new();
public List CountryCodes { get; } = new();
public int UpcomingCallCount { get; private set; }
public int LiveCallCount { get; private set; }
public EventFilter? LastUpcomingFilter { get; private set; }
public EventFilter? LastLiveFilter { get; private set; }
public Task> ListUpcomingAsync(EventFilter filter, CancellationToken ct)
{
UpcomingCallCount++;
LastUpcomingFilter = filter;
return Task.FromResult>(Apply(UpcomingItems, filter));
}
public Task> ListLiveAsync(EventFilter filter, CancellationToken ct)
{
LiveCallCount++;
LastLiveFilter = filter;
return Task.FromResult>(Apply(LiveItems, filter));
}
public Task GetDetailAsync(DomainEventId eventId, CancellationToken ct)
=> Task.FromResult(Detail);
public Task> ListKnownSportCodesAsync(CancellationToken ct)
=> Task.FromResult>(SportCodes);
public Task> ListKnownCountryCodesAsync(CancellationToken ct)
=> Task.FromResult>(CountryCodes);
private static IReadOnlyList Apply(IEnumerable source, EventFilter filter)
{
IEnumerable q = source;
if (filter.SportCodes is { Count: > 0 } sports)
q = q.Where(e => sports.Contains(e.Sport.Value));
if (filter.CountryCodes is { Count: > 0 } countries)
q = q.Where(e => countries.Contains(e.CountryCode, StringComparer.OrdinalIgnoreCase));
if (!string.IsNullOrWhiteSpace(filter.SearchTerm))
{
var t = filter.SearchTerm.Trim();
q = q.Where(e =>
e.LeagueId.Contains(t, StringComparison.OrdinalIgnoreCase) ||
e.Side1Name.Contains(t, StringComparison.OrdinalIgnoreCase) ||
e.Side2Name.Contains(t, StringComparison.OrdinalIgnoreCase));
}
return q.ToList();
}
}