using System.Diagnostics;
using Autofac;
using LightBDD.MsTest3;
using Microsoft.ApplicationInsights;
using PlanTempus.Components;
using PlanTempus.Components.ModuleRegistry;
using PlanTempus.Components.Outbox;
using PlanTempus.Core.Configurations;
using PlanTempus.Core.Configurations.JsonConfigProvider;
using PlanTempus.Core.Email;
using PlanTempus.Core.ModuleRegistry;
using PlanTempus.Core.Outbox;
using PlanTempus.Core.SeqLogging;
using PlanTempus.Database.ModuleRegistry;
using CrypticWizard.RandomWordGenerator;
namespace PlanTempus.X.BDD;
///
/// Base class for BDD tests. Combines LightBDD FeatureFixture with Autofac DI.
///
public abstract class BddTestFixture : FeatureFixture
{
private readonly string _configurationFilePath;
private OutboxListener _outboxListener;
private SeqBackgroundService _seqBackgroundService;
private CancellationTokenSource _cts;
protected BddTestFixture() : this(null)
{
}
public BddTestFixture(string configurationFilePath)
{
if (configurationFilePath is not null)
_configurationFilePath = configurationFilePath.TrimEnd('/') + "/";
}
protected IContainer Container { get; private set; }
protected ContainerBuilder ContainerBuilder { get; private set; }
protected ICommandHandler CommandHandler { get; private set; }
public string GetRandomWord()
{
var myWordGenerator = new WordGenerator();
return myWordGenerator.GetWord(WordGenerator.PartOfSpeech.verb);
}
public virtual IConfigurationRoot Configuration()
{
var configuration = new ConfigurationBuilder()
.AddJsonFile($"{_configurationFilePath}appconfiguration.dev.json")
.Build();
return configuration;
}
[TestInitialize]
public void SetupContainer()
{
var configuration = Configuration();
var builder = new ContainerBuilder();
builder.RegisterModule(new DbPostgreSqlModule
{
ConnectionString = configuration.GetConnectionString("DefaultConnection")
});
builder.RegisterModule(new TelemetryModule
{
TelemetryConfig = configuration.GetSection("ApplicationInsights").ToObject()
});
builder.RegisterModule(new SeqLoggingModule
{
SeqConfiguration = configuration.GetSection("SeqConfiguration").ToObject()
});
builder.RegisterModule();
builder.RegisterModule();
builder.RegisterModule();
builder.RegisterModule(new EmailModule
{
PostmarkConfiguration = configuration.GetSection("Postmark").ToObject()
});
builder.RegisterType().SingleInstance();
builder.RegisterType().SingleInstance();
ContainerBuilder = builder;
Container = builder.Build();
CommandHandler = Container.Resolve();
_cts = new CancellationTokenSource();
_seqBackgroundService = Container.Resolve();
_seqBackgroundService.StartAsync(_cts.Token);
_outboxListener = Container.Resolve();
_outboxListener.StartAsync(_cts.Token);
}
[TestCleanup]
public void CleanupContainer()
{
_cts?.Cancel();
_outboxListener?.StopAsync(CancellationToken.None).Wait();
_seqBackgroundService?.StopAsync(CancellationToken.None).Wait();
Trace.Flush();
if (Container is not null)
{
var telemetryClient = Container.Resolve();
telemetryClient.Flush();
try
{
Container.Dispose();
}
catch (System.Threading.Channels.ChannelClosedException)
{
// Channel already closed by SeqBackgroundService.StopAsync
}
Container = null;
}
}
}