From f28461ae0cd93abebddded0566f9ca92cd4f3a43 Mon Sep 17 00:00:00 2001 From: javiermengual Date: Sat, 3 Jan 2026 14:57:23 +0100 Subject: [PATCH] refactor: extraer interfaz IDolibarrApiClient para facilitar testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Crear IDolibarrApiClient con métodos de la API de Dolibarr - Implementar interfaz en DolibarrApiClient - Modificar InvoiceService para depender de IDolibarrApiClient en lugar de la clase concreta - Actualizar Program.cs para registrar IDolibarrApiClient en el contenedor DI Esto sigue el Principio de Inversión de Dependencias (DIP) de SOLID, permitiendo mockear el cliente API en tests unitarios sin conectividad externa. --- DoliMiddlewareApi/Program.cs | 3 ++- DoliMiddlewareApi/Services/Clients/DolibarrApiClient.cs | 2 +- DoliMiddlewareApi/Services/Clients/IDolibarrApiClient.cs | 9 +++++++++ DoliMiddlewareApi/Services/InvoiceService.cs | 4 ++-- 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 DoliMiddlewareApi/Services/Clients/IDolibarrApiClient.cs diff --git a/DoliMiddlewareApi/Program.cs b/DoliMiddlewareApi/Program.cs index e43ad64..0b9557a 100644 --- a/DoliMiddlewareApi/Program.cs +++ b/DoliMiddlewareApi/Program.cs @@ -22,7 +22,8 @@ builder.Services.AddSwaggerGen(); // Typed Client - Inyecta HttpClient directamente en DolibarrApiClient -builder.Services.AddHttpClient(client => +// Registra la interfaz para poder hacer mock en tests +builder.Services.AddHttpClient(client => { client.BaseAddress = new Uri(builder.Configuration["Dolibarr:ApiUrl"]!); client.DefaultRequestHeaders.Add("DOLAPIKEY", builder.Configuration["Dolibarr:ApiKey"]!); diff --git a/DoliMiddlewareApi/Services/Clients/DolibarrApiClient.cs b/DoliMiddlewareApi/Services/Clients/DolibarrApiClient.cs index e1f23a0..f87b200 100644 --- a/DoliMiddlewareApi/Services/Clients/DolibarrApiClient.cs +++ b/DoliMiddlewareApi/Services/Clients/DolibarrApiClient.cs @@ -3,7 +3,7 @@ using DoliMiddlewareApi.Exceptions; namespace DoliMiddlewareApi.Services.Clients; -public class DolibarrApiClient +public class DolibarrApiClient : IDolibarrApiClient { private readonly HttpClient _httpClient; diff --git a/DoliMiddlewareApi/Services/Clients/IDolibarrApiClient.cs b/DoliMiddlewareApi/Services/Clients/IDolibarrApiClient.cs new file mode 100644 index 0000000..07c7ec1 --- /dev/null +++ b/DoliMiddlewareApi/Services/Clients/IDolibarrApiClient.cs @@ -0,0 +1,9 @@ +namespace DoliMiddlewareApi.Services.Clients; + +public interface IDolibarrApiClient +{ + Task GetResourceAsync(string endpoint) where T : class; + Task> GetCollectionAsync(string endpoint) where T : class; + Task PostAsync(string endpoint, object requestBody); + Task PutAsync(string endpoint, object requestBody); +} diff --git a/DoliMiddlewareApi/Services/InvoiceService.cs b/DoliMiddlewareApi/Services/InvoiceService.cs index f00e2dc..73a8201 100644 --- a/DoliMiddlewareApi/Services/InvoiceService.cs +++ b/DoliMiddlewareApi/Services/InvoiceService.cs @@ -10,9 +10,9 @@ namespace DoliMiddlewareApi.Services; public class InvoiceService { - private readonly DolibarrApiClient _apiClient; + private readonly IDolibarrApiClient _apiClient; - public InvoiceService(DolibarrApiClient apiClient) + public InvoiceService(IDolibarrApiClient apiClient) { _apiClient = apiClient; }