using System.Net;
namespace Cleanuparr.Infrastructure.Tests.TestHelpers;
///
/// Test double for HttpMessageHandler since NSubstitute cannot mock protected methods.
/// Captures requests and delegates to a configurable handler function.
///
public class FakeHttpMessageHandler : HttpMessageHandler
{
private Func> _handler
= (_, _) => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK));
public List CapturedRequests { get; } = [];
///
/// Eagerly captured request body strings (indexed the same as CapturedRequests).
/// Useful because HttpClient disposes request content after SendAsync returns.
///
public List CapturedRequestBodies { get; } = [];
public void SetupResponse(HttpStatusCode statusCode)
{
_handler = (_, _) => Task.FromResult(new HttpResponseMessage(statusCode));
}
public void SetupResponse(Func> handler)
{
_handler = handler;
}
public void SetupThrow(Exception exception)
{
_handler = (_, _) => throw exception;
}
protected override async Task SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
CapturedRequests.Add(request);
CapturedRequestBodies.Add(request.Content != null
? await request.Content.ReadAsStringAsync(cancellationToken)
: null);
return await _handler(request, cancellationToken);
}
}