83 lines
3.0 KiB
C#
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();
|
|
}
|
|
}
|