using System; using System.Diagnostics; using Autofac; using Core.ModuleRegistry; using Microsoft.ApplicationInsights; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Tests { /// /// Act as base class for tests. Avoids duplication of test setup code /// [TestClass] public abstract partial class TestFixture { protected IContainer Container { get; private set; } protected ContainerBuilder ContainerBuilder { get; private set; } [AssemblyInitialize] public static void AssemblySetup(TestContext tc) { Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); var envConfiguration = new ConfigurationBuilder() .AddEnvironmentVariables() .Build(); } public virtual IConfigurationRoot Configuration() { IConfigurationBuilder configBuilder = Core.Configurations.AzureConfigurationManager.AppConfigBuilder("appsettings.dev.json"); IConfigurationRoot configuration = configBuilder.Build(); return configuration; } /// /// Should not be overriden. Rather override PreArrangeAll to setup data needed for a test class. /// Override PrebuildContainer with a method that does nothing to prevent early build of IOC container /// [TestInitialize] public void Setup() { CreateContainerBuilder(); Container = ContainerBuilder.Build(); Insight.Database.Providers.PostgreSQL.PostgreSQLInsightDbProvider.RegisterProvider(); } protected virtual void CreateContainerBuilder() { IConfigurationRoot configuration = Configuration(); var builder = new ContainerBuilder(); builder.RegisterInstance(new LoggerFactory()) .As(); builder.RegisterGeneric(typeof(Logger<>)) .As(typeof(ILogger<>)) .SingleInstance(); builder.RegisterModule(new Core.ModuleRegistry.DbPostgreSqlModule { ConnectionString = configuration.GetConnectionString("ptdb") }); builder.RegisterModule(new Core.ModuleRegistry.TelemetryModule { TelemetryConfig = configuration.GetSection("ApplicationInsights").Get() }); ContainerBuilder = builder; } [TestCleanup] public void CleanUp() { Trace.Flush(); var telemetryClient = Container.Resolve(); telemetryClient.Flush(); if (Container != null) { Container.Dispose(); Container = null; } } } }