using dy.net.model.dto; using dy.net.model.entity; using dy.net.service; using dy.net.storage; using Microsoft.AspNetCore.DataProtection; using SqlSugar; namespace dy.net.Tests.TestInfrastructure; internal sealed class WebDavTestHost : IDisposable { private readonly TemporaryDirectory _temporaryDirectory; private readonly IDisposable _clientFactory; private WebDavTestHost( TemporaryDirectory temporaryDirectory, SqlSugarClient database, IDisposable clientFactory, WebDavSettingsService settingsService, WebDavMediaStorage storage, WebDavSettings settings) { _temporaryDirectory = temporaryDirectory; Database = database; _clientFactory = clientFactory; SettingsService = settingsService; Storage = storage; Settings = settings; } public SqlSugarClient Database { get; } public WebDavSettingsService SettingsService { get; } public WebDavMediaStorage Storage { get; } public WebDavSettings Settings { get; } public static async Task CreateAsync( IHttpClientFactory factory, IDisposable disposableFactory, WebDavTestRequest request, IReadOnlyList uploadVisibilityRetryDelays = null, IReadOnlyList finalVisibilityRetryDelays = null) { var temporaryDirectory = new TemporaryDirectory(); try { var databasePath = Path.Combine(temporaryDirectory.Path, "settings.sqlite"); var database = new SqlSugarClient(new ConnectionConfig { ConnectionString = $"DataSource={databasePath}", DbType = DbType.Sqlite, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true }); database.CodeFirst.InitTables(); var provider = DataProtectionProvider.Create( new DirectoryInfo(Path.Combine(temporaryDirectory.Path, "keys")), builder => builder.SetApplicationName("dysync.net")); var settingsService = new WebDavSettingsService(database, provider); var settings = await settingsService.BuildCandidateAsync(request); await settingsService.SaveAsync(settings, false, "test"); var storage = uploadVisibilityRetryDelays == null || finalVisibilityRetryDelays == null ? new WebDavMediaStorage(factory, settingsService) : new WebDavMediaStorage(factory, settingsService, uploadVisibilityRetryDelays, finalVisibilityRetryDelays); return new WebDavTestHost(temporaryDirectory, database, disposableFactory, settingsService, storage, settings); } catch { disposableFactory.Dispose(); temporaryDirectory.Dispose(); throw; } } public void Dispose() { Database.Dispose(); _clientFactory.Dispose(); _temporaryDirectory.Dispose(); } }