mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-06-23 15:30:34 -04:00
* Added --card-list-item-bg-color for the card list items * Updated the card list item progress to match how cards render * Implemented the ability to configure how many backups are retained. * Fixed a bug where odd jump keys could cause a bad index error for jump bar * Commented out more code for the pagination route if we go with that. * Reverted a move of DisableConcurrentExecution to interface, as it seems to not work there. * Updated manga format utility code to pipes * Fixed bulk selection on series detail page * Fixed bulk selection on all other pages * Changed card item to OnPush * Updated image component to OnPush * Updated Series Card to OnPush * Updated Series Detail to OnPush * Lots of changes here. Integrated parentscroll support on card detail layout. Added jump bar (custom js implementation) on collection, reading list and all series pages. Updated UserParams to default to no pagination. Lots of cleanup all around * Updated some notes on a module use * Some code cleanup * Fixed up a broken test due to the mapper not being configured in the test. * Applied TabID pattern to edit collection tags * Applied css from series detail to collection detail page to remove double scrollbar * Implemented the ability to sort by Time To Read. * Throw an error to the UI when we extract an archive and it contains invalid characters in the filename for the Server OS. * Tweaked how the page scrolls for jumpbar on collection detail. We will have to polish another release * Cleaned up the styling on directory picker * Put some code in but it doesn't work for scroll to top on virtual scrolling. I'll do it later. * Fixed a container bug
554 lines
19 KiB
C#
554 lines
19 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data.Common;
|
|
using System.IO;
|
|
using System.IO.Abstractions.TestingHelpers;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using API.Data;
|
|
using API.DTOs.Settings;
|
|
using API.Entities;
|
|
using API.Entities.Enums;
|
|
using API.Helpers;
|
|
using API.Helpers.Converters;
|
|
using API.Services;
|
|
using API.Services.Tasks;
|
|
using API.SignalR;
|
|
using API.Tests.Helpers;
|
|
using AutoMapper;
|
|
using Microsoft.AspNetCore.SignalR;
|
|
using Microsoft.Data.Sqlite;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.Extensions.Logging;
|
|
using NSubstitute;
|
|
using Xunit;
|
|
|
|
namespace API.Tests.Services;
|
|
|
|
public class CleanupServiceTests
|
|
{
|
|
private readonly ILogger<CleanupService> _logger = Substitute.For<ILogger<CleanupService>>();
|
|
private readonly IUnitOfWork _unitOfWork;
|
|
private readonly IEventHub _messageHub = Substitute.For<IEventHub>();
|
|
|
|
private readonly DbConnection _connection;
|
|
private readonly DataContext _context;
|
|
|
|
private const string CacheDirectory = "C:/kavita/config/cache/";
|
|
private const string CoverImageDirectory = "C:/kavita/config/covers/";
|
|
private const string BackupDirectory = "C:/kavita/config/backups/";
|
|
private const string BookmarkDirectory = "C:/kavita/config/bookmarks/";
|
|
|
|
|
|
public CleanupServiceTests()
|
|
{
|
|
var contextOptions = new DbContextOptionsBuilder()
|
|
.UseSqlite(CreateInMemoryDatabase())
|
|
.Options;
|
|
_connection = RelationalOptionsExtension.Extract(contextOptions).Connection;
|
|
|
|
_context = new DataContext(contextOptions);
|
|
Task.Run(SeedDb).GetAwaiter().GetResult();
|
|
|
|
var config = new MapperConfiguration(cfg => cfg.AddProfile<AutoMapperProfiles>());
|
|
var mapper = config.CreateMapper();
|
|
|
|
_unitOfWork = new UnitOfWork(_context, mapper, null);
|
|
}
|
|
|
|
#region Setup
|
|
|
|
private static DbConnection CreateInMemoryDatabase()
|
|
{
|
|
var connection = new SqliteConnection("Filename=:memory:");
|
|
|
|
connection.Open();
|
|
|
|
return connection;
|
|
}
|
|
|
|
private async Task<bool> SeedDb()
|
|
{
|
|
await _context.Database.MigrateAsync();
|
|
var filesystem = CreateFileSystem();
|
|
|
|
await Seed.SeedSettings(_context, new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem));
|
|
|
|
var setting = await _context.ServerSetting.Where(s => s.Key == ServerSettingKey.CacheDirectory).SingleAsync();
|
|
setting.Value = CacheDirectory;
|
|
|
|
setting = await _context.ServerSetting.Where(s => s.Key == ServerSettingKey.BackupDirectory).SingleAsync();
|
|
setting.Value = BackupDirectory;
|
|
|
|
setting = await _context.ServerSetting.Where(s => s.Key == ServerSettingKey.BookmarkDirectory).SingleAsync();
|
|
setting.Value = BookmarkDirectory;
|
|
|
|
_context.ServerSetting.Update(setting);
|
|
|
|
_context.Library.Add(new Library()
|
|
{
|
|
Name = "Manga",
|
|
Folders = new List<FolderPath>()
|
|
{
|
|
new FolderPath()
|
|
{
|
|
Path = "C:/data/"
|
|
}
|
|
}
|
|
});
|
|
return await _context.SaveChangesAsync() > 0;
|
|
}
|
|
|
|
private async Task ResetDB()
|
|
{
|
|
_context.Series.RemoveRange(_context.Series.ToList());
|
|
_context.Users.RemoveRange(_context.Users.ToList());
|
|
_context.AppUserBookmark.RemoveRange(_context.AppUserBookmark.ToList());
|
|
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
|
|
private static MockFileSystem CreateFileSystem()
|
|
{
|
|
var fileSystem = new MockFileSystem();
|
|
fileSystem.Directory.SetCurrentDirectory("C:/kavita/");
|
|
fileSystem.AddDirectory("C:/kavita/config/");
|
|
fileSystem.AddDirectory(CacheDirectory);
|
|
fileSystem.AddDirectory(CoverImageDirectory);
|
|
fileSystem.AddDirectory(BackupDirectory);
|
|
fileSystem.AddDirectory(BookmarkDirectory);
|
|
fileSystem.AddDirectory("C:/data/");
|
|
|
|
return fileSystem;
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
#region DeleteSeriesCoverImages
|
|
|
|
[Fact]
|
|
public async Task DeleteSeriesCoverImages_ShouldDeleteAll()
|
|
{
|
|
var filesystem = CreateFileSystem();
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetSeriesFormat(1)}.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetSeriesFormat(3)}.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetSeriesFormat(1000)}.jpg", new MockFileData(""));
|
|
|
|
// Delete all Series to reset state
|
|
await ResetDB();
|
|
|
|
var s = DbFactory.Series("Test 1");
|
|
s.CoverImage = $"{ImageService.GetSeriesFormat(1)}.jpg";
|
|
s.LibraryId = 1;
|
|
_context.Series.Add(s);
|
|
s = DbFactory.Series("Test 2");
|
|
s.CoverImage = $"{ImageService.GetSeriesFormat(3)}.jpg";
|
|
s.LibraryId = 1;
|
|
_context.Series.Add(s);
|
|
s = DbFactory.Series("Test 3");
|
|
s.CoverImage = $"{ImageService.GetSeriesFormat(1000)}.jpg";
|
|
s.LibraryId = 1;
|
|
_context.Series.Add(s);
|
|
|
|
var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
ds);
|
|
|
|
await cleanupService.DeleteSeriesCoverImages();
|
|
|
|
Assert.Empty(ds.GetFiles(CoverImageDirectory));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeleteSeriesCoverImages_ShouldNotDeleteLinkedFiles()
|
|
{
|
|
var filesystem = CreateFileSystem();
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetSeriesFormat(1)}.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetSeriesFormat(3)}.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetSeriesFormat(1000)}.jpg", new MockFileData(""));
|
|
|
|
// Delete all Series to reset state
|
|
await ResetDB();
|
|
|
|
// Add 2 series with cover images
|
|
var s = DbFactory.Series("Test 1");
|
|
s.CoverImage = $"{ImageService.GetSeriesFormat(1)}.jpg";
|
|
s.LibraryId = 1;
|
|
_context.Series.Add(s);
|
|
s = DbFactory.Series("Test 2");
|
|
s.CoverImage = $"{ImageService.GetSeriesFormat(3)}.jpg";
|
|
s.LibraryId = 1;
|
|
_context.Series.Add(s);
|
|
|
|
|
|
await _context.SaveChangesAsync();
|
|
var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
ds);
|
|
|
|
await cleanupService.DeleteSeriesCoverImages();
|
|
|
|
Assert.Equal(2, ds.GetFiles(CoverImageDirectory).Count());
|
|
}
|
|
#endregion
|
|
|
|
#region DeleteChapterCoverImages
|
|
[Fact]
|
|
public async Task DeleteChapterCoverImages_ShouldNotDeleteLinkedFiles()
|
|
{
|
|
var filesystem = CreateFileSystem();
|
|
filesystem.AddFile($"{CoverImageDirectory}v01_c01.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}v01_c03.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}v01_c1000.jpg", new MockFileData(""));
|
|
|
|
// Delete all Series to reset state
|
|
await ResetDB();
|
|
|
|
// Add 2 series with cover images
|
|
var s = DbFactory.Series("Test 1");
|
|
var v = DbFactory.Volume("1");
|
|
v.Chapters.Add(new Chapter()
|
|
{
|
|
CoverImage = "v01_c01.jpg"
|
|
});
|
|
v.CoverImage = "v01_c01.jpg";
|
|
s.Volumes.Add(v);
|
|
s.CoverImage = "series_01.jpg";
|
|
s.LibraryId = 1;
|
|
_context.Series.Add(s);
|
|
|
|
s = DbFactory.Series("Test 2");
|
|
v = DbFactory.Volume("1");
|
|
v.Chapters.Add(new Chapter()
|
|
{
|
|
CoverImage = "v01_c03.jpg"
|
|
});
|
|
v.CoverImage = "v01_c03jpg";
|
|
s.Volumes.Add(v);
|
|
s.CoverImage = "series_03.jpg";
|
|
s.LibraryId = 1;
|
|
_context.Series.Add(s);
|
|
|
|
|
|
await _context.SaveChangesAsync();
|
|
var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
ds);
|
|
|
|
await cleanupService.DeleteChapterCoverImages();
|
|
|
|
Assert.Equal(2, ds.GetFiles(CoverImageDirectory).Count());
|
|
}
|
|
#endregion
|
|
|
|
#region DeleteTagCoverImages
|
|
|
|
[Fact]
|
|
public async Task DeleteTagCoverImages_ShouldNotDeleteLinkedFiles()
|
|
{
|
|
var filesystem = CreateFileSystem();
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetCollectionTagFormat(1)}.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetCollectionTagFormat(2)}.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetCollectionTagFormat(1000)}.jpg", new MockFileData(""));
|
|
|
|
// Delete all Series to reset state
|
|
await ResetDB();
|
|
|
|
// Add 2 series with cover images
|
|
var s = DbFactory.Series("Test 1");
|
|
s.Metadata.CollectionTags = new List<CollectionTag>();
|
|
s.Metadata.CollectionTags.Add(new CollectionTag()
|
|
{
|
|
Title = "Something",
|
|
CoverImage = $"{ImageService.GetCollectionTagFormat(1)}.jpg"
|
|
});
|
|
s.CoverImage = $"{ImageService.GetSeriesFormat(1)}.jpg";
|
|
s.LibraryId = 1;
|
|
_context.Series.Add(s);
|
|
|
|
s = DbFactory.Series("Test 2");
|
|
s.Metadata.CollectionTags = new List<CollectionTag>();
|
|
s.Metadata.CollectionTags.Add(new CollectionTag()
|
|
{
|
|
Title = "Something 2",
|
|
CoverImage = $"{ImageService.GetCollectionTagFormat(2)}.jpg"
|
|
});
|
|
s.CoverImage = $"{ImageService.GetSeriesFormat(3)}.jpg";
|
|
s.LibraryId = 1;
|
|
_context.Series.Add(s);
|
|
|
|
|
|
await _context.SaveChangesAsync();
|
|
var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
ds);
|
|
|
|
await cleanupService.DeleteTagCoverImages();
|
|
|
|
Assert.Equal(2, ds.GetFiles(CoverImageDirectory).Count());
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region DeleteReadingListCoverImages
|
|
[Fact]
|
|
public async Task DeleteReadingListCoverImages_ShouldNotDeleteLinkedFiles()
|
|
{
|
|
var filesystem = CreateFileSystem();
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetReadingListFormat(1)}.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetReadingListFormat(2)}.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CoverImageDirectory}{ImageService.GetReadingListFormat(3)}.jpg", new MockFileData(""));
|
|
|
|
// Delete all Series to reset state
|
|
await ResetDB();
|
|
|
|
_context.Users.Add(new AppUser()
|
|
{
|
|
UserName = "Joe",
|
|
ReadingLists = new List<ReadingList>()
|
|
{
|
|
new ReadingList()
|
|
{
|
|
Title = "Something",
|
|
NormalizedTitle = API.Parser.Parser.Normalize("Something"),
|
|
CoverImage = $"{ImageService.GetReadingListFormat(1)}.jpg"
|
|
},
|
|
new ReadingList()
|
|
{
|
|
Title = "Something 2",
|
|
NormalizedTitle = API.Parser.Parser.Normalize("Something 2"),
|
|
CoverImage = $"{ImageService.GetReadingListFormat(2)}.jpg"
|
|
}
|
|
}
|
|
});
|
|
|
|
await _context.SaveChangesAsync();
|
|
var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
ds);
|
|
|
|
await cleanupService.DeleteReadingListCoverImages();
|
|
|
|
Assert.Equal(2, ds.GetFiles(CoverImageDirectory).Count());
|
|
}
|
|
#endregion
|
|
|
|
#region CleanupCacheDirectory
|
|
|
|
[Fact]
|
|
public void CleanupCacheDirectory_ClearAllFiles()
|
|
{
|
|
var filesystem = CreateFileSystem();
|
|
filesystem.AddFile($"{CacheDirectory}01.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CacheDirectory}02.jpg", new MockFileData(""));
|
|
|
|
var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
ds);
|
|
cleanupService.CleanupCacheDirectory();
|
|
Assert.Empty(ds.GetFiles(CacheDirectory, searchOption: SearchOption.AllDirectories));
|
|
}
|
|
|
|
[Fact]
|
|
public void CleanupCacheDirectory_ClearAllFilesInSubDirectory()
|
|
{
|
|
var filesystem = CreateFileSystem();
|
|
filesystem.AddFile($"{CacheDirectory}01.jpg", new MockFileData(""));
|
|
filesystem.AddFile($"{CacheDirectory}subdir/02.jpg", new MockFileData(""));
|
|
|
|
var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
ds);
|
|
cleanupService.CleanupCacheDirectory();
|
|
Assert.Empty(ds.GetFiles(CacheDirectory, searchOption: SearchOption.AllDirectories));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CleanupBackups
|
|
|
|
[Fact]
|
|
public async Task CleanupBackups_LeaveOneFile_SinceAllAreExpired()
|
|
{
|
|
var filesystem = CreateFileSystem();
|
|
var filesystemFile = new MockFileData("")
|
|
{
|
|
CreationTime = DateTimeOffset.Now.Subtract(TimeSpan.FromDays(31))
|
|
};
|
|
filesystem.AddFile($"{BackupDirectory}kavita_backup_11_29_2021_12_00_13 AM.zip", filesystemFile);
|
|
filesystem.AddFile($"{BackupDirectory}kavita_backup_12_3_2021_9_27_58 AM.zip", filesystemFile);
|
|
filesystem.AddFile($"{BackupDirectory}randomfile.zip", filesystemFile);
|
|
|
|
var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
ds);
|
|
await cleanupService.CleanupBackups();
|
|
Assert.Single(ds.GetFiles(BackupDirectory, searchOption: SearchOption.AllDirectories));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task CleanupBackups_LeaveLestExpired()
|
|
{
|
|
var filesystem = CreateFileSystem();
|
|
var filesystemFile = new MockFileData("")
|
|
{
|
|
CreationTime = DateTimeOffset.Now.Subtract(TimeSpan.FromDays(31))
|
|
};
|
|
filesystem.AddFile($"{BackupDirectory}kavita_backup_11_29_2021_12_00_13 AM.zip", filesystemFile);
|
|
filesystem.AddFile($"{BackupDirectory}kavita_backup_12_3_2021_9_27_58 AM.zip", filesystemFile);
|
|
filesystem.AddFile($"{BackupDirectory}randomfile.zip", new MockFileData("")
|
|
{
|
|
CreationTime = DateTimeOffset.Now.Subtract(TimeSpan.FromDays(14))
|
|
});
|
|
|
|
var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
ds);
|
|
await cleanupService.CleanupBackups();
|
|
Assert.True(filesystem.File.Exists($"{BackupDirectory}randomfile.zip"));
|
|
}
|
|
|
|
#endregion
|
|
|
|
// #region CleanupBookmarks
|
|
//
|
|
// [Fact]
|
|
// public async Task CleanupBookmarks_LeaveAllFiles()
|
|
// {
|
|
// var filesystem = CreateFileSystem();
|
|
// filesystem.AddFile($"{BookmarkDirectory}1/1/1/0001.jpg", new MockFileData(""));
|
|
// filesystem.AddFile($"{BookmarkDirectory}1/1/1/0002.jpg", new MockFileData(""));
|
|
//
|
|
// // Delete all Series to reset state
|
|
// await ResetDB();
|
|
//
|
|
// _context.Series.Add(new Series()
|
|
// {
|
|
// Name = "Test",
|
|
// Library = new Library() {
|
|
// Name = "Test LIb",
|
|
// Type = LibraryType.Manga,
|
|
// },
|
|
// Volumes = new List<Volume>()
|
|
// {
|
|
// new Volume()
|
|
// {
|
|
// Chapters = new List<Chapter>()
|
|
// {
|
|
// new Chapter()
|
|
// {
|
|
//
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// });
|
|
//
|
|
// await _context.SaveChangesAsync();
|
|
//
|
|
// _context.AppUser.Add(new AppUser()
|
|
// {
|
|
// Bookmarks = new List<AppUserBookmark>()
|
|
// {
|
|
// new AppUserBookmark()
|
|
// {
|
|
// AppUserId = 1,
|
|
// ChapterId = 1,
|
|
// Page = 1,
|
|
// FileName = "1/1/1/0001.jpg",
|
|
// SeriesId = 1,
|
|
// VolumeId = 1
|
|
// },
|
|
// new AppUserBookmark()
|
|
// {
|
|
// AppUserId = 1,
|
|
// ChapterId = 1,
|
|
// Page = 2,
|
|
// FileName = "1/1/1/0002.jpg",
|
|
// SeriesId = 1,
|
|
// VolumeId = 1
|
|
// }
|
|
// }
|
|
// });
|
|
//
|
|
// await _context.SaveChangesAsync();
|
|
//
|
|
//
|
|
// var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
// var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
// ds);
|
|
//
|
|
// await cleanupService.CleanupBookmarks();
|
|
//
|
|
// Assert.Equal(2, ds.GetFiles(BookmarkDirectory, searchOption:SearchOption.AllDirectories).Count());
|
|
//
|
|
// }
|
|
//
|
|
// [Fact]
|
|
// public async Task CleanupBookmarks_LeavesOneFiles()
|
|
// {
|
|
// var filesystem = CreateFileSystem();
|
|
// filesystem.AddFile($"{BookmarkDirectory}1/1/1/0001.jpg", new MockFileData(""));
|
|
// filesystem.AddFile($"{BookmarkDirectory}1/1/2/0002.jpg", new MockFileData(""));
|
|
//
|
|
// // Delete all Series to reset state
|
|
// await ResetDB();
|
|
//
|
|
// _context.Series.Add(new Series()
|
|
// {
|
|
// Name = "Test",
|
|
// Library = new Library() {
|
|
// Name = "Test LIb",
|
|
// Type = LibraryType.Manga,
|
|
// },
|
|
// Volumes = new List<Volume>()
|
|
// {
|
|
// new Volume()
|
|
// {
|
|
// Chapters = new List<Chapter>()
|
|
// {
|
|
// new Chapter()
|
|
// {
|
|
//
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// });
|
|
//
|
|
// await _context.SaveChangesAsync();
|
|
//
|
|
// _context.AppUser.Add(new AppUser()
|
|
// {
|
|
// Bookmarks = new List<AppUserBookmark>()
|
|
// {
|
|
// new AppUserBookmark()
|
|
// {
|
|
// AppUserId = 1,
|
|
// ChapterId = 1,
|
|
// Page = 1,
|
|
// FileName = "1/1/1/0001.jpg",
|
|
// SeriesId = 1,
|
|
// VolumeId = 1
|
|
// }
|
|
// }
|
|
// });
|
|
//
|
|
// await _context.SaveChangesAsync();
|
|
//
|
|
//
|
|
// var ds = new DirectoryService(Substitute.For<ILogger<DirectoryService>>(), filesystem);
|
|
// var cleanupService = new CleanupService(_logger, _unitOfWork, _messageHub,
|
|
// ds);
|
|
//
|
|
// await cleanupService.CleanupBookmarks();
|
|
//
|
|
// Assert.Equal(1, ds.GetFiles(BookmarkDirectory, searchOption:SearchOption.AllDirectories).Count());
|
|
// Assert.Equal(1, ds.FileSystem.Directory.GetDirectories($"{BookmarkDirectory}1/1/").Length);
|
|
// }
|
|
//
|
|
// #endregion
|
|
}
|