using Cleanuparr.Infrastructure.Events.Interfaces; using Cleanuparr.Infrastructure.Features.DownloadClient.QBittorrent; using Cleanuparr.Infrastructure.Features.Files; using Cleanuparr.Infrastructure.Features.ItemStriker; using Cleanuparr.Infrastructure.Features.MalwareBlocker; using Cleanuparr.Infrastructure.Http; using Cleanuparr.Infrastructure.Interceptors; using Cleanuparr.Infrastructure.Services.Interfaces; using Cleanuparr.Infrastructure.Tests.Features.DownloadClient.TestHelpers; using Cleanuparr.Persistence.Models.Configuration; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; using Moq; namespace Cleanuparr.Infrastructure.Tests.Features.DownloadClient; public class QBitServiceFixture : IDisposable { public Mock> Logger { get; } public MemoryCache Cache { get; } public Mock FilenameEvaluator { get; } public Mock Striker { get; } public Mock DryRunInterceptor { get; } public Mock HardLinkFileService { get; } public Mock HttpClientProvider { get; } public Mock EventPublisher { get; } public BlocklistProvider BlocklistProvider { get; } public Mock RuleEvaluator { get; } public Mock RuleManager { get; } public Mock ClientWrapper { get; } public QBitServiceFixture() { Logger = new Mock>(); Cache = new MemoryCache(new MemoryCacheOptions()); FilenameEvaluator = new Mock(); Striker = new Mock(); DryRunInterceptor = new Mock(); HardLinkFileService = new Mock(); HttpClientProvider = new Mock(); EventPublisher = new Mock(); BlocklistProvider = TestBlocklistProviderFactory.Create(); RuleEvaluator = new Mock(); RuleManager = new Mock(); ClientWrapper = new Mock(); // Setup default behavior for DryRunInterceptor to execute actions directly DryRunInterceptor .Setup(x => x.InterceptAsync(It.IsAny(), It.IsAny())) .Returns((Delegate action, object[] parameters) => { return (Task)(action.DynamicInvoke(parameters) ?? Task.CompletedTask); }); } public QBitService CreateSut(DownloadClientConfig? config = null) { config ??= new DownloadClientConfig { Id = Guid.NewGuid(), Name = "Test Client", TypeName = Domain.Enums.DownloadClientTypeName.qBittorrent, Type = Domain.Enums.DownloadClientType.Torrent, Enabled = true, Host = new Uri("http://localhost:8080"), Username = "admin", Password = "admin", UrlBase = "" }; // Setup HTTP client provider var httpClient = new HttpClient(); HttpClientProvider .Setup(x => x.CreateClient(It.IsAny())) .Returns(httpClient); return new QBitService( Logger.Object, Cache, FilenameEvaluator.Object, Striker.Object, DryRunInterceptor.Object, HardLinkFileService.Object, HttpClientProvider.Object, EventPublisher.Object, BlocklistProvider, config, RuleEvaluator.Object, RuleManager.Object, ClientWrapper.Object ); } public void ResetMocks() { Logger.Reset(); FilenameEvaluator.Reset(); Striker.Reset(); DryRunInterceptor.Reset(); HardLinkFileService.Reset(); HttpClientProvider.Reset(); EventPublisher.Reset(); RuleEvaluator.Reset(); RuleManager.Reset(); ClientWrapper.Reset(); // Re-setup default DryRunInterceptor behavior DryRunInterceptor .Setup(x => x.InterceptAsync(It.IsAny(), It.IsAny())) .Returns((Delegate action, object[] parameters) => { return (Task)(action.DynamicInvoke(parameters) ?? Task.CompletedTask); }); } public void Dispose() { Cache.Dispose(); GC.SuppressFinalize(this); } }