using System.IO.Abstractions; using System.IO.Abstractions.Extensions; using Autofac; using Autofac.Features.ResolveAnything; using Recyclarr.Common; using Recyclarr.Common.TestLibrary; using Recyclarr.TestLibrary; using Recyclarr.TrashLib; using Recyclarr.TrashLib.ApiServices.System; using Recyclarr.TrashLib.Repo.VersionControl; using Recyclarr.TrashLib.Startup; using Serilog.Events; using Spectre.Console; using Spectre.Console.Testing; namespace Recyclarr.Cli.TestLibrary; [FixtureLifeCycle(LifeCycle.InstancePerTestCase)] public abstract class IntegrationFixture : IDisposable { protected IntegrationFixture() { Paths = new AppPaths(Fs.CurrentDirectory().SubDirectory("test").SubDirectory("recyclarr")); Logger = CreateLogger(); SetupMetadataJson(); _container = new Lazy(() => { var builder = new ContainerBuilder(); CompositionRoot.Setup(builder); builder.RegisterInstance(Fs).As(); builder.RegisterInstance(Paths).As(); builder.RegisterInstance(Console).As(); builder.RegisterInstance(Logger).As(); builder.RegisterMockFor(); builder.RegisterMockFor(); builder.RegisterMockFor(); builder.RegisterMockFor(m => { // By default, choose some extremely high number so that all the newest features are enabled. m.GetVersion(default!).ReturnsForAnyArgs(_ => new Version("99.0.0.0")); }); RegisterExtraTypes(builder); builder.RegisterSource(); return builder.Build(); }); } // ReSharper disable once VirtualMemberNeverOverridden.Global // ReSharper disable once UnusedParameter.Global protected virtual void RegisterExtraTypes(ContainerBuilder builder) { } private static ILogger CreateLogger() { return new LoggerConfiguration() .MinimumLevel.Is(LogEventLevel.Debug) .WriteTo.TestCorrelator() .WriteTo.Console() .CreateLogger(); } private void SetupMetadataJson() { var metadataFile = Paths.RepoDirectory.File("metadata.json"); Fs.AddFileFromEmbeddedResource(metadataFile, typeof(IntegrationFixture), "Data.metadata.json"); } // ReSharper disable MemberCanBePrivate.Global private readonly Lazy _container; protected ILifetimeScope Container => _container.Value; protected MockFileSystem Fs { get; } = new(); protected TestConsole Console { get; } = new(); protected IAppPaths Paths { get; } protected ILogger Logger { get; } // ReSharper restore MemberCanBePrivate.Global protected T Resolve() where T : notnull { return Container.Resolve(); } // ReSharper disable once VirtualMemberNeverOverridden.Global protected virtual void Dispose(bool disposing) { if (!disposing) { return; } if (_container.IsValueCreated) { _container.Value.Dispose(); } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } }