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()); 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().Parts.OfType() .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().Parts.OfType().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(PiwigoResponse serverResponse) { var settings = new JsonSerializerSettings { Formatting = Formatting.Indented, NullValueHandling = NullValueHandling.Ignore }; var serializer = new NewtonsoftJsonSerializer(settings); var jsonResponse = serializer.Serialize(serverResponse); HttpTest?.RespondWith(jsonResponse); } }