Tests: xUnit project with HAR fixtures (50 tests); fix relative delivery/HLS URLs resolving to file:// on Linux
All checks were successful
release / build-release (push) Successful in 1m19s
All checks were successful
release / build-release (push) Successful in 1m19s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
66
Jellyfin.Plugin.Floatplane.Tests/FakeHttp.cs
Normal file
66
Jellyfin.Plugin.Floatplane.Tests/FakeHttp.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Jellyfin.Plugin.Floatplane.Tests;
|
||||
|
||||
/// <summary>Maps request URLs (prefix match on path, or a predicate) to canned responses and records requests.</summary>
|
||||
internal sealed class FakeHttpHandler : HttpMessageHandler
|
||||
{
|
||||
private readonly List<(Func<HttpRequestMessage, bool> Match, Func<HttpRequestMessage, HttpResponseMessage> Respond)> _routes = new();
|
||||
|
||||
public List<HttpRequestMessage> Requests { get; } = new();
|
||||
|
||||
public FakeHttpHandler On(string pathPrefix, Func<HttpRequestMessage, HttpResponseMessage> respond)
|
||||
{
|
||||
_routes.Add((r => r.RequestUri!.AbsolutePath.StartsWith(pathPrefix, StringComparison.Ordinal), respond));
|
||||
return this;
|
||||
}
|
||||
|
||||
public FakeHttpHandler On(Func<HttpRequestMessage, bool> match, Func<HttpRequestMessage, HttpResponseMessage> respond)
|
||||
{
|
||||
_routes.Add((match, respond));
|
||||
return this;
|
||||
}
|
||||
|
||||
public static HttpResponseMessage Json(string body, HttpStatusCode status = HttpStatusCode.OK)
|
||||
=> new(status) { Content = new StringContent(body, System.Text.Encoding.UTF8, "application/json") };
|
||||
|
||||
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
|
||||
{
|
||||
Requests.Add(request);
|
||||
foreach (var (match, respond) in _routes)
|
||||
{
|
||||
if (match(request))
|
||||
{
|
||||
var response = respond(request);
|
||||
response.RequestMessage = request;
|
||||
return Task.FromResult(response);
|
||||
}
|
||||
}
|
||||
|
||||
var notFound = new HttpResponseMessage(HttpStatusCode.NotFound) { RequestMessage = request, Content = new StringContent("no route for " + request.RequestUri) };
|
||||
return Task.FromResult(notFound);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Mirrors the registrator: one named client with the plugin User-Agent.</summary>
|
||||
internal sealed class FakeHttpClientFactory : IHttpClientFactory
|
||||
{
|
||||
private readonly HttpMessageHandler _handler;
|
||||
|
||||
public FakeHttpClientFactory(HttpMessageHandler handler)
|
||||
{
|
||||
_handler = handler;
|
||||
}
|
||||
|
||||
public HttpClient CreateClient(string name)
|
||||
{
|
||||
var client = new HttpClient(_handler, disposeHandler: false);
|
||||
client.DefaultRequestHeaders.UserAgent.ParseAdd(Plugin.UserAgent);
|
||||
return client;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user