using System.Net;
using System.Text;
namespace Flaro.Metadata.Tests;
/// Ein HTTP-Gegenüber, das antwortet, was der Test vorgibt.
///
///
/// Damit die Prüfungen ohne Netz und ohne Schlüssel laufen. Ein
/// Projekt, dessen Tests einen fremden Dienst brauchen, hat am Ende keine
/// Tests: sie scheitern, wenn das WLAN hakt, und irgendwann schaltet sie
/// jemand ab.
///
public sealed class Attrappe(Func antwort) : HttpMessageHandler
{
public List Aufrufe { get; } = [];
/// Die Authorization-Kopfzeile je Aufruf — oder null.
public List Kopfzeilen { get; } = [];
protected override Task SendAsync(HttpRequestMessage anfrage, CancellationToken ct)
{
// AbsoluteUri und nicht ToString(): Letzteres entschlüsselt zur
// Anzeige wieder, und dann sähe eine richtig kodierte Anfrage falsch
// aus — der Test prüfte eine Darstellung statt dessen, was hinausgeht.
Aufrufe.Add(anfrage.RequestUri!.AbsoluteUri);
Kopfzeilen.Add(anfrage.Headers.Authorization?.ToString());
return Task.FromResult(antwort(anfrage));
}
public static Attrappe MitJson(string json, HttpStatusCode code = HttpStatusCode.OK) =>
new(_ => new HttpResponseMessage(code)
{
Content = new StringContent(json, Encoding.UTF8, "application/json"),
});
public static Attrappe MitStatus(HttpStatusCode code) => new(_ => new HttpResponseMessage(code));
public static Attrappe DieWirft(Exception fehler) => new(_ => throw fehler);
}
public sealed record FesteEinstellungen(TmdbSettings Werte) : ITmdbSettingsSource
{
public Task GetAsync(CancellationToken ct = default) => Task.FromResult(Werte);
public static FesteEinstellungen MitSchluessel(string sprache = "de-DE") =>
new(new TmdbSettings("ein-schluessel", sprache));
public static readonly FesteEinstellungen Ohne = new(TmdbSettings.Unconfigured);
}