using System.Net; using System.Text; namespace TeleWave.Application.Tests.TestSupport; /// /// Фабрика HTTP-клиентов поверх подставного обработчика: наружу запрос не уходит, ответ выбирается /// по URL. Запрошенные адреса копятся в — по ним проверяем, что провайдер собрал /// правильный запрос (сегмент tv/movie, язык, append_to_response). /// internal sealed class FakeHttpClientFactory(Func respond) : IHttpClientFactory { public List Urls { get; } = []; /// Один и тот же JSON на любой запрос — самый частый случай в тестах. public static FakeHttpClientFactory Json(string json) => new(_ => Ok(json)); /// Ответ-ошибка: провайдеры обязаны деградировать в null/пустой список. public static FakeHttpClientFactory Failing( HttpStatusCode status = HttpStatusCode.ServiceUnavailable ) => new(_ => new HttpResponseMessage(status) { Content = new StringContent("{}") }); public static HttpResponseMessage Ok(string json) => new(HttpStatusCode.OK) { Content = new StringContent(json, Encoding.UTF8, "application/json"), }; public HttpClient CreateClient(string name) => new( new StubHandler(url => { Urls.Add(url); return respond(url); }) ); /// Последний запрошенный адрес — короче, чем каждый раз доставать из списка. public string LastUrl => Urls.Count > 0 ? Urls[^1] : string.Empty; private sealed class StubHandler(Func respond) : HttpMessageHandler { protected override Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken ) => Task.FromResult(respond(request.RequestUri!.ToString())); } }