using Microsoft.Extensions.Options; using Omika.Data.Configuration; namespace Omika.Tests.Connection; public class ServiceConnectionOptionsValidatorTests { private static ServiceConnectionOptions CreateValidOptions() => new() { Server = "127.0.0.1", Port = 4900, DatabaseName = "BATIK.01_BLS", Login = "susana" }; [Fact] public void Validate_ValidOptions_ReturnsSuccess() { var result = ServiceConnectionOptionsValidator.Validate(CreateValidOptions()); Assert.True(result.IsSuccess); } [Fact] public void Validate_MissingServer_ReturnsFailure() { var options = CreateValidOptions(); options.Server = null; var result = ServiceConnectionOptionsValidator.Validate(options); Assert.True(result.IsFailure); Assert.Contains(result.Errors, e => e.Contains("serveur", StringComparison.OrdinalIgnoreCase)); } [Fact] public void Validate_InvalidPort_ReturnsFailure() { var options = CreateValidOptions(); options.Port = 0; var result = ServiceConnectionOptionsValidator.Validate(options); Assert.True(result.IsFailure); Assert.Contains(result.Errors, e => e.Contains("port", StringComparison.OrdinalIgnoreCase)); } [Fact] public void Validate_MissingDatabase_ReturnsFailure() { var options = CreateValidOptions(); options.DatabaseName = null; var result = ServiceConnectionOptionsValidator.Validate(options); Assert.True(result.IsFailure); Assert.Contains(result.Errors, e => e.Contains("base", StringComparison.OrdinalIgnoreCase)); } [Fact] public void Validate_MissingLogin_ReturnsFailure() { var options = CreateValidOptions(); options.Login = null; var result = ServiceConnectionOptionsValidator.Validate(options); Assert.True(result.IsFailure); Assert.Contains(result.Errors, e => e.Contains("compte", StringComparison.OrdinalIgnoreCase)); } [Fact] public void Validate_NullPassword_IsAccepted() { var options = CreateValidOptions(); options.Password = null; var result = ServiceConnectionOptionsValidator.Validate(options); Assert.True(result.IsSuccess); } [Fact] public void Validate_EmptyPassword_IsAccepted() { var options = CreateValidOptions(); options.Password = ""; var result = ServiceConnectionOptionsValidator.Validate(options); Assert.True(result.IsSuccess); } [Fact] public void Validate_WhitespacePassword_IsAccepted() { var options = CreateValidOptions(); options.Password = " "; var result = ServiceConnectionOptionsValidator.Validate(options); Assert.True(result.IsSuccess); } [Fact] public void Validate_SetPassword_IsAccepted() { var options = CreateValidOptions(); options.Password = "secret"; var result = ServiceConnectionOptionsValidator.Validate(options); Assert.True(result.IsSuccess); } [Fact] public void Validate_ImplementsIValidateOptions() { var validator = new ServiceConnectionOptionsValidator(); Assert.IsAssignableFrom>(validator); } [Fact] public void ValidateOptions_Valid_ReturnsSuccess() { IValidateOptions validator = new ServiceConnectionOptionsValidator(); var result = validator.Validate(null, CreateValidOptions()); Assert.Equal(ValidateOptionsResult.Success, result); } [Fact] public void ValidateOptions_Invalid_ReturnsFailure() { IValidateOptions validator = new ServiceConnectionOptionsValidator(); var options = CreateValidOptions(); options.Server = null; var result = validator.Validate(null, options); Assert.True(result.Failed); Assert.Contains(result.Failures, e => e.Contains("serveur", StringComparison.OrdinalIgnoreCase)); } [Fact] public void ToString_DoesNotExposePassword() { var options = CreateValidOptions(); options.Password = "secret"; options.FilePasswords.ProtectionStd = "secret-std"; var text = options.ToString(); Assert.DoesNotContain("secret", text, StringComparison.OrdinalIgnoreCase); } }