using FluentAssertions;
using Microsoft.Extensions.Configuration;
using SchotzIadKmTracker.Api.Configuration;
namespace SchotzIadKmTracker.Tests.Auth;
///
/// Tests d'exemple vérifiant la liaison des options d'authentification depuis une configuration
/// in-memory, ainsi que les valeurs par défaut attendues (feature authentification, tâche 2.2).
///
public class OptionsBindingTests
{
private static IConfiguration ConstruireConfiguration(IEnumerable> valeurs)
=> new ConfigurationBuilder()
.AddInMemoryCollection(valeurs)
.Build();
// Validates: Requirements 5.5
[Fact]
public void JwtOptions_se_lie_depuis_la_configuration_et_applique_les_defauts()
{
// Seul SecretKey est fourni : Issuer/Audience/ExpirationMinutes doivent prendre leurs défauts.
var config = ConstruireConfiguration(new Dictionary
{
["Jwt:SecretKey"] = "clef-secrete-de-test-suffisamment-longue-0123456789"
});
var options = new JwtOptions();
config.GetSection(JwtOptions.SectionName).Bind(options);
options.SecretKey.Should().Be("clef-secrete-de-test-suffisamment-longue-0123456789");
options.Issuer.Should().Be("SchotzIadKmTracker");
options.Audience.Should().Be("SchotzIadKmTracker");
options.ExpirationMinutes.Should().Be(720);
}
[Fact]
public void JwtOptions_prend_les_valeurs_fournies_par_la_configuration()
{
var config = ConstruireConfiguration(new Dictionary
{
["Jwt:SecretKey"] = "une-autre-clef-de-test-tres-longue-abcdefghijklmnop",
["Jwt:Issuer"] = "MonIssuer",
["Jwt:Audience"] = "MonAudience",
["Jwt:ExpirationMinutes"] = "60"
});
var options = new JwtOptions();
config.GetSection(JwtOptions.SectionName).Bind(options);
options.Issuer.Should().Be("MonIssuer");
options.Audience.Should().Be("MonAudience");
options.ExpirationMinutes.Should().Be(60);
}
// Validates: Requirements 6.3
[Fact]
public void AuthOptions_se_lie_depuis_la_configuration_et_applique_les_defauts()
{
// Configuration vide : les défauts doivent s'appliquer.
var config = ConstruireConfiguration(new Dictionary());
var options = new AuthOptions();
config.GetSection(AuthOptions.SectionName).Bind(options);
options.ResetTokenLifetimeMinutes.Should().Be(60);
options.FrontendBaseUrl.Should().Be("http://localhost:8080");
}
// Validates: Requirements 6.7
[Fact]
public void SmtpOptions_se_lie_depuis_la_configuration_et_applique_les_defauts()
{
var config = ConstruireConfiguration(new Dictionary());
var options = new SmtpOptions();
config.GetSection(SmtpOptions.SectionName).Bind(options);
options.Host.Should().BeEmpty();
options.Port.Should().Be(587);
options.User.Should().BeEmpty();
options.Password.Should().BeEmpty();
options.From.Should().BeEmpty();
}
}