using System.Net;
using System.Net.Http;
using System.Text;
namespace Elfisa.Tests;
/// Мок HttpMessageHandler: отдаёт заданные ответы или бросает ошибки.
internal sealed class FakeHttpHandler : HttpMessageHandler
{
private readonly Func _responder;
public int Calls { get; private set; }
public HttpRequestMessage? LastRequest { get; private set; }
public FakeHttpHandler(Func responder) => _responder = responder;
public FakeHttpHandler(HttpStatusCode code, string body)
: this((_, __) => Json(code, body)) { }
protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
LastRequest = request;
var i = Calls++;
return Task.FromResult(_responder(request, i));
}
public static HttpResponseMessage Json(HttpStatusCode code, string body) =>
new(code) { Content = new StringContent(body, Encoding.UTF8, "application/json") };
}
/// Генератор JWT для тестов срока действия сессии.
internal static class Jwt
{
public static long Now => DateTimeOffset.UtcNow.ToUnixTimeSeconds();
private static string B64(string s) =>
Convert.ToBase64String(Encoding.UTF8.GetBytes(s)).TrimEnd('=').Replace('+', '-').Replace('/', '_');
public static string Make(long exp) => $"{B64("{\"alg\":\"HS256\"}")}.{B64($"{{\"exp\":{exp}}}")}.sig";
public static string MakeNoExp() => $"{B64("{\"alg\":\"HS256\"}")}.{B64("{\"sub\":\"x\"}")}.sig";
}