using MBN_STOCK_WEBVIEW.Infrastructure; using MMoneyCoderSharp.Data; using MySqlConnector; using Oracle.ManagedDataAccess.Client; namespace MBN_STOCK_WEBVIEW.Infrastructure.Tests; public sealed class ProviderDatabaseConnectionFactoryTests { [Fact] public void CreateOracleConnection_UsesSidDescriptor() { var options = TestOptions.CreateConfigured(); options.Oracle.Sid = "TESTSID"; options.Oracle.ServiceName = null; var factory = new ProviderDatabaseConnectionFactory(options); using var connection = factory.Create(DataSourceKind.Oracle); var parsed = new OracleConnectionStringBuilder(connection.ConnectionString); Assert.True(parsed.DataSource.Contains("(SID=TESTSID)", StringComparison.Ordinal)); Assert.False(parsed.DataSource.Contains("SERVICE_NAME", StringComparison.Ordinal)); Assert.False(parsed.PersistSecurityInfo); } [Fact] public void CreateOracleConnection_UsesServiceNameDescriptor() { var options = TestOptions.CreateConfigured(); options.Oracle.Sid = null; options.Oracle.ServiceName = "TESTSERVICE"; var factory = new ProviderDatabaseConnectionFactory(options); using var connection = factory.Create(DataSourceKind.Oracle); var parsed = new OracleConnectionStringBuilder(connection.ConnectionString); Assert.True(parsed.DataSource.Contains("(SERVICE_NAME=TESTSERVICE)", StringComparison.Ordinal)); Assert.False(parsed.DataSource.Contains("(SID=", StringComparison.Ordinal)); Assert.False(parsed.PersistSecurityInfo); } [Theory] [InlineData(MariaDbTlsMode.Disabled, MySqlSslMode.None)] [InlineData(MariaDbTlsMode.Preferred, MySqlSslMode.Preferred)] [InlineData(MariaDbTlsMode.Required, MySqlSslMode.Required)] [InlineData(MariaDbTlsMode.VerifyCertificate, MySqlSslMode.VerifyCA)] [InlineData(MariaDbTlsMode.VerifyIdentity, MySqlSslMode.VerifyFull)] public void CreateMariaDbConnection_UsesEndpointPortAndTls( MariaDbTlsMode configuredTls, MySqlSslMode expectedTls) { var options = TestOptions.CreateConfigured(); options.MariaDb.Host = "maria-builder-test.invalid"; options.MariaDb.Port = 43306; options.MariaDb.TlsMode = configuredTls; var factory = new ProviderDatabaseConnectionFactory(options); using var connection = factory.Create(DataSourceKind.MariaDb); var parsed = new MySqlConnectionStringBuilder(connection.ConnectionString); Assert.Equal("maria-builder-test.invalid", parsed.Server); Assert.Equal(43306u, parsed.Port); Assert.Equal(expectedTls, parsed.SslMode); Assert.False(parsed.PersistSecurityInfo); } [Fact] public void PublicConfigurationException_DoesNotExposeRejectedHostUserOrPassword() { const string rejectedHost = "rejected(host)-sensitive-sentinel"; const string user = "oracle-user-sensitive-sentinel"; const string password = "oracle-password-sensitive-sentinel"; var options = TestOptions.CreateConfigured(); options.Oracle.Host = rejectedHost; options.Oracle.UserName = user; options.Oracle.Password = password; var factory = new ProviderDatabaseConnectionFactory(options); var exception = Assert.Throws( () => factory.Create(DataSourceKind.Oracle)); Assert.DoesNotContain(rejectedHost, exception.Message, StringComparison.Ordinal); Assert.DoesNotContain(user, exception.Message, StringComparison.Ordinal); Assert.DoesNotContain(password, exception.Message, StringComparison.Ordinal); } }