piwigodotnet/PiwigoDotnet/Piwigo.Client.Tests/ApiTestsBase.cs

98 lines
3.0 KiB
C#

using System.Reflection;
using Flurl.Http.Configuration;
using Flurl.Http.Content;
using Flurl.Http.Testing;
using Microsoft.Extensions.Logging.Abstractions;
using Newtonsoft.Json;
using Piwigo.Client.Contract;
namespace Piwigo.Client.Tests;
public class ApiTestsBase
{
private const string TestUri = "http://localhost:8080/ws.php?format=json";
private const string Username = "admin";
private const string Password = "admin";
private const bool UseHttpTest = true;
protected HttpTest? HttpTest { get; private set; }
protected IPiwigoContext Context { get; private set; } = null!;
[SetUp]
public void SetUp()
{
if (UseHttpTest)
{
HttpTest = new HttpTest();
}
Context = new PiwigoContext(new PiwigoConfiguration(TestUri, Username, Password), new NullLogger<PiwigoContext>());
OnSetUp();
}
protected virtual void OnSetUp()
{
}
[TearDown]
public void TearDown()
{
HttpTest?.Dispose();
}
protected void SetOkResult()
{
SetJsonResult(@"{stat: ""ok"", result: null}");
}
protected async Task SetJsonResultFromFileAsync(string fileName)
{
var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var directory = Path.GetDirectoryName(assemblyLocation) ?? Environment.CurrentDirectory;
var path = Path.Combine(directory, fileName);
using var reader = File.OpenText(path);
var fileContent = await reader.ReadToEndAsync();
SetJsonResult(fileContent);
}
protected void SetJsonResult(string json)
{
HttpTest?.RespondWith(json);
}
protected void CorrectMethodShouldGetCalled(string methodName)
{
CorrectParamShouldGetSent("method", methodName);
}
protected void ParamShouldNotGetSent(string paramName)
{
HttpTest?.ShouldHaveMadeACall().With(c =>
{
return !c.HttpRequestMessage.Content.As<CapturedMultipartContent>().Parts.OfType<CapturedStringContent>()
.Select(p => new { p.Headers.ContentDisposition?.Name, p.Content })
.Any(s => s.Name?.Equals(paramName) ?? false);
});
}
protected void CorrectParamShouldGetSent(string paramName, string expectedValue)
{
HttpTest?.ShouldHaveMadeACall().With(c =>
c.HttpRequestMessage.Content.As<CapturedMultipartContent>().Parts.OfType<CapturedStringContent>().Select(p => new { p.Headers.ContentDisposition?.Name, p.Content })
.Where(s => s.Name?.Equals(paramName) ?? false).Any(s => s.Content.Equals(expectedValue, StringComparison.OrdinalIgnoreCase)));
}
internal void SetJsonResult<T>(PiwigoResponse<T> serverResponse)
{
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore
};
var serializer = new NewtonsoftJsonSerializer(settings);
var jsonResponse = serializer.Serialize(serverResponse);
HttpTest?.RespondWith(jsonResponse);
}
}