136 lines
5.9 KiB
C#
136 lines
5.9 KiB
C#
using System.Text.Json;
|
|
using MBN_STOCK_WEBVIEW.Infrastructure;
|
|
using MMoneyCoderSharp.Data;
|
|
|
|
namespace MBN_STOCK_WEBVIEW.Infrastructure.Tests;
|
|
|
|
public sealed class DatabaseOptionsLoaderTests
|
|
{
|
|
[Fact]
|
|
public void Load_MissingFile_ReturnsSafeUnconfiguredDefaults()
|
|
{
|
|
var path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"), "missing.json");
|
|
var loader = new DatabaseOptionsLoader(_ => null);
|
|
|
|
var options = loader.Load(path);
|
|
|
|
Assert.False(options.IsConfigured(DataSourceKind.Oracle));
|
|
Assert.False(options.IsConfigured(DataSourceKind.MariaDb));
|
|
Assert.Equal(1521, options.Oracle.Port);
|
|
Assert.Equal(3306, options.MariaDb.Port);
|
|
Assert.Null(options.Oracle.Password);
|
|
Assert.Null(options.MariaDb.Password);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task LoadAsync_EnvironmentValuesOverrideJsonValues()
|
|
{
|
|
var directory = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"));
|
|
Directory.CreateDirectory(directory);
|
|
var path = Path.Combine(directory, "database.local.json");
|
|
|
|
try
|
|
{
|
|
var jsonOptions = new DatabaseOptions
|
|
{
|
|
Oracle = new OracleDatabaseOptions
|
|
{
|
|
Host = "json-oracle-host.invalid",
|
|
Port = 1521,
|
|
Sid = "JSONSID",
|
|
UserName = "json-oracle-user",
|
|
Password = "json-oracle-password"
|
|
},
|
|
MariaDb = new MariaDbDatabaseOptions
|
|
{
|
|
Host = "json-maria-host.invalid",
|
|
Port = 3306,
|
|
Database = "json_database",
|
|
UserName = "json-maria-user",
|
|
Password = "json-maria-password",
|
|
TlsMode = MariaDbTlsMode.Preferred
|
|
},
|
|
Resilience = new DatabaseResilienceOptions
|
|
{
|
|
OperationTimeoutSeconds = 45,
|
|
MaximumRetryCount = 2,
|
|
InitialRetryDelayMilliseconds = 250
|
|
}
|
|
};
|
|
await File.WriteAllTextAsync(path, JsonSerializer.Serialize(jsonOptions));
|
|
|
|
var environment = new Dictionary<string, string>(StringComparer.Ordinal)
|
|
{
|
|
["MBN_STOCK_ORACLE_HOST"] = "env-oracle-host.invalid",
|
|
["MBN_STOCK_ORACLE_PORT"] = "1522",
|
|
["MBN_STOCK_ORACLE_USERNAME"] = "env-oracle-user",
|
|
["MBN_STOCK_ORACLE_PASSWORD"] = "env-oracle-password",
|
|
["MBN_STOCK_MARIADB_HOST"] = "env-maria-host.invalid",
|
|
["MBN_STOCK_MARIADB_PORT"] = "3307",
|
|
["MBN_STOCK_MARIADB_DATABASE"] = "env_database",
|
|
["MBN_STOCK_MARIADB_USERNAME"] = "env-maria-user",
|
|
["MBN_STOCK_MARIADB_PASSWORD"] = "env-maria-password",
|
|
["MBN_STOCK_MARIADB_TLS_MODE"] = "Required",
|
|
["MBN_STOCK_DB_OPERATION_TIMEOUT_SECONDS"] = "12",
|
|
["MBN_STOCK_DB_MAX_RETRY_COUNT"] = "4",
|
|
["MBN_STOCK_DB_INITIAL_RETRY_DELAY_MS"] = "75"
|
|
};
|
|
var loader = new DatabaseOptionsLoader(
|
|
name => environment.TryGetValue(name, out var value) ? value : null);
|
|
|
|
var options = await loader.LoadAsync(path);
|
|
|
|
Assert.Equal("env-oracle-host.invalid", options.Oracle.Host);
|
|
Assert.Equal(1522, options.Oracle.Port);
|
|
Assert.Equal("JSONSID", options.Oracle.Sid);
|
|
Assert.Equal("env-oracle-user", options.Oracle.UserName);
|
|
Assert.Equal("env-oracle-password", options.Oracle.Password);
|
|
Assert.Equal("env-maria-host.invalid", options.MariaDb.Host);
|
|
Assert.Equal(3307, options.MariaDb.Port);
|
|
Assert.Equal("env_database", options.MariaDb.Database);
|
|
Assert.Equal("env-maria-user", options.MariaDb.UserName);
|
|
Assert.Equal("env-maria-password", options.MariaDb.Password);
|
|
Assert.Equal(MariaDbTlsMode.Required, options.MariaDb.TlsMode);
|
|
Assert.Equal(12, options.Resilience.OperationTimeoutSeconds);
|
|
Assert.Equal(4, options.Resilience.MaximumRetryCount);
|
|
Assert.Equal(75, options.Resilience.InitialRetryDelayMilliseconds);
|
|
}
|
|
finally
|
|
{
|
|
Directory.Delete(directory, recursive: true);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void ToString_DoesNotExposeHostUserOrPassword()
|
|
{
|
|
const string oracleHost = "oracle-host-sensitive-sentinel";
|
|
const string oracleUser = "oracle-user-sensitive-sentinel";
|
|
const string oraclePassword = "oracle-password-sensitive-sentinel";
|
|
const string mariaHost = "maria-host-sensitive-sentinel";
|
|
const string mariaUser = "maria-user-sensitive-sentinel";
|
|
const string mariaPassword = "maria-password-sensitive-sentinel";
|
|
var options = TestOptions.CreateConfigured();
|
|
options.Oracle.Host = oracleHost;
|
|
options.Oracle.UserName = oracleUser;
|
|
options.Oracle.Password = oraclePassword;
|
|
options.MariaDb.Host = mariaHost;
|
|
options.MariaDb.UserName = mariaUser;
|
|
options.MariaDb.Password = mariaPassword;
|
|
|
|
var representations = string.Join(
|
|
Environment.NewLine,
|
|
options.ToString(),
|
|
options.Oracle.ToString(),
|
|
options.MariaDb.ToString(),
|
|
options.Resilience.ToString());
|
|
|
|
Assert.DoesNotContain(oracleHost, representations, StringComparison.Ordinal);
|
|
Assert.DoesNotContain(oracleUser, representations, StringComparison.Ordinal);
|
|
Assert.DoesNotContain(oraclePassword, representations, StringComparison.Ordinal);
|
|
Assert.DoesNotContain(mariaHost, representations, StringComparison.Ordinal);
|
|
Assert.DoesNotContain(mariaUser, representations, StringComparison.Ordinal);
|
|
Assert.DoesNotContain(mariaPassword, representations, StringComparison.Ordinal);
|
|
}
|
|
}
|