mirror of
https://github.com/Readarr/Readarr.git
synced 2026-04-22 22:14:44 -04:00
Fixed: Significantly improved api performance.
This commit is contained in:
@@ -10,20 +10,15 @@ using System.Linq;
|
||||
|
||||
namespace NzbDrone.Integration.Test.Client
|
||||
{
|
||||
public class ClientBase<TResource> where TResource : RestResource, new()
|
||||
public class ClientBase
|
||||
{
|
||||
private readonly IRestClient _restClient;
|
||||
private readonly string _resource;
|
||||
private readonly string _apiKey;
|
||||
private readonly Logger _logger;
|
||||
protected readonly IRestClient _restClient;
|
||||
protected readonly string _resource;
|
||||
protected readonly string _apiKey;
|
||||
protected readonly Logger _logger;
|
||||
|
||||
public ClientBase(IRestClient restClient, string apiKey, string resource = null)
|
||||
public ClientBase(IRestClient restClient, string apiKey, string resource)
|
||||
{
|
||||
if (resource == null)
|
||||
{
|
||||
resource = new TResource().ResourceName;
|
||||
}
|
||||
|
||||
_restClient = restClient;
|
||||
_resource = resource;
|
||||
_apiKey = apiKey;
|
||||
@@ -31,19 +26,77 @@ namespace NzbDrone.Integration.Test.Client
|
||||
_logger = LogManager.GetLogger("REST");
|
||||
}
|
||||
|
||||
public RestRequest BuildRequest(string command = "")
|
||||
{
|
||||
var request = new RestRequest(_resource + "/" + command.Trim('/'))
|
||||
{
|
||||
RequestFormat = DataFormat.Json,
|
||||
};
|
||||
|
||||
request.AddHeader("Authorization", _apiKey);
|
||||
request.AddHeader("X-Api-Key", _apiKey);
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
public T Execute<T>(IRestRequest request, HttpStatusCode statusCode) where T : class, new()
|
||||
{
|
||||
_logger.Info("{0}: {1}", request.Method, _restClient.BuildUri(request));
|
||||
|
||||
var response = _restClient.Execute(request);
|
||||
_logger.Info("Response: {0}", response.Content);
|
||||
|
||||
if (response.ErrorException != null)
|
||||
{
|
||||
throw response.ErrorException;
|
||||
}
|
||||
|
||||
AssertDisableCache(response.Headers);
|
||||
|
||||
response.ErrorMessage.Should().BeNullOrWhiteSpace();
|
||||
|
||||
response.StatusCode.Should().Be(statusCode);
|
||||
|
||||
return Json.Deserialize<T>(response.Content);
|
||||
}
|
||||
|
||||
private static void AssertDisableCache(IList<Parameter> headers)
|
||||
{
|
||||
headers.Single(c => c.Name == "Cache-Control").Value.Should().Be("no-cache, no-store, must-revalidate");
|
||||
headers.Single(c => c.Name == "Pragma").Value.Should().Be("no-cache");
|
||||
headers.Single(c => c.Name == "Expires").Value.Should().Be("0");
|
||||
}
|
||||
}
|
||||
|
||||
public class ClientBase<TResource> : ClientBase
|
||||
where TResource : RestResource, new()
|
||||
{
|
||||
public ClientBase(IRestClient restClient, string apiKey, string resource = null)
|
||||
: base(restClient, apiKey, resource ?? new TResource().ResourceName)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public List<TResource> All()
|
||||
{
|
||||
var request = BuildRequest();
|
||||
return Get<List<TResource>>(request);
|
||||
}
|
||||
|
||||
public PagingResource<TResource> GetPaged(int pageNumber, int pageSize, string sortKey, string sortDir)
|
||||
public PagingResource<TResource> GetPaged(int pageNumber, int pageSize, string sortKey, string sortDir, string filterKey = null, string filterValue = null)
|
||||
{
|
||||
var request = BuildRequest();
|
||||
request.AddParameter("page", pageNumber);
|
||||
request.AddParameter("pageSize", pageSize);
|
||||
request.AddParameter("sortKey", sortKey);
|
||||
request.AddParameter("sortDir", sortDir);
|
||||
|
||||
if (filterKey != null && filterValue != null)
|
||||
{
|
||||
request.AddParameter("filterKey", filterKey);
|
||||
request.AddParameter("filterValue", filterValue);
|
||||
}
|
||||
|
||||
return Get<PagingResource<TResource>>(request);
|
||||
}
|
||||
|
||||
@@ -79,31 +132,24 @@ namespace NzbDrone.Integration.Test.Client
|
||||
Delete(request);
|
||||
}
|
||||
|
||||
public List<dynamic> InvalidPost(TResource body)
|
||||
public object InvalidGet(int id, HttpStatusCode statusCode = HttpStatusCode.NotFound)
|
||||
{
|
||||
var request = BuildRequest(id.ToString());
|
||||
return Get<object>(request, statusCode);
|
||||
}
|
||||
|
||||
public object InvalidPost(TResource body, HttpStatusCode statusCode = HttpStatusCode.BadRequest)
|
||||
{
|
||||
var request = BuildRequest();
|
||||
request.AddBody(body);
|
||||
return Post<List<dynamic>>(request, HttpStatusCode.BadRequest);
|
||||
return Post<object>(request, statusCode);
|
||||
}
|
||||
|
||||
public List<dynamic> InvalidPut(TResource body)
|
||||
public object InvalidPut(TResource body, HttpStatusCode statusCode = HttpStatusCode.BadRequest)
|
||||
{
|
||||
var request = BuildRequest();
|
||||
request.AddBody(body);
|
||||
return Put<List<dynamic>>(request, HttpStatusCode.BadRequest);
|
||||
}
|
||||
|
||||
public RestRequest BuildRequest(string command = "")
|
||||
{
|
||||
var request = new RestRequest(_resource + "/" + command.Trim('/'))
|
||||
{
|
||||
RequestFormat = DataFormat.Json,
|
||||
};
|
||||
|
||||
request.AddHeader("Authorization", _apiKey);
|
||||
request.AddHeader("X-Api-Key", _apiKey);
|
||||
|
||||
return request;
|
||||
return Put<object>(request, statusCode);
|
||||
}
|
||||
|
||||
public T Get<T>(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.OK) where T : class, new()
|
||||
@@ -129,33 +175,5 @@ namespace NzbDrone.Integration.Test.Client
|
||||
request.Method = Method.DELETE;
|
||||
Execute<object>(request, statusCode);
|
||||
}
|
||||
|
||||
private T Execute<T>(IRestRequest request, HttpStatusCode statusCode) where T : class, new()
|
||||
{
|
||||
_logger.Info("{0}: {1}", request.Method, _restClient.BuildUri(request));
|
||||
|
||||
var response = _restClient.Execute(request);
|
||||
_logger.Info("Response: {0}", response.Content);
|
||||
|
||||
if (response.ErrorException != null)
|
||||
{
|
||||
throw response.ErrorException;
|
||||
}
|
||||
|
||||
AssertDisableCache(response.Headers);
|
||||
|
||||
response.ErrorMessage.Should().BeNullOrWhiteSpace();
|
||||
|
||||
response.StatusCode.Should().Be(statusCode);
|
||||
|
||||
return Json.Deserialize<T>(response.Content);
|
||||
}
|
||||
|
||||
private static void AssertDisableCache(IList<Parameter> headers)
|
||||
{
|
||||
headers.Single(c => c.Name == "Cache-Control").Value.Should().Be("no-cache, no-store, must-revalidate");
|
||||
headers.Single(c => c.Name == "Pragma").Value.Should().Be("no-cache");
|
||||
headers.Single(c => c.Name == "Expires").Value.Should().Be("0");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,10 @@
|
||||
using NzbDrone.Api.Commands;
|
||||
using RestSharp;
|
||||
using NzbDrone.Core.Messaging.Commands;
|
||||
using FluentAssertions;
|
||||
using System.Threading;
|
||||
using NUnit.Framework;
|
||||
using System.Linq;
|
||||
|
||||
namespace NzbDrone.Integration.Test.Client
|
||||
{
|
||||
@@ -9,5 +14,42 @@ namespace NzbDrone.Integration.Test.Client
|
||||
: base(restClient, apiKey)
|
||||
{
|
||||
}
|
||||
|
||||
public CommandResource PostAndWait(CommandResource command)
|
||||
{
|
||||
var result = Post(command);
|
||||
result.Id.Should().NotBe(0);
|
||||
|
||||
for (var i = 0; i < 50; i++)
|
||||
{
|
||||
if (result.Status == CommandStatus.Completed)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
Thread.Sleep(500);
|
||||
result = Get(result.Id);
|
||||
}
|
||||
|
||||
Assert.Fail("Command failed");
|
||||
return result;
|
||||
}
|
||||
|
||||
public void WaitAll()
|
||||
{
|
||||
var resources = All();
|
||||
for (var i = 0; i < 50; i++)
|
||||
{
|
||||
if (!resources.Any(v => v.Status == CommandStatus.Queued || v.Status == CommandStatus.Started))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Thread.Sleep(500);
|
||||
resources = All();
|
||||
}
|
||||
|
||||
Assert.Fail("Commands still processing");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user