using System; using System.IO; using Xunit; namespace GitConverter.TestsApp.ConsoleApp { /// /// Tests for logging configuration in Program.cs. /// Validates that logging initialization handles various edge cases gracefully. /// [Collection("Logging")] public class LoggingTests : IDisposable { private readonly TextWriter _originalOut; private readonly TextWriter _originalErr; private readonly StringWriter _outWriter; private readonly StringWriter _errWriter; private readonly string _tempRoot; public LoggingTests() { _originalOut = Console.Out; _originalErr = Console.Error; _outWriter = new StringWriter(); _errWriter = new StringWriter(); Console.SetOut(_outWriter); Console.SetError(_errWriter); _tempRoot = Path.Combine(Path.GetTempPath(), "GitConverter.LogTests", Guid.NewGuid().ToString("N")); Directory.CreateDirectory(_tempRoot); } public void Dispose() { Console.SetOut(_originalOut); Console.SetError(_originalErr); _outWriter.Dispose(); _errWriter.Dispose(); try { if (Directory.Exists(_tempRoot)) Directory.Delete(_tempRoot, true); } catch { } } [Fact(DisplayName = "Logging with valid path and level creates log file")] public void Run_WithValidLogPath_CreatesLogFile() { var dummyInput = Path.Combine(_tempRoot, "dummy.csv"); File.WriteAllText(dummyInput, "x,y\n1,2"); var logPath = Path.Combine(_tempRoot, "test.log"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", dummyInput, "Csv", outDir, tempDir, "Log", logPath, "DEBUG" }; var exit = GitConverter.ConsoleApp.Program.Run(args); Assert.True(File.Exists(logPath) || _errWriter.ToString().Contains("warning: logging disabled"), $"Expected log file at {logPath} or a warning about logging failure"); } [Fact(DisplayName = "Logging with invalid path prints warning to stderr")] public void Run_WithInvalidLogPath_PrintsWarningToStderr() { var dummyInput = Path.Combine(_tempRoot, "dummy.csv"); File.WriteAllText(dummyInput, "x,y\n1,2"); var invalidLogPath = Path.Combine(_tempRoot, "nonexistent", "subdir", "test.log"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", dummyInput, "Csv", outDir, tempDir, "Log", invalidLogPath }; _errWriter.GetStringBuilder().Clear(); var exit = GitConverter.ConsoleApp.Program.Run(args); var stderr = _errWriter.ToString(); Assert.Contains("warning: logging disabled", stderr.ToLowerInvariant()); } [Fact(DisplayName = "Logging without Log keyword ignores subsequent tokens")] public void Run_WithoutLogKeyword_IgnoresLogPath() { var dummyInput = Path.Combine(_tempRoot, "dummy.csv"); File.WriteAllText(dummyInput, "x,y\n1,2"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", dummyInput, "Csv", outDir, tempDir, "some_random_token", "random_path.log" }; var exit = GitConverter.ConsoleApp.Program.Run(args); var stderr = _errWriter.ToString(); Assert.DoesNotContain("warning: logging disabled", stderr.ToLowerInvariant()); } [Fact(DisplayName = "Log level parsing is case-insensitive")] public void Run_LogLevelCaseInsensitive_AcceptsAnyCase() { var dummyInput = Path.Combine(_tempRoot, "dummy.csv"); File.WriteAllText(dummyInput, "x,y\n1,2"); var logPath = Path.Combine(_tempRoot, "test_case.log"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", dummyInput, "Csv", outDir, tempDir, "Log", logPath, "debug" }; var exit = GitConverter.ConsoleApp.Program.Run(args); var stderr = _errWriter.ToString(); Assert.DoesNotContain("unknown", stderr.ToLowerInvariant()); } [Fact(DisplayName = "Log path with spaces is parsed correctly")] public void Run_LogPathWithSpaces_ParsedCorrectly() { var dummyInput = Path.Combine(_tempRoot, "dummy.csv"); File.WriteAllText(dummyInput, "x,y\n1,2"); var logDir = Path.Combine(_tempRoot, "log folder with spaces"); Directory.CreateDirectory(logDir); var logPath = Path.Combine(logDir, "test.log"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", dummyInput, "Csv", outDir, tempDir, "Log", logPath, "INFO" }; var exit = GitConverter.ConsoleApp.Program.Run(args); Assert.True(File.Exists(logPath) || _errWriter.ToString().Contains("warning"), "Expected log file to be created when path contains spaces"); } } }