From 3aeae6315be0142b3f2cc3f38d8a169baa1f7748 Mon Sep 17 00:00:00 2001 From: "Janus C. H. Knudsen" Date: Sun, 3 Aug 2025 14:10:49 +0200 Subject: [PATCH] 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 --- Core/Database/SqlOperations.cs | 10 +- Tests/SWP.Core.X.TDD.csproj | 2 +- Tests/TestFixture.cs | 175 +++++++++++++++++---------------- 3 files changed, 96 insertions(+), 91 deletions(-) diff --git a/Core/Database/SqlOperations.cs b/Core/Database/SqlOperations.cs index c0aa6cc..1a1e4d1 100644 --- a/Core/Database/SqlOperations.cs +++ b/Core/Database/SqlOperations.cs @@ -1,4 +1,4 @@ -using System.Data; +using System.Data; using Microsoft.ApplicationInsights; using Microsoft.ApplicationInsights.DataContracts; using SWP.Core.Database.ConnectionFactory; @@ -10,10 +10,10 @@ public class SqlOperations : IDatabaseOperations private readonly IDbConnectionFactory _connectionFactory; private readonly TelemetryClient _telemetryClient; - public SqlOperations(IDbConnectionFactory connectionFactory, TelemetryClient telemetryClient) + public SqlOperations(IDbConnectionFactory connectionFactory, TelemetryClient telemetryClient = null) { - _connectionFactory = connectionFactory; - _telemetryClient = telemetryClient; + _connectionFactory = connectionFactory; + _telemetryClient = telemetryClient ?? new TelemetryClient(); } public DatabaseScope CreateScope(string operationName) @@ -54,4 +54,4 @@ public class SqlOperations : IDatabaseOperations throw; } } -} \ No newline at end of file +} diff --git a/Tests/SWP.Core.X.TDD.csproj b/Tests/SWP.Core.X.TDD.csproj index 5dc2c79..8555fba 100644 --- a/Tests/SWP.Core.X.TDD.csproj +++ b/Tests/SWP.Core.X.TDD.csproj @@ -27,7 +27,7 @@ - Always + Never Always diff --git a/Tests/TestFixture.cs b/Tests/TestFixture.cs index 101f8b7..87e66c0 100644 --- a/Tests/TestFixture.cs +++ b/Tests/TestFixture.cs @@ -1,87 +1,92 @@ -using System.Diagnostics; -using Autofac; -using Microsoft.ApplicationInsights; -using Microsoft.Extensions.Logging; -using SWP.Core.Configurations; -using SWP.Core.Configurations.JsonConfigProvider; -using SWP.Core.Database.ModuleRegistry; -using SWP.Core.ModuleRegistry; -using SWP.Core.SeqLogging; - -namespace SWP.Core.X.TDD; - -/// -/// Act as base class for tests. Avoids duplication of test setup code -/// -[TestClass] -public abstract class TestFixture -{ - private readonly string _configurationFilePath; - - protected TestFixture() : this(null) - { - } - - public TestFixture(string configurationFilePath) - { - if (configurationFilePath is not null) - _configurationFilePath = configurationFilePath?.TrimEnd('/') + "/"; - - CreateContainerBuilder(); - Container = ContainerBuilder.Build(); - } - - protected IContainer Container { get; private set; } - protected ContainerBuilder ContainerBuilder { get; private set; } - - public virtual IConfigurationRoot Configuration() - { - var configuration = new ConfigurationBuilder() - .AddJsonFile($"{_configurationFilePath}appconfiguration.dev.json") - .Build(); - - return configuration; - } - - protected virtual void CreateContainerBuilder() - { - var configuration = Configuration(); - var builder = new ContainerBuilder(); - - builder.RegisterGeneric(typeof(Logger<>)) - .As(typeof(ILogger<>)) - .SingleInstance(); - - - 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() - }); - +using System.Diagnostics; +using Autofac; +using Microsoft.ApplicationInsights; +using Microsoft.Extensions.Logging; +using SWP.Core.Configurations; +using SWP.Core.Configurations.JsonConfigProvider; +using SWP.Core.Database.ModuleRegistry; +using SWP.Core.ModuleRegistry; +using SWP.Core.SeqLogging; + +namespace SWP.Core.X.TDD; + +/// +/// Act as base class for tests. Avoids duplication of test setup code +/// +[TestClass] +public abstract class TestFixture +{ + private readonly string _configurationFilePath; + + protected TestFixture() : this(null) + { + } + + public TestFixture(string configurationFilePath) + { + if (configurationFilePath is not null) + _configurationFilePath = configurationFilePath?.TrimEnd('/') + "/"; + + CreateContainerBuilder(); + Container = ContainerBuilder.Build(); + } + + protected IContainer Container { get; private set; } + protected ContainerBuilder ContainerBuilder { get; private set; } + + public virtual IConfigurationRoot Configuration() + { + var configuration = new ConfigurationBuilder() + .AddJsonFile($"{_configurationFilePath}appconfiguration.dev.json") + .Build(); + + return configuration; + } + + protected virtual void CreateContainerBuilder() + { + var configuration = Configuration(); + var builder = new ContainerBuilder(); + + builder.RegisterGeneric(typeof(Logger<>)) + .As(typeof(ILogger<>)) + .SingleInstance(); + + + builder.RegisterModule(new DbPostgreSqlModule + { + ConnectionString = configuration.GetConnectionString("DefaultConnection") + }); + + if (!string.IsNullOrEmpty(configuration.GetSection("ApplicationInsights").ToObject().ConnectionString)) + builder.RegisterModule(new TelemetryModule + { + TelemetryConfig = configuration.GetSection("ApplicationInsights").ToObject() + }); + + if (!string.IsNullOrEmpty(configuration.GetSection("SeqConfiguration").ToObject().IngestionEndpoint)) + builder.RegisterModule(new SeqLoggingModule + { + SeqConfiguration = configuration.GetSection("SeqConfiguration").ToObject() + }); + builder.RegisterModule(); - ContainerBuilder = builder; - } - - [TestCleanup] - public void CleanUp() - { - Trace.Flush(); - var telemetryClient = Container.Resolve(); - telemetryClient.Flush(); - - if (Container is null) return; - - Container.Dispose(); - Container = null; - } -} \ No newline at end of file + ContainerBuilder = builder; + } + + [TestCleanup] + public void CleanUp() + { + Trace.Flush(); + if (Container.IsRegistered()) + { + var telemetryClient = Container.Resolve(); + telemetryClient.Flush(); + } + if (Container is null) return; + + Container.Dispose(); + Container = null; + } +}