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(); } }