using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using ReC.Client; using System.Net.Http; namespace ReC.Tests.Client; [TestFixture] public class DependencyInjectionTests { [Test] public void AddRecClient_with_base_url_registers_resolvable_client() { var services = new ServiceCollection(); services.AddLogging(); services.AddRecClient("https://example.invalid/"); using var provider = services.BuildServiceProvider(); using var scope = provider.CreateScope(); var client = scope.ServiceProvider.GetRequiredService(); Assert.That(client, Is.Not.Null); Assert.That(client.RecActions, Is.Not.Null); Assert.That(client.Results, Is.Not.Null); Assert.That(client.Profiles, Is.Not.Null); Assert.That(client.EndpointAuth, Is.Not.Null); Assert.That(client.EndpointParams, Is.Not.Null); Assert.That(client.Endpoints, Is.Not.Null); Assert.That(client.Common, Is.Not.Null); } [Test] public void AddRecClient_with_configure_client_registers_resolvable_client() { var services = new ServiceCollection(); services.AddLogging(); services.AddRecClient(http => { http.BaseAddress = new Uri("https://example.invalid/"); http.Timeout = TimeSpan.FromSeconds(5); }); using var provider = services.BuildServiceProvider(); using var scope = provider.CreateScope(); var client = scope.ServiceProvider.GetRequiredService(); Assert.That(client, Is.Not.Null); } [Test] public void AddRecClient_registers_default_options_when_no_callback_supplied() { var services = new ServiceCollection(); services.AddLogging(); services.AddRecClient("https://example.invalid/"); using var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; Assert.That(options, Is.Not.Null); Assert.That(options.LogSuccessfulRequests, Is.True, "Default value of LogSuccessfulRequests should be true."); } [Test] public void AddRecClient_applies_options_callback() { var services = new ServiceCollection(); services.AddLogging(); services.AddRecClient("https://example.invalid/", opt => opt.LogSuccessfulRequests = true); using var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; Assert.That(options.LogSuccessfulRequests, Is.True); } [Test] public void ReCClient_constructor_throws_when_LogSuccessfulRequests_enabled_but_logger_is_null() { // Microsoft.Extensions.Http always registers an ILoggerFactory, so the // "logger == null" branch can only be exercised by invoking the constructor directly. var services = new ServiceCollection(); services.AddRecClient("https://example.invalid/", opt => opt.LogSuccessfulRequests = true); using var provider = services.BuildServiceProvider(); var httpClientFactory = provider.GetRequiredService(); var options = provider.GetRequiredService>(); var ex = Assert.Throws( () => new ReCClient(httpClientFactory, options, logger: null)); Assert.That(ex!.Message, Does.Contain(nameof(ReCClientOptions.LogSuccessfulRequests))); Assert.That(ex.Message, Does.Contain("ILogger")); } [Test] public void ReCClient_resolves_when_LogSuccessfulRequests_enabled_and_logger_registered() { var services = new ServiceCollection(); services.AddLogging(); services.AddRecClient("https://example.invalid/", opt => opt.LogSuccessfulRequests = true); using var provider = services.BuildServiceProvider(); using var scope = provider.CreateScope(); var client = scope.ServiceProvider.GetRequiredService(); Assert.That(client, Is.Not.Null); } }