using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Moq; namespace ChatBot.Tests.TestUtilities; /// /// Base class for integration tests with common setup /// public abstract class TestBase : IDisposable { private bool _disposed; protected IServiceProvider ServiceProvider { get; private set; } = null!; protected Mock LoggerMock { get; private set; } = null!; protected virtual void SetupServices() { var services = new ServiceCollection(); // Add logging LoggerMock = new Mock(); services.AddSingleton(LoggerMock.Object); services.AddLogging(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Debug)); // Add other common services ConfigureServices(services); ServiceProvider = services.BuildServiceProvider(); } protected abstract void ConfigureServices(IServiceCollection services); protected virtual void Dispose(bool disposing) { if (!_disposed && disposing && ServiceProvider is IDisposable disposable) { disposable.Dispose(); } _disposed = true; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } } /// /// Base class for unit tests with common assertions /// public abstract class UnitTestBase { protected static void AssertLogMessage(Mock loggerMock, LogLevel level, string message) { loggerMock.Verify( x => x.Log( level, It.IsAny(), It.Is((v, t) => v.ToString()!.Contains(message)), It.IsAny(), It.IsAny>() ), Times.AtLeastOnce ); } protected static void AssertLogError(Mock loggerMock, string message) { AssertLogMessage(loggerMock, LogLevel.Error, message); } protected static void AssertLogWarning(Mock loggerMock, string message) { AssertLogMessage(loggerMock, LogLevel.Warning, message); } protected static void AssertLogInformation(Mock loggerMock, string message) { AssertLogMessage(loggerMock, LogLevel.Information, message); } }