namespace SQLInsight.Connectivity.Tests; public class ConnectionStringsTests { [Fact] public void SqlClient_defaults_to_mandatory_encryption_with_certificate_validation() { var cs = ConnectionStrings.ForSqlClient(new ConnectionTarget { Server = "sql01" }); Assert.Contains("Encrypt=True", cs, StringComparison.OrdinalIgnoreCase); Assert.DoesNotContain("Trust Server Certificate=True", cs, StringComparison.OrdinalIgnoreCase); Assert.Contains("Integrated Security=True", cs, StringComparison.OrdinalIgnoreCase); Assert.Contains("Application Name=\"SQLInsight Pro\"", cs, StringComparison.OrdinalIgnoreCase); } [Fact] public void Odbc_uses_configured_driver_and_sql_login() { var cs = ConnectionStrings.ForOdbc(new ConnectionTarget { Server = "legacy01", Authentication = AuthenticationMode.SqlLogin, UserName = "sqlinsight", Password = "secret", Encryption = EncryptionMode.Optional, OdbcDriver = "SQL Server", }); Assert.Contains("Driver={SQL Server}", cs, StringComparison.OrdinalIgnoreCase); Assert.Contains("UID=sqlinsight", cs, StringComparison.OrdinalIgnoreCase); Assert.Contains("Encrypt=no", cs, StringComparison.OrdinalIgnoreCase); Assert.DoesNotContain("Trusted_Connection", cs, StringComparison.OrdinalIgnoreCase); } [Fact] public void Sql_login_without_user_name_is_rejected() { var target = new ConnectionTarget { Server = "sql01", Authentication = AuthenticationMode.SqlLogin }; Assert.Throws(() => ConnectionStrings.ForSqlClient(target)); } } public class EntraTests { [Fact] public void Entra_connection_string_carries_no_credentials() { var cs = ConnectionStrings.ForSqlClient(new ConnectionTarget { Server = "mi.abc.database.windows.net", Authentication = AuthenticationMode.EntraManagedIdentity }); Assert.DoesNotContain("Integrated Security=True", cs, StringComparison.OrdinalIgnoreCase); Assert.DoesNotContain("User ID", cs, StringComparison.OrdinalIgnoreCase); Assert.DoesNotContain("Password", cs, StringComparison.OrdinalIgnoreCase); } [Fact] public void Entra_is_not_offered_over_odbc() { Assert.Throws(() => ConnectionStrings.ForOdbc(new ConnectionTarget { Server = "x", Authentication = AuthenticationMode.EntraDefault })); } [Theory] [InlineData(AuthenticationMode.EntraManagedIdentity, "Azure.Identity.ManagedIdentityCredential")] [InlineData(AuthenticationMode.EntraDefault, "Azure.Identity.DefaultAzureCredential")] public void Credential_type_follows_the_mode(AuthenticationMode mode, string type) { Assert.Equal(type, EntraCredentials.For(new ConnectionTarget { Server = "x", Authentication = mode }).GetType().FullName); } [Fact] public void Service_principal_needs_tenant_client_and_secret() { Assert.Throws(() => EntraCredentials.For(new ConnectionTarget { Server = "x", Authentication = AuthenticationMode.EntraServicePrincipal, UserName = "client" })); } }