using ScadaLink.CLI; namespace ScadaLink.CLI.Tests; [Collection("Environment")] public class CliConfigTests { [Fact] public void Load_DefaultFormat_IsJson() { var origUrl = Environment.GetEnvironmentVariable("SCADALINK_MANAGEMENT_URL"); var origFormat = Environment.GetEnvironmentVariable("SCADALINK_FORMAT"); try { Environment.SetEnvironmentVariable("SCADALINK_MANAGEMENT_URL", null); Environment.SetEnvironmentVariable("SCADALINK_FORMAT", null); var config = CliConfig.Load(); // DefaultFormat is always "json" unless overridden by config file or env var Assert.Equal("json", config.DefaultFormat); } finally { Environment.SetEnvironmentVariable("SCADALINK_MANAGEMENT_URL", origUrl); Environment.SetEnvironmentVariable("SCADALINK_FORMAT", origFormat); } } [Fact] public void Load_ManagementUrl_FromEnvironment() { var orig = Environment.GetEnvironmentVariable("SCADALINK_MANAGEMENT_URL"); try { Environment.SetEnvironmentVariable("SCADALINK_MANAGEMENT_URL", "http://central:5000"); var config = CliConfig.Load(); Assert.Equal("http://central:5000", config.ManagementUrl); } finally { Environment.SetEnvironmentVariable("SCADALINK_MANAGEMENT_URL", orig); } } [Fact] public void Load_Format_FromEnvironment() { var orig = Environment.GetEnvironmentVariable("SCADALINK_FORMAT"); try { Environment.SetEnvironmentVariable("SCADALINK_FORMAT", "table"); var config = CliConfig.Load(); Assert.Equal("table", config.DefaultFormat); } finally { Environment.SetEnvironmentVariable("SCADALINK_FORMAT", orig); } } /// /// CLI-021 regression: a malformed ~/.scadalink/config.json must NOT abort the /// CLI before any command runs — Load() must warn (to stderr) and return a /// usable default config so command-line overrides (--url, --username, etc.) /// and env vars can still take effect. /// [Fact] public void Load_MalformedConfigFile_DoesNotThrow_WarnsAndReturnsDefault() { var tempHome = Path.Combine(Path.GetTempPath(), "scadalink-cli-test-" + Guid.NewGuid().ToString("N")); Directory.CreateDirectory(Path.Combine(tempHome, ".scadalink")); File.WriteAllText( Path.Combine(tempHome, ".scadalink", "config.json"), "{ this is not valid json :: "); var origHome = Environment.GetEnvironmentVariable("HOME"); var origUserProfile = Environment.GetEnvironmentVariable("USERPROFILE"); var origUrl = Environment.GetEnvironmentVariable("SCADALINK_MANAGEMENT_URL"); var origFormat = Environment.GetEnvironmentVariable("SCADALINK_FORMAT"); var origUser = Environment.GetEnvironmentVariable("SCADALINK_USERNAME"); var origPass = Environment.GetEnvironmentVariable("SCADALINK_PASSWORD"); var origStderr = Console.Error; try { Environment.SetEnvironmentVariable("HOME", tempHome); Environment.SetEnvironmentVariable("USERPROFILE", tempHome); Environment.SetEnvironmentVariable("SCADALINK_MANAGEMENT_URL", null); Environment.SetEnvironmentVariable("SCADALINK_FORMAT", null); Environment.SetEnvironmentVariable("SCADALINK_USERNAME", null); Environment.SetEnvironmentVariable("SCADALINK_PASSWORD", null); var stderrCapture = new StringWriter(); Console.SetError(stderrCapture); // Must not throw. var config = CliConfig.Load(); Assert.Equal("json", config.DefaultFormat); Assert.Null(config.ManagementUrl); var stderrText = stderrCapture.ToString(); Assert.Contains("warning", stderrText, StringComparison.OrdinalIgnoreCase); Assert.Contains("config.json", stderrText); } finally { Console.SetError(origStderr); Environment.SetEnvironmentVariable("HOME", origHome); Environment.SetEnvironmentVariable("USERPROFILE", origUserProfile); Environment.SetEnvironmentVariable("SCADALINK_MANAGEMENT_URL", origUrl); Environment.SetEnvironmentVariable("SCADALINK_FORMAT", origFormat); Environment.SetEnvironmentVariable("SCADALINK_USERNAME", origUser); Environment.SetEnvironmentVariable("SCADALINK_PASSWORD", origPass); try { Directory.Delete(tempHome, recursive: true); } catch { /* best-effort cleanup */ } } } }