-
-
Notifications
You must be signed in to change notification settings - Fork 368
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Added Last Folder Scanned time to series info modal. Tweaked the info event detail modal to have a primary and thus be auto-dismissable * Added an error event when multiple series are found in processing a series. * Fixed a bug where a series could get stuck with other series due to a bad select query. Started adding the force flag hook for the UI and designing the confirm. Confirm service now also has ability to hide the close button. Updated error events and logging in the loop, to be more informative * Fixed a bug where confirm service wasn't showing the proper body content. * Hooked up force scan series * refresh metadata now has force update * Fixed up the messaging with the prompt on scan, hooked it up properly in the scan library to avoid the check if the whole library needs to even be scanned. Fixed a bug where NormalizedLocalizedName wasn't being calculated on new entities. Started adding unit tests for this problematic repo method. * Fixed a bug where we updated NormalizedLocalizedName before we set it. * Send an info to the UI when series are spread between multiple library level folders. * Added some logger output when there are no files found in a folder. Return early if there are no files found, so we can avoid some small loops of code. * Fixed an issue where multiple series in a folder with localized series would cause unintended grouping. This is not supported and hence we will warn them and allow the bad grouping. * Added a case where scan series fails due to the folder being removed. We will now log an error * Normalize paths when finding the highest directory till root. * Fixed an issue with Scan Series where changing a series' folder to a different path but the original series folder existed with another series in it, would cause the series to not be deleted. * Fixed some bugs around specials causing a series merge issue on scan series. * Removed a bug marker * Cleaned up some of the scan loop and removed a test I don't need. * Remove any prompts for force flow, it doesn't work well. Leave the API as is though. * Fixed up a check for duplicate ScanLibrary calls
- Loading branch information
1 parent
354be09
commit 1c9544f
Showing
27 changed files
with
367 additions
and
222 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
using System.Collections.Generic; | ||
using System.Data.Common; | ||
using System.IO.Abstractions.TestingHelpers; | ||
using System.Linq; | ||
using System.Threading.Tasks; | ||
using API.Data; | ||
using API.Entities; | ||
using API.Entities.Enums; | ||
using API.Helpers; | ||
using API.Services; | ||
using AutoMapper; | ||
using Microsoft.Data.Sqlite; | ||
using Microsoft.EntityFrameworkCore; | ||
using Microsoft.EntityFrameworkCore.Infrastructure; | ||
using Microsoft.Extensions.Logging; | ||
using NSubstitute; | ||
using Xunit; | ||
|
||
namespace API.Tests.Repository; | ||
|
||
public class SeriesRepositoryTests | ||
{ | ||
private readonly IUnitOfWork _unitOfWork; | ||
|
||
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 DataDirectory = "C:/data/"; | ||
|
||
public SeriesRepositoryTests() | ||
{ | ||
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; | ||
|
||
_context.ServerSetting.Update(setting); | ||
|
||
var lib = new Library() | ||
{ | ||
Name = "Manga", Folders = new List<FolderPath>() {new FolderPath() {Path = "C:/data/"}} | ||
}; | ||
|
||
_context.AppUser.Add(new AppUser() | ||
{ | ||
UserName = "majora2007", | ||
Libraries = new List<Library>() | ||
{ | ||
lib | ||
} | ||
}); | ||
|
||
return await _context.SaveChangesAsync() > 0; | ||
} | ||
|
||
private async Task ResetDb() | ||
{ | ||
_context.Series.RemoveRange(_context.Series.ToList()); | ||
_context.AppUserRating.RemoveRange(_context.AppUserRating.ToList()); | ||
_context.Genre.RemoveRange(_context.Genre.ToList()); | ||
_context.CollectionTag.RemoveRange(_context.CollectionTag.ToList()); | ||
_context.Person.RemoveRange(_context.Person.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(DataDirectory); | ||
|
||
return fileSystem; | ||
} | ||
|
||
#endregion | ||
|
||
private async Task SetupSeriesData() | ||
{ | ||
var library = new Library() | ||
{ | ||
Name = "Manga", | ||
Type = LibraryType.Manga, | ||
Folders = new List<FolderPath>() | ||
{ | ||
new FolderPath() {Path = "C:/data/manga/"} | ||
} | ||
}; | ||
|
||
library.Series = new List<Series>() | ||
{ | ||
DbFactory.Series("The Idaten Deities Know Only Peace", "Heion Sedai no Idaten-tachi"), | ||
}; | ||
|
||
_unitOfWork.LibraryRepository.Add(library); | ||
await _unitOfWork.CommitAsync(); | ||
} | ||
|
||
|
||
[InlineData("Heion Sedai no Idaten-tachi", "", "The Idaten Deities Know Only Peace")] // Matching on localized name in DB | ||
public async Task GetFullSeriesByAnyName_Should(string seriesName, string localizedName, string? expected) | ||
{ | ||
var firstSeries = await _unitOfWork.SeriesRepository.GetSeriesByIdAsync(1); | ||
var series = | ||
await _unitOfWork.SeriesRepository.GetFullSeriesByAnyName(seriesName, localizedName, | ||
1); | ||
if (expected == null) | ||
{ | ||
Assert.Null(series); | ||
} | ||
else | ||
{ | ||
Assert.NotNull(series); | ||
Assert.Equal(expected, series.Name); | ||
} | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.