Files
douyin/tests/dy.net.Tests/TestInfrastructure/WebDavTestHost.cs
T

83 lines
3.0 KiB
C#

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<WebDavTestHost> CreateAsync(
IHttpClientFactory factory,
IDisposable disposableFactory,
WebDavTestRequest request,
IReadOnlyList<TimeSpan> uploadVisibilityRetryDelays = null,
IReadOnlyList<TimeSpan> 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<WebDavSettings>();
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();
}
}