118 lines
4.2 KiB
C#
118 lines
4.2 KiB
C#
using ZB.MOM.WW.ScadaBridge.DelmiaNotifier;
|
|
|
|
namespace ZB.MOM.WW.ScadaBridge.DelmiaNotifier.Tests;
|
|
|
|
public class ConfigLoaderTests
|
|
{
|
|
[Theory]
|
|
[InlineData("relative")]
|
|
[InlineData("ftp://example.com")]
|
|
[InlineData("https://good.example,broken")]
|
|
[InlineData("http://")]
|
|
public void Load_RejectsInvalidEndpointsBeforeDispatch(string urls)
|
|
{
|
|
var error = Assert.Throws<InvalidOperationException>(() =>
|
|
ConfigLoader.Load(System.Text.Json.JsonSerializer.Serialize(new { ScadaBridge = new { BaseUrls = urls } })));
|
|
Assert.Contains("ScadaBridge:BaseUrls", error.Message);
|
|
Assert.Contains("HTTP", error.Message);
|
|
}
|
|
|
|
[Fact]
|
|
public void SplitBaseUrls_trims_and_drops_empties()
|
|
{
|
|
var urls = ConfigLoader.SplitBaseUrls("a, b ,,c");
|
|
Assert.Equal(new[] { "a", "b", "c" }, urls);
|
|
}
|
|
|
|
[Fact]
|
|
public void SplitBaseUrls_null_or_whitespace_returns_empty()
|
|
{
|
|
Assert.Empty(ConfigLoader.SplitBaseUrls(null));
|
|
Assert.Empty(ConfigLoader.SplitBaseUrls(" "));
|
|
}
|
|
|
|
[Fact]
|
|
public void Load_defaults_timeout_to_30_when_omitted()
|
|
{
|
|
var cfg = ConfigLoader.Load("{\"ScadaBridge\":{\"BaseUrls\":\"http://x\"}}");
|
|
Assert.Equal(30, cfg.ScadaBridge.TimeoutSeconds);
|
|
Assert.Equal("http://x", cfg.ScadaBridge.BaseUrls);
|
|
}
|
|
|
|
[Fact]
|
|
public void Load_reads_all_fields()
|
|
{
|
|
var cfg = ConfigLoader.Load("{\"ScadaBridge\":{\"BaseUrls\":\"https://a,http://b\",\"TimeoutSeconds\":5,\"LogPath\":\"l.log\"}}");
|
|
Assert.Equal("https://a,http://b", cfg.ScadaBridge.BaseUrls);
|
|
Assert.Equal(5, cfg.ScadaBridge.TimeoutSeconds);
|
|
Assert.Equal("l.log", cfg.ScadaBridge.LogPath);
|
|
}
|
|
|
|
[Fact]
|
|
public void ResolveApiKey_returns_null_when_unset_or_whitespace()
|
|
{
|
|
Assert.Null(ConfigLoader.ResolveApiKey(_ => null, new NotifierConfig()));
|
|
Assert.Null(ConfigLoader.ResolveApiKey(_ => " ", new NotifierConfig()));
|
|
}
|
|
|
|
[Fact]
|
|
public void ResolveApiKey_returns_value_when_present()
|
|
{
|
|
Assert.Equal("sbk_x", ConfigLoader.ResolveApiKey(n => n == "SCADABRIDGE_API_KEY" ? "sbk_x" : null, new NotifierConfig()));
|
|
}
|
|
|
|
[Fact]
|
|
public void Load_reads_ApiKey_from_ScadaBridge_section()
|
|
{
|
|
var cfg = ConfigLoader.Load("{\"ScadaBridge\":{\"BaseUrls\":\"http://x\",\"ApiKey\":\"sbk_file\"}}");
|
|
Assert.Equal("sbk_file", cfg.ScadaBridge.ApiKey);
|
|
}
|
|
|
|
[Fact]
|
|
public void ResolveApiKey_prefers_env_over_config()
|
|
{
|
|
var cfg = ConfigLoader.Load("{\"ScadaBridge\":{\"ApiKey\":\"sbk_file\"}}");
|
|
Assert.Equal("sbk_env", ConfigLoader.ResolveApiKey(n => n == "SCADABRIDGE_API_KEY" ? "sbk_env" : null, cfg));
|
|
}
|
|
|
|
[Fact]
|
|
public void ResolveApiKey_falls_back_to_config_when_env_unset_or_blank()
|
|
{
|
|
var cfg = ConfigLoader.Load("{\"ScadaBridge\":{\"ApiKey\":\" sbk_file \"}}");
|
|
Assert.Equal("sbk_file", ConfigLoader.ResolveApiKey(_ => null, cfg));
|
|
Assert.Equal("sbk_file", ConfigLoader.ResolveApiKey(_ => " ", cfg));
|
|
}
|
|
|
|
[Fact]
|
|
public void ResolveApiKey_trims_env_value_like_the_file_value()
|
|
{
|
|
Assert.Equal("sbk_env", ConfigLoader.ResolveApiKey(_ => " sbk_env \t", new NotifierConfig()));
|
|
}
|
|
|
|
[Fact]
|
|
public void ResolveApiKey_reports_which_source_supplied_the_key()
|
|
{
|
|
var cfg = ConfigLoader.Load("{\"ScadaBridge\":{\"ApiKey\":\"sbk_file\"}}");
|
|
ConfigLoader.ResolveApiKey(_ => "sbk_env", cfg, out var fromEnv);
|
|
ConfigLoader.ResolveApiKey(_ => null, cfg, out var fromFile);
|
|
ConfigLoader.ResolveApiKey(_ => null, new NotifierConfig(), out var none);
|
|
Assert.Equal(ConfigLoader.ApiKeySourceEnvironment, fromEnv);
|
|
Assert.Equal(ConfigLoader.ApiKeySourceFile, fromFile);
|
|
Assert.Null(none);
|
|
}
|
|
|
|
[Fact]
|
|
public void Load_leaves_ApiKey_null_when_absent()
|
|
{
|
|
var cfg = ConfigLoader.Load("{\"ScadaBridge\":{\"BaseUrls\":\"http://x\"}}");
|
|
Assert.Null(cfg.ScadaBridge.ApiKey);
|
|
}
|
|
|
|
[Fact]
|
|
public void ResolveApiKey_returns_null_when_neither_source_set()
|
|
{
|
|
var cfg = ConfigLoader.Load("{\"ScadaBridge\":{\"ApiKey\":\" \"}}");
|
|
Assert.Null(ConfigLoader.ResolveApiKey(_ => null, cfg));
|
|
}
|
|
}
|