maksit-core/src/MaksIT.Core.Tests/Logging/FileLoggerTests.cs

221 lines
8.3 KiB
C#

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MaksIT.Core.Logging;
namespace MaksIT.Core.Tests.Logging;
public class FileLoggerTests {
private readonly string _testFolderPath;
public FileLoggerTests() {
_testFolderPath = Path.Combine(Path.GetTempPath(), "FileLoggerTests");
if (Directory.Exists(_testFolderPath)) {
Directory.Delete(_testFolderPath, true);
}
Directory.CreateDirectory(_testFolderPath);
}
[Fact]
public void ShouldWriteLogsToCorrectFile() {
// Arrange
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IHostEnvironment>(sp =>
new TestHostEnvironment {
EnvironmentName = Environments.Development,
ApplicationName = "TestApp",
ContentRootPath = Directory.GetCurrentDirectory()
});
serviceCollection.AddLogging(builder => builder.AddFileLogger(_testFolderPath, TimeSpan.FromDays(7)));
var provider = serviceCollection.BuildServiceProvider();
var logger = provider.GetRequiredService<ILogger<FileLoggerTests>>();
// Act
logger.LogInformation("Test log message");
// Assert
var logFile = Directory.GetFiles(_testFolderPath, "log_*.txt").FirstOrDefault();
Assert.NotNull(logFile);
var logContent = File.ReadAllText(logFile);
Assert.Contains("Test log message", logContent);
}
[Fact]
public void ShouldDeleteOldLogsBasedOnRetention() {
// Arrange
var retentionPeriod = TimeSpan.FromDays(1);
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IHostEnvironment>(sp =>
new TestHostEnvironment {
EnvironmentName = Environments.Development,
ApplicationName = "TestApp",
ContentRootPath = Directory.GetCurrentDirectory()
});
serviceCollection.AddLogging(builder => builder.AddFileLogger(_testFolderPath, retentionPeriod));
var provider = serviceCollection.BuildServiceProvider();
var logger = provider.GetRequiredService<ILogger<FileLoggerTests>>();
// Create an old log file
var oldLogFile = Path.Combine(_testFolderPath, $"log_{DateTime.Now.AddDays(-2):yyyy-MM-dd}.txt");
File.WriteAllText(oldLogFile, "Old log");
// Act
logger.LogInformation("New log message");
// Assert
Assert.False(File.Exists(oldLogFile), "Old log file should have been deleted.");
var logFile = Directory.GetFiles(_testFolderPath, "log_*.txt").FirstOrDefault();
Assert.NotNull(logFile);
var logContent = File.ReadAllText(logFile);
Assert.Contains("New log message", logContent);
}
[Fact]
public void ShouldHandleExceptionsGracefully() {
// Arrange
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IHostEnvironment>(sp =>
new TestHostEnvironment {
EnvironmentName = Environments.Development,
ApplicationName = "TestApp",
ContentRootPath = Directory.GetCurrentDirectory()
});
serviceCollection.AddLogging(builder => builder.AddFileLogger(_testFolderPath));
var provider = serviceCollection.BuildServiceProvider();
var logger = provider.GetRequiredService<ILogger<FileLoggerTests>>();
// Act & Assert
try {
logger.LogError(new InvalidOperationException("Test exception"), "An error occurred");
var logFile = Directory.GetFiles(_testFolderPath, "log_*.txt").FirstOrDefault();
Assert.NotNull(logFile);
var logContent = File.ReadAllText(logFile);
Assert.Contains("An error occurred", logContent);
Assert.Contains("Test exception", logContent);
} catch {
Assert.Fail("Logger should handle exceptions gracefully.");
}
}
[Fact]
public void ShouldWriteLogsToSubfolderWhenFolderPrefixUsed() {
// Arrange
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IHostEnvironment>(sp =>
new TestHostEnvironment {
EnvironmentName = Environments.Development,
ApplicationName = "TestApp",
ContentRootPath = Directory.GetCurrentDirectory()
});
serviceCollection.AddLogging(builder => builder.AddFileLogger(_testFolderPath, TimeSpan.FromDays(7)));
var provider = serviceCollection.BuildServiceProvider();
var loggerFactory = provider.GetRequiredService<ILoggerFactory>();
// Act - Create logger with Folder prefix
var logger = loggerFactory.CreateLogger(LoggerPrefix.Folder.WithValue("Audit"));
logger.LogInformation("Audit log message");
// Assert
var auditFolder = Path.Combine(_testFolderPath, "Audit");
Assert.True(Directory.Exists(auditFolder), "Audit subfolder should be created");
var logFile = Directory.GetFiles(auditFolder, "log_*.txt").FirstOrDefault();
Assert.NotNull(logFile);
var logContent = File.ReadAllText(logFile);
Assert.Contains("Audit log message", logContent);
}
[Fact]
public void ShouldWriteLogsToDefaultFolderWhenNoPrefixUsed() {
// Arrange
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IHostEnvironment>(sp =>
new TestHostEnvironment {
EnvironmentName = Environments.Development,
ApplicationName = "TestApp",
ContentRootPath = Directory.GetCurrentDirectory()
});
serviceCollection.AddLogging(builder => builder.AddFileLogger(_testFolderPath, TimeSpan.FromDays(7)));
var provider = serviceCollection.BuildServiceProvider();
var loggerFactory = provider.GetRequiredService<ILoggerFactory>();
// Act - Create logger with full type name (simulating ILogger<T>)
var logger = loggerFactory.CreateLogger("MyApp.Services.OrderService");
logger.LogInformation("Order service log message");
// Assert - Should NOT create subfolder for type names
var logFile = Directory.GetFiles(_testFolderPath, "log_*.txt").FirstOrDefault();
Assert.NotNull(logFile);
var logContent = File.ReadAllText(logFile);
Assert.Contains("Order service log message", logContent);
}
[Fact]
public void ShouldHandleFolderPrefixWithSpaces() {
// Arrange
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IHostEnvironment>(sp =>
new TestHostEnvironment {
EnvironmentName = Environments.Development,
ApplicationName = "TestApp",
ContentRootPath = Directory.GetCurrentDirectory()
});
serviceCollection.AddLogging(builder => builder.AddFileLogger(_testFolderPath, TimeSpan.FromDays(7)));
var provider = serviceCollection.BuildServiceProvider();
var loggerFactory = provider.GetRequiredService<ILoggerFactory>();
// Act
var logger = loggerFactory.CreateLogger(LoggerPrefix.Folder.WithValue("My Custom Logs"));
logger.LogInformation("Custom folder log message");
// Assert
var customFolder = Path.Combine(_testFolderPath, "My Custom Logs");
Assert.True(Directory.Exists(customFolder), "Custom subfolder with spaces should be created");
var logFile = Directory.GetFiles(customFolder, "log_*.txt").FirstOrDefault();
Assert.NotNull(logFile);
var logContent = File.ReadAllText(logFile);
Assert.Contains("Custom folder log message", logContent);
}
[Fact]
public void ShouldIgnoreEmptyFolderPrefix() {
// Arrange
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IHostEnvironment>(sp =>
new TestHostEnvironment {
EnvironmentName = Environments.Development,
ApplicationName = "TestApp",
ContentRootPath = Directory.GetCurrentDirectory()
});
serviceCollection.AddLogging(builder => builder.AddFileLogger(_testFolderPath, TimeSpan.FromDays(7)));
var provider = serviceCollection.BuildServiceProvider();
var loggerFactory = provider.GetRequiredService<ILoggerFactory>();
// Act - Create logger with empty folder value
var logger = loggerFactory.CreateLogger(LoggerPrefix.Folder.WithValue(""));
logger.LogInformation("Empty folder prefix log message");
// Assert - Should use default folder (not create empty subfolder)
var logFile = Directory.GetFiles(_testFolderPath, "log_*.txt").FirstOrDefault();
Assert.NotNull(logFile);
var logContent = File.ReadAllText(logFile);
Assert.Contains("Empty folder prefix log message", logContent);
}
}