using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Moq;
namespace ChatBot.Tests.TestUtilities;
///
/// Base class for integration tests with common setup
///
public abstract class TestBase : IDisposable
{
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 Cleanup()
{
if (ServiceProvider is IDisposable disposable)
{
disposable.Dispose();
}
}
public void Dispose()
{
Cleanup();
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);
}
}