Improves configuration and telemetry handling in tests

Adds null checks for telemetry and logging configurations
Prevents registration of modules with empty configuration
Updates test configuration file copy behavior

Enhances robustness of test infrastructure by conditionally registering telemetry and logging modules only when valid configuration is present
This commit is contained in:
Janus C. H. Knudsen 2025-08-03 14:10:49 +02:00
parent 5275a75502
commit 3aeae6315b
3 changed files with 96 additions and 91 deletions

View file

@ -1,4 +1,4 @@
using System.Data; using System.Data;
using Microsoft.ApplicationInsights; using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts; using Microsoft.ApplicationInsights.DataContracts;
using SWP.Core.Database.ConnectionFactory; using SWP.Core.Database.ConnectionFactory;
@ -10,10 +10,10 @@ public class SqlOperations : IDatabaseOperations
private readonly IDbConnectionFactory _connectionFactory; private readonly IDbConnectionFactory _connectionFactory;
private readonly TelemetryClient _telemetryClient; private readonly TelemetryClient _telemetryClient;
public SqlOperations(IDbConnectionFactory connectionFactory, TelemetryClient telemetryClient) public SqlOperations(IDbConnectionFactory connectionFactory, TelemetryClient telemetryClient = null)
{ {
_connectionFactory = connectionFactory; _connectionFactory = connectionFactory;
_telemetryClient = telemetryClient; _telemetryClient = telemetryClient ?? new TelemetryClient();
} }
public DatabaseScope CreateScope(string operationName) public DatabaseScope CreateScope(string operationName)
@ -54,4 +54,4 @@ public class SqlOperations : IDatabaseOperations
throw; throw;
} }
} }
} }

View file

@ -27,7 +27,7 @@
<ItemGroup> <ItemGroup>
<None Update="appconfiguration.dev.json"> <None Update="appconfiguration.dev.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None> </None>
<None Update="ConfigurationTests\appconfiguration.dev.json"> <None Update="ConfigurationTests\appconfiguration.dev.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>

View file

@ -1,87 +1,92 @@
using System.Diagnostics; using System.Diagnostics;
using Autofac; using Autofac;
using Microsoft.ApplicationInsights; using Microsoft.ApplicationInsights;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using SWP.Core.Configurations; using SWP.Core.Configurations;
using SWP.Core.Configurations.JsonConfigProvider; using SWP.Core.Configurations.JsonConfigProvider;
using SWP.Core.Database.ModuleRegistry; using SWP.Core.Database.ModuleRegistry;
using SWP.Core.ModuleRegistry; using SWP.Core.ModuleRegistry;
using SWP.Core.SeqLogging; using SWP.Core.SeqLogging;
namespace SWP.Core.X.TDD; namespace SWP.Core.X.TDD;
/// <summary> /// <summary>
/// Act as base class for tests. Avoids duplication of test setup code /// Act as base class for tests. Avoids duplication of test setup code
/// </summary> /// </summary>
[TestClass] [TestClass]
public abstract class TestFixture public abstract class TestFixture
{ {
private readonly string _configurationFilePath; private readonly string _configurationFilePath;
protected TestFixture() : this(null) protected TestFixture() : this(null)
{ {
} }
public TestFixture(string configurationFilePath) public TestFixture(string configurationFilePath)
{ {
if (configurationFilePath is not null) if (configurationFilePath is not null)
_configurationFilePath = configurationFilePath?.TrimEnd('/') + "/"; _configurationFilePath = configurationFilePath?.TrimEnd('/') + "/";
CreateContainerBuilder(); CreateContainerBuilder();
Container = ContainerBuilder.Build(); Container = ContainerBuilder.Build();
} }
protected IContainer Container { get; private set; } protected IContainer Container { get; private set; }
protected ContainerBuilder ContainerBuilder { get; private set; } protected ContainerBuilder ContainerBuilder { get; private set; }
public virtual IConfigurationRoot Configuration() public virtual IConfigurationRoot Configuration()
{ {
var configuration = new ConfigurationBuilder() var configuration = new ConfigurationBuilder()
.AddJsonFile($"{_configurationFilePath}appconfiguration.dev.json") .AddJsonFile($"{_configurationFilePath}appconfiguration.dev.json")
.Build(); .Build();
return configuration; return configuration;
} }
protected virtual void CreateContainerBuilder() protected virtual void CreateContainerBuilder()
{ {
var configuration = Configuration(); var configuration = Configuration();
var builder = new ContainerBuilder(); var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(Logger<>)) builder.RegisterGeneric(typeof(Logger<>))
.As(typeof(ILogger<>)) .As(typeof(ILogger<>))
.SingleInstance(); .SingleInstance();
builder.RegisterModule(new DbPostgreSqlModule builder.RegisterModule(new DbPostgreSqlModule
{ {
ConnectionString = configuration.GetConnectionString("DefaultConnection") ConnectionString = configuration.GetConnectionString("DefaultConnection")
}); });
builder.RegisterModule(new TelemetryModule if (!string.IsNullOrEmpty(configuration.GetSection("ApplicationInsights").ToObject<TelemetryConfig>().ConnectionString))
{ builder.RegisterModule(new TelemetryModule
TelemetryConfig = configuration.GetSection("ApplicationInsights").ToObject<TelemetryConfig>() {
}); TelemetryConfig = configuration.GetSection("ApplicationInsights").ToObject<TelemetryConfig>()
builder.RegisterModule(new SeqLoggingModule });
{
SeqConfiguration = configuration.GetSection("SeqConfiguration").ToObject<SeqConfiguration>() if (!string.IsNullOrEmpty(configuration.GetSection("SeqConfiguration").ToObject<SeqConfiguration>().IngestionEndpoint))
}); builder.RegisterModule(new SeqLoggingModule
{
SeqConfiguration = configuration.GetSection("SeqConfiguration").ToObject<SeqConfiguration>()
});
builder.RegisterModule<SecurityModule>(); builder.RegisterModule<SecurityModule>();
ContainerBuilder = builder; ContainerBuilder = builder;
} }
[TestCleanup] [TestCleanup]
public void CleanUp() public void CleanUp()
{ {
Trace.Flush(); Trace.Flush();
var telemetryClient = Container.Resolve<TelemetryClient>(); if (Container.IsRegistered<TelemetryClient>())
telemetryClient.Flush(); {
var telemetryClient = Container.Resolve<TelemetryClient>();
if (Container is null) return; telemetryClient.Flush();
}
Container.Dispose(); if (Container is null) return;
Container = null;
} Container.Dispose();
} Container = null;
}
}