btcpayserver-plugin-builder/PluginBuilder.Tests/HttpClientExtensions.cs

45 lines
1.8 KiB
C#

using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using PluginBuilder.APIModels;
namespace PluginBuilder.Tests;
public static class HttpClientExtensions
{
private static readonly JsonSerializerSettings serializerSettings = new() { ContractResolver = new CamelCasePropertyNamesContractResolver() };
public static async Task<PublishedVersion[]> GetPublishedVersions(this HttpClient httpClient,
string btcpayVersion,
bool includePreRelease,
bool? includeAllVersions = false,
string? searchPluginName = null
)
{
var url = $"api/v1/plugins?btcpayVersion={btcpayVersion}&includePreRelease={includePreRelease}&includeAllVersions={includeAllVersions}";
if (!string.IsNullOrEmpty(searchPluginName))
url += $"&searchPluginName={Uri.EscapeDataString(searchPluginName)}";
var result = await httpClient.GetStringAsync(url);
return JsonConvert.DeserializeObject<PublishedVersion[]>(result, serializerSettings) ?? throw new InvalidOperationException();
}
public static async Task<PublishedVersion?> GetPlugin(this HttpClient httpClient, string pluginSlug, string version)
{
try
{
var result = await httpClient.GetStringAsync($"api/v1/plugins/{pluginSlug}/versions/{version}");
return JsonConvert.DeserializeObject<PublishedVersion?>(result, serializerSettings);
}
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{
return null;
}
}
public static async Task<byte[]> DownloadPlugin(this HttpClient httpClient, PluginSelector pluginSelector, PluginVersion pluginVersion)
{
return await httpClient.GetByteArrayAsync($"api/v1/plugins/{pluginSelector}/versions/{pluginVersion}/download");
}
}