using System.Net;
using System.Text;
using Microsoft.Extensions.Options;
using TeleWave.Infrastructure.Metadata;
using Xunit;
namespace TeleWave.Application.Tests.Metadata;
///
/// TMDb принимает и ключ v3 (в query), и токен v4 (в заголовке). Способ выбирается по форме самого
/// значения, поэтому проверяем именно то, что уходит в запрос.
///
public class TmdbAuthTests
{
[Fact]
public async Task V3Key_GoesToQuery()
{
var handler = new CapturingHandler();
var provider = ProviderWith("fa38966b51f0043827fa89a5e42a0afe", handler);
await provider.GetSeasonNumbersAsync("123", CancellationToken.None);
var request = handler.Last!;
Assert.Contains("api_key=fa38966b51f0043827fa89a5e42a0afe", request.RequestUri!.Query);
Assert.Null(request.Headers.Authorization);
}
[Fact]
public async Task V4Token_GoesToAuthorizationHeader()
{
var handler = new CapturingHandler();
var token = "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJ0ZWxld2F2ZSJ9.c2lnbmF0dXJl";
var provider = ProviderWith(token, handler);
await provider.GetSeasonNumbersAsync("123", CancellationToken.None);
var request = handler.Last!;
Assert.DoesNotContain("api_key", request.RequestUri!.Query);
Assert.Equal("Bearer", request.Headers.Authorization?.Scheme);
Assert.Equal(token, request.Headers.Authorization?.Parameter);
}
private static TmdbMetadataProvider ProviderWith(string apiKey, HttpMessageHandler handler) =>
new(
new SingleClientFactory(handler),
Options.Create(new MetadataOptions { Tmdb = new TmdbOptions { ApiKey = apiKey } })
);
private sealed class CapturingHandler : HttpMessageHandler
{
public HttpRequestMessage? Last { get; private set; }
protected override Task SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken
)
{
Last = request;
return Task.FromResult(
new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("{}", Encoding.UTF8, "application/json"),
}
);
}
}
private sealed class SingleClientFactory(HttpMessageHandler handler) : IHttpClientFactory
{
public HttpClient CreateClient(string name) => new(handler, disposeHandler: false);
}
}