namespace Yh.SchClass.OpenApi.Tests;
///
/// 伪造 :捕获最近一次请求并回放预设响应。
/// 与 Yh.Platform.OpenApi.Tests 的 FakeHandler 同构,便于两个 SDK 的测试互相参照。
///
public sealed class FakeHandler : HttpMessageHandler
{
private readonly Func _responder;
public FakeHandler(Func responder)
{
_responder = responder;
}
/// 最近一次捕获到的请求。
public HttpRequestMessage? LastRequest { get; private set; }
/// 最近一次请求体(无请求体时为 null)。
public string? LastRequestBody { get; private set; }
/// 最近一次请求体的 Content-Type(无请求体时为 null)。
public string? LastContentType { get; private set; }
protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
LastRequest = request;
if (request.Content == null)
{
LastRequestBody = null;
LastContentType = null;
}
else
{
LastRequestBody = await request.Content.ReadAsStringAsync(cancellationToken);
LastContentType = request.Content.Headers.ContentType?.MediaType;
}
return _responder(request, LastRequestBody);
}
/// 回放一段固定 JSON(application/json)。
public static FakeHandler Json(HttpStatusCode statusCode, string json)
=> new((_, _) => new HttpResponseMessage(statusCode)
{
Content = new StringContent(json, Encoding.UTF8, "application/json"),
});
/// 回放指定状态码且无响应体(模拟 204 / 404 空响应)。
public static FakeHandler Empty(HttpStatusCode statusCode)
=> new((_, _) => new HttpResponseMessage(statusCode));
/// 回放纯文本响应(模拟非 JSON 的错误页)。
public static FakeHandler Text(HttpStatusCode statusCode, string text)
=> new((_, _) => new HttpResponseMessage(statusCode)
{
Content = new StringContent(text, Encoding.UTF8, "text/plain"),
});
}