Collection Rework (#2830)
This commit is contained in:
parent
0dacc061f1
commit
deaaccb96a
93 changed files with 5413 additions and 1120 deletions
|
@ -10,6 +10,7 @@ using API.Helpers;
|
|||
using API.Helpers.Builders;
|
||||
using API.Services;
|
||||
using AutoMapper;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.Data.Sqlite;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
|
@ -47,6 +48,7 @@ public abstract class AbstractDbTest
|
|||
var config = new MapperConfiguration(cfg => cfg.AddProfile<AutoMapperProfiles>());
|
||||
var mapper = config.CreateMapper();
|
||||
|
||||
|
||||
_unitOfWork = new UnitOfWork(_context, mapper, null);
|
||||
}
|
||||
|
||||
|
|
|
@ -74,10 +74,10 @@ public class EnumerableExtensionsTests
|
|||
new[] {@"F:\/Anime_Series_Pelis/MANGA/Mangahere (EN)\Kirara Fantasia\_Ch.001\001.jpg", @"F:\/Anime_Series_Pelis/MANGA/Mangahere (EN)\Kirara Fantasia\_Ch.001\002.jpg"},
|
||||
new[] {@"F:\/Anime_Series_Pelis/MANGA/Mangahere (EN)\Kirara Fantasia\_Ch.001\001.jpg", @"F:\/Anime_Series_Pelis/MANGA/Mangahere (EN)\Kirara Fantasia\_Ch.001\002.jpg"}
|
||||
)]
|
||||
[InlineData(
|
||||
new[] {"01/001.jpg", "001.jpg"},
|
||||
new[] {"001.jpg", "01/001.jpg"}
|
||||
)]
|
||||
[InlineData(
|
||||
new[] {"01/001.jpg", "001.jpg"},
|
||||
new[] {"001.jpg", "01/001.jpg"}
|
||||
)]
|
||||
public void TestNaturalSort(string[] input, string[] expected)
|
||||
{
|
||||
Assert.Equal(expected, input.OrderByNatural(x => x).ToArray());
|
||||
|
|
|
@ -45,17 +45,17 @@ public class QueryableExtensionsTests
|
|||
[InlineData(false, 1)]
|
||||
public void RestrictAgainstAgeRestriction_CollectionTag_ShouldRestrictEverythingAboveTeen(bool includeUnknowns, int expectedCount)
|
||||
{
|
||||
var items = new List<CollectionTag>()
|
||||
var items = new List<AppUserCollection>()
|
||||
{
|
||||
new CollectionTagBuilder("Test")
|
||||
.WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build())
|
||||
new AppUserCollectionBuilder("Test")
|
||||
.WithItem(new SeriesBuilder("S1").WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build()).Build())
|
||||
.Build(),
|
||||
new CollectionTagBuilder("Test 2")
|
||||
.WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Unknown).Build())
|
||||
.WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build())
|
||||
new AppUserCollectionBuilder("Test 2")
|
||||
.WithItem(new SeriesBuilder("S2").WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Unknown).Build()).Build())
|
||||
.WithItem(new SeriesBuilder("S1").WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build()).Build())
|
||||
.Build(),
|
||||
new CollectionTagBuilder("Test 3")
|
||||
.WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.X18Plus).Build())
|
||||
new AppUserCollectionBuilder("Test 3")
|
||||
.WithItem(new SeriesBuilder("S3").WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.X18Plus).Build()).Build())
|
||||
.Build(),
|
||||
};
|
||||
|
||||
|
|
|
@ -114,65 +114,65 @@ public class CollectionTagRepositoryTests
|
|||
|
||||
#endregion
|
||||
|
||||
#region RemoveTagsWithoutSeries
|
||||
|
||||
[Fact]
|
||||
public async Task RemoveTagsWithoutSeries_ShouldRemoveTags()
|
||||
{
|
||||
var library = new LibraryBuilder("Test", LibraryType.Manga).Build();
|
||||
var series = new SeriesBuilder("Test 1").Build();
|
||||
var commonTag = new CollectionTagBuilder("Tag 1").Build();
|
||||
series.Metadata.CollectionTags.Add(commonTag);
|
||||
series.Metadata.CollectionTags.Add(new CollectionTagBuilder("Tag 2").Build());
|
||||
|
||||
var series2 = new SeriesBuilder("Test 1").Build();
|
||||
series2.Metadata.CollectionTags.Add(commonTag);
|
||||
library.Series.Add(series);
|
||||
library.Series.Add(series2);
|
||||
_unitOfWork.LibraryRepository.Add(library);
|
||||
await _unitOfWork.CommitAsync();
|
||||
|
||||
Assert.Equal(2, series.Metadata.CollectionTags.Count);
|
||||
Assert.Single(series2.Metadata.CollectionTags);
|
||||
|
||||
// Delete both series
|
||||
_unitOfWork.SeriesRepository.Remove(series);
|
||||
_unitOfWork.SeriesRepository.Remove(series2);
|
||||
|
||||
await _unitOfWork.CommitAsync();
|
||||
|
||||
// Validate that both tags exist
|
||||
Assert.Equal(2, (await _unitOfWork.CollectionTagRepository.GetAllTagsAsync()).Count());
|
||||
|
||||
await _unitOfWork.CollectionTagRepository.RemoveTagsWithoutSeries();
|
||||
|
||||
Assert.Empty(await _unitOfWork.CollectionTagRepository.GetAllTagsAsync());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task RemoveTagsWithoutSeries_ShouldNotRemoveTags()
|
||||
{
|
||||
var library = new LibraryBuilder("Test", LibraryType.Manga).Build();
|
||||
var series = new SeriesBuilder("Test 1").Build();
|
||||
var commonTag = new CollectionTagBuilder("Tag 1").Build();
|
||||
series.Metadata.CollectionTags.Add(commonTag);
|
||||
series.Metadata.CollectionTags.Add(new CollectionTagBuilder("Tag 2").Build());
|
||||
|
||||
var series2 = new SeriesBuilder("Test 1").Build();
|
||||
series2.Metadata.CollectionTags.Add(commonTag);
|
||||
library.Series.Add(series);
|
||||
library.Series.Add(series2);
|
||||
_unitOfWork.LibraryRepository.Add(library);
|
||||
await _unitOfWork.CommitAsync();
|
||||
|
||||
Assert.Equal(2, series.Metadata.CollectionTags.Count);
|
||||
Assert.Single(series2.Metadata.CollectionTags);
|
||||
|
||||
await _unitOfWork.CollectionTagRepository.RemoveTagsWithoutSeries();
|
||||
|
||||
// Validate that both tags exist
|
||||
Assert.Equal(2, (await _unitOfWork.CollectionTagRepository.GetAllTagsAsync()).Count());
|
||||
}
|
||||
|
||||
#endregion
|
||||
// #region RemoveTagsWithoutSeries
|
||||
//
|
||||
// [Fact]
|
||||
// public async Task RemoveTagsWithoutSeries_ShouldRemoveTags()
|
||||
// {
|
||||
// var library = new LibraryBuilder("Test", LibraryType.Manga).Build();
|
||||
// var series = new SeriesBuilder("Test 1").Build();
|
||||
// var commonTag = new AppUserCollectionBuilder("Tag 1").Build();
|
||||
// series.Metadata.CollectionTags.Add(commonTag);
|
||||
// series.Metadata.CollectionTags.Add(new AppUserCollectionBuilder("Tag 2").Build());
|
||||
//
|
||||
// var series2 = new SeriesBuilder("Test 1").Build();
|
||||
// series2.Metadata.CollectionTags.Add(commonTag);
|
||||
// library.Series.Add(series);
|
||||
// library.Series.Add(series2);
|
||||
// _unitOfWork.LibraryRepository.Add(library);
|
||||
// await _unitOfWork.CommitAsync();
|
||||
//
|
||||
// Assert.Equal(2, series.Metadata.CollectionTags.Count);
|
||||
// Assert.Single(series2.Metadata.CollectionTags);
|
||||
//
|
||||
// // Delete both series
|
||||
// _unitOfWork.SeriesRepository.Remove(series);
|
||||
// _unitOfWork.SeriesRepository.Remove(series2);
|
||||
//
|
||||
// await _unitOfWork.CommitAsync();
|
||||
//
|
||||
// // Validate that both tags exist
|
||||
// Assert.Equal(2, (await _unitOfWork.CollectionTagRepository.GetAllTagsAsync()).Count());
|
||||
//
|
||||
// await _unitOfWork.CollectionTagRepository.RemoveTagsWithoutSeries();
|
||||
//
|
||||
// Assert.Empty(await _unitOfWork.CollectionTagRepository.GetAllTagsAsync());
|
||||
// }
|
||||
//
|
||||
// [Fact]
|
||||
// public async Task RemoveTagsWithoutSeries_ShouldNotRemoveTags()
|
||||
// {
|
||||
// var library = new LibraryBuilder("Test", LibraryType.Manga).Build();
|
||||
// var series = new SeriesBuilder("Test 1").Build();
|
||||
// var commonTag = new AppUserCollectionBuilder("Tag 1").Build();
|
||||
// series.Metadata.CollectionTags.Add(commonTag);
|
||||
// series.Metadata.CollectionTags.Add(new AppUserCollectionBuilder("Tag 2").Build());
|
||||
//
|
||||
// var series2 = new SeriesBuilder("Test 1").Build();
|
||||
// series2.Metadata.CollectionTags.Add(commonTag);
|
||||
// library.Series.Add(series);
|
||||
// library.Series.Add(series2);
|
||||
// _unitOfWork.LibraryRepository.Add(library);
|
||||
// await _unitOfWork.CommitAsync();
|
||||
//
|
||||
// Assert.Equal(2, series.Metadata.CollectionTags.Count);
|
||||
// Assert.Single(series2.Metadata.CollectionTags);
|
||||
//
|
||||
// await _unitOfWork.CollectionTagRepository.RemoveTagsWithoutSeries();
|
||||
//
|
||||
// // Validate that both tags exist
|
||||
// Assert.Equal(2, (await _unitOfWork.CollectionTagRepository.GetAllTagsAsync()).Count());
|
||||
// }
|
||||
//
|
||||
// #endregion
|
||||
}
|
||||
|
|
|
@ -167,53 +167,53 @@ public class CleanupServiceTests : AbstractDbTest
|
|||
}
|
||||
#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
|
||||
|
||||
_context.Series.Add(new SeriesBuilder("Test 1")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithCollectionTag(new CollectionTagBuilder("Something")
|
||||
.WithCoverImage($"{ImageService.GetCollectionTagFormat(1)}.jpg")
|
||||
.Build())
|
||||
.Build())
|
||||
.WithCoverImage($"{ImageService.GetSeriesFormat(1)}.jpg")
|
||||
.WithLibraryId(1)
|
||||
.Build());
|
||||
|
||||
_context.Series.Add(new SeriesBuilder("Test 2")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithCollectionTag(new CollectionTagBuilder("Something")
|
||||
.WithCoverImage($"{ImageService.GetCollectionTagFormat(2)}.jpg")
|
||||
.Build())
|
||||
.Build())
|
||||
.WithCoverImage($"{ImageService.GetSeriesFormat(3)}.jpg")
|
||||
.WithLibraryId(1)
|
||||
.Build());
|
||||
|
||||
|
||||
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 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
|
||||
//
|
||||
// _context.Series.Add(new SeriesBuilder("Test 1")
|
||||
// .WithMetadata(new SeriesMetadataBuilder()
|
||||
// .WithCollectionTag(new AppUserCollectionBuilder("Something")
|
||||
// .WithCoverImage($"{ImageService.GetCollectionTagFormat(1)}.jpg")
|
||||
// .Build())
|
||||
// .Build())
|
||||
// .WithCoverImage($"{ImageService.GetSeriesFormat(1)}.jpg")
|
||||
// .WithLibraryId(1)
|
||||
// .Build());
|
||||
//
|
||||
// _context.Series.Add(new SeriesBuilder("Test 2")
|
||||
// .WithMetadata(new SeriesMetadataBuilder()
|
||||
// .WithCollectionTag(new AppUserCollectionBuilder("Something")
|
||||
// .WithCoverImage($"{ImageService.GetCollectionTagFormat(2)}.jpg")
|
||||
// .Build())
|
||||
// .Build())
|
||||
// .WithCoverImage($"{ImageService.GetSeriesFormat(3)}.jpg")
|
||||
// .WithLibraryId(1)
|
||||
// .Build());
|
||||
//
|
||||
//
|
||||
// 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]
|
||||
|
@ -435,24 +435,26 @@ public class CleanupServiceTests : AbstractDbTest
|
|||
[Fact]
|
||||
public async Task CleanupDbEntries_RemoveTagsWithoutSeries()
|
||||
{
|
||||
var c = new CollectionTag()
|
||||
var s = new SeriesBuilder("Test")
|
||||
.WithFormat(MangaFormat.Epub)
|
||||
.WithMetadata(new SeriesMetadataBuilder().Build())
|
||||
.Build();
|
||||
s.Library = new LibraryBuilder("Test LIb").Build();
|
||||
_context.Series.Add(s);
|
||||
|
||||
var c = new AppUserCollection()
|
||||
{
|
||||
Title = "Test Tag",
|
||||
NormalizedTitle = "Test Tag".ToNormalized(),
|
||||
AgeRating = AgeRating.Unknown,
|
||||
Items = new List<Series>() {s}
|
||||
};
|
||||
var s = new SeriesBuilder("Test")
|
||||
.WithFormat(MangaFormat.Epub)
|
||||
.WithMetadata(new SeriesMetadataBuilder().WithCollectionTag(c).Build())
|
||||
.Build();
|
||||
s.Library = new LibraryBuilder("Test LIb").Build();
|
||||
|
||||
_context.Series.Add(s);
|
||||
|
||||
_context.AppUser.Add(new AppUser()
|
||||
{
|
||||
UserName = "majora2007"
|
||||
UserName = "majora2007",
|
||||
Collections = new List<AppUserCollection>() {c}
|
||||
});
|
||||
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var cleanupService = new CleanupService(Substitute.For<ILogger<CleanupService>>(), _unitOfWork,
|
||||
|
@ -465,7 +467,7 @@ public class CleanupServiceTests : AbstractDbTest
|
|||
|
||||
await cleanupService.CleanupDbEntries();
|
||||
|
||||
Assert.Empty(await _unitOfWork.CollectionTagRepository.GetAllTagsAsync());
|
||||
Assert.Empty(await _unitOfWork.CollectionTagRepository.GetAllCollectionsAsync());
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
@ -3,13 +3,13 @@ using System.Linq;
|
|||
using System.Threading.Tasks;
|
||||
using API.Data;
|
||||
using API.Data.Repositories;
|
||||
using API.DTOs.CollectionTags;
|
||||
using API.DTOs.Collection;
|
||||
using API.Entities;
|
||||
using API.Entities.Enums;
|
||||
using API.Helpers.Builders;
|
||||
using API.Services;
|
||||
using API.Services.Plus;
|
||||
using API.SignalR;
|
||||
using API.Tests.Helpers;
|
||||
using NSubstitute;
|
||||
using Xunit;
|
||||
|
||||
|
@ -25,7 +25,7 @@ public class CollectionTagServiceTests : AbstractDbTest
|
|||
|
||||
protected override async Task ResetDb()
|
||||
{
|
||||
_context.CollectionTag.RemoveRange(_context.CollectionTag.ToList());
|
||||
_context.AppUserCollection.RemoveRange(_context.AppUserCollection.ToList());
|
||||
_context.Library.RemoveRange(_context.Library.ToList());
|
||||
|
||||
await _unitOfWork.CommitAsync();
|
||||
|
@ -33,119 +33,148 @@ public class CollectionTagServiceTests : AbstractDbTest
|
|||
|
||||
private async Task SeedSeries()
|
||||
{
|
||||
if (_context.CollectionTag.Any()) return;
|
||||
if (_context.AppUserCollection.Any()) return;
|
||||
|
||||
var s1 = new SeriesBuilder("Series 1").WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Mature).Build()).Build();
|
||||
var s2 = new SeriesBuilder("Series 2").WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.G).Build()).Build();
|
||||
_context.Library.Add(new LibraryBuilder("Library 2", LibraryType.Manga)
|
||||
.WithSeries(new SeriesBuilder("Series 1").Build())
|
||||
.WithSeries(new SeriesBuilder("Series 2").Build())
|
||||
.WithSeries(s1)
|
||||
.WithSeries(s2)
|
||||
.Build());
|
||||
|
||||
_context.CollectionTag.Add(new CollectionTagBuilder("Tag 1").Build());
|
||||
_context.CollectionTag.Add(new CollectionTagBuilder("Tag 2").WithIsPromoted(true).Build());
|
||||
var user = new AppUserBuilder("majora2007", "majora2007", Seed.DefaultThemes.First()).Build();
|
||||
user.Collections = new List<AppUserCollection>()
|
||||
{
|
||||
new AppUserCollectionBuilder("Tag 1").WithItems(new []{s1}).Build(),
|
||||
new AppUserCollectionBuilder("Tag 2").WithItems(new []{s1, s2}).WithIsPromoted(true).Build()
|
||||
};
|
||||
_unitOfWork.UserRepository.Add(user);
|
||||
|
||||
await _unitOfWork.CommitAsync();
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public async Task TagExistsByName_ShouldFindTag()
|
||||
{
|
||||
await SeedSeries();
|
||||
Assert.True(await _service.TagExistsByName("Tag 1"));
|
||||
Assert.True(await _service.TagExistsByName("tag 1"));
|
||||
Assert.False(await _service.TagExistsByName("tag5"));
|
||||
}
|
||||
#region UpdateTag
|
||||
|
||||
[Fact]
|
||||
public async Task UpdateTag_ShouldUpdateFields()
|
||||
{
|
||||
await SeedSeries();
|
||||
|
||||
_context.CollectionTag.Add(new CollectionTagBuilder("UpdateTag_ShouldUpdateFields").WithId(3).WithIsPromoted(true).Build());
|
||||
var user = await _unitOfWork.UserRepository.GetUserByIdAsync(1, AppUserIncludes.Collections);
|
||||
Assert.NotNull(user);
|
||||
|
||||
user.Collections.Add(new AppUserCollectionBuilder("UpdateTag_ShouldUpdateFields").WithIsPromoted(true).Build());
|
||||
_unitOfWork.UserRepository.Update(user);
|
||||
await _unitOfWork.CommitAsync();
|
||||
|
||||
await _service.UpdateTag(new CollectionTagDto()
|
||||
await _service.UpdateTag(new AppUserCollectionDto()
|
||||
{
|
||||
Title = "UpdateTag_ShouldUpdateFields",
|
||||
Id = 3,
|
||||
Promoted = true,
|
||||
Summary = "Test Summary",
|
||||
});
|
||||
AgeRating = AgeRating.Unknown
|
||||
}, 1);
|
||||
|
||||
var tag = await _unitOfWork.CollectionTagRepository.GetTagAsync(3);
|
||||
var tag = await _unitOfWork.CollectionTagRepository.GetCollectionAsync(3);
|
||||
Assert.NotNull(tag);
|
||||
Assert.True(tag.Promoted);
|
||||
Assert.True(!string.IsNullOrEmpty(tag.Summary));
|
||||
Assert.False(string.IsNullOrEmpty(tag.Summary));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// UpdateTag should not change any title if non-Kavita source
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task AddTagToSeries_ShouldAddTagToAllSeries()
|
||||
public async Task UpdateTag_ShouldNotChangeTitle_WhenNotKavitaSource()
|
||||
{
|
||||
await SeedSeries();
|
||||
var ids = new[] {1, 2};
|
||||
await _service.AddTagToSeries(await _unitOfWork.CollectionTagRepository.GetTagAsync(1, CollectionTagIncludes.SeriesMetadata), ids);
|
||||
|
||||
var metadatas = await _unitOfWork.SeriesRepository.GetSeriesMetadataForIdsAsync(ids);
|
||||
Assert.Contains(metadatas.ElementAt(0).CollectionTags, t => t.Title.Equals("Tag 1"));
|
||||
Assert.Contains(metadatas.ElementAt(1).CollectionTags, t => t.Title.Equals("Tag 1"));
|
||||
var user = await _unitOfWork.UserRepository.GetUserByIdAsync(1, AppUserIncludes.Collections);
|
||||
Assert.NotNull(user);
|
||||
|
||||
user.Collections.Add(new AppUserCollectionBuilder("UpdateTag_ShouldNotChangeTitle_WhenNotKavitaSource").WithSource(ScrobbleProvider.Mal).Build());
|
||||
_unitOfWork.UserRepository.Update(user);
|
||||
await _unitOfWork.CommitAsync();
|
||||
|
||||
await _service.UpdateTag(new AppUserCollectionDto()
|
||||
{
|
||||
Title = "New Title",
|
||||
Id = 3,
|
||||
Promoted = true,
|
||||
Summary = "Test Summary",
|
||||
AgeRating = AgeRating.Unknown
|
||||
}, 1);
|
||||
|
||||
var tag = await _unitOfWork.CollectionTagRepository.GetCollectionAsync(3);
|
||||
Assert.NotNull(tag);
|
||||
Assert.Equal("UpdateTag_ShouldNotChangeTitle_WhenNotKavitaSource", tag.Title);
|
||||
Assert.False(string.IsNullOrEmpty(tag.Summary));
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region RemoveTagFromSeries
|
||||
|
||||
[Fact]
|
||||
public async Task RemoveTagFromSeries_RemoveSeriesFromTag()
|
||||
{
|
||||
await SeedSeries();
|
||||
|
||||
var user = await _unitOfWork.UserRepository.GetUserByIdAsync(1, AppUserIncludes.Collections);
|
||||
Assert.NotNull(user);
|
||||
|
||||
// Tag 2 has 2 series
|
||||
var tag = await _unitOfWork.CollectionTagRepository.GetCollectionAsync(2);
|
||||
Assert.NotNull(tag);
|
||||
|
||||
await _service.RemoveTagFromSeries(tag, new[] {1});
|
||||
var userCollections = await _unitOfWork.UserRepository.GetUserByIdAsync(1, AppUserIncludes.Collections);
|
||||
Assert.Equal(2, userCollections!.Collections.Count);
|
||||
Assert.Equal(1, tag.Items.Count);
|
||||
Assert.Equal(2, tag.Items.First().Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ensure the rating of the tag updates after a series change
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task RemoveTagFromSeries_ShouldRemoveMultiple()
|
||||
public async Task RemoveTagFromSeries_RemoveSeriesFromTag_UpdatesRating()
|
||||
{
|
||||
await SeedSeries();
|
||||
var ids = new[] {1, 2};
|
||||
var tag = await _unitOfWork.CollectionTagRepository.GetTagAsync(2, CollectionTagIncludes.SeriesMetadata);
|
||||
await _service.AddTagToSeries(tag, ids);
|
||||
|
||||
var user = await _unitOfWork.UserRepository.GetUserByIdAsync(1, AppUserIncludes.Collections);
|
||||
Assert.NotNull(user);
|
||||
|
||||
// Tag 2 has 2 series
|
||||
var tag = await _unitOfWork.CollectionTagRepository.GetCollectionAsync(2);
|
||||
Assert.NotNull(tag);
|
||||
|
||||
await _service.RemoveTagFromSeries(tag, new[] {1});
|
||||
|
||||
var metadatas = await _unitOfWork.SeriesRepository.GetSeriesMetadataForIdsAsync(new[] {1});
|
||||
|
||||
Assert.Single(metadatas);
|
||||
Assert.Empty(metadatas.First().CollectionTags);
|
||||
Assert.NotEmpty(await _unitOfWork.SeriesRepository.GetSeriesMetadataForIdsAsync(new[] {2}));
|
||||
Assert.Equal(AgeRating.G, tag.AgeRating);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Should remove the tag when there are no items left on the tag
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task GetTagOrCreate_ShouldReturnNewTag()
|
||||
public async Task RemoveTagFromSeries_RemoveSeriesFromTag_DeleteTagWhenNoSeriesLeft()
|
||||
{
|
||||
await SeedSeries();
|
||||
var tag = await _service.GetTagOrCreate(0, "GetTagOrCreate_ShouldReturnNewTag");
|
||||
|
||||
var user = await _unitOfWork.UserRepository.GetUserByIdAsync(1, AppUserIncludes.Collections);
|
||||
Assert.NotNull(user);
|
||||
|
||||
// Tag 1 has 1 series
|
||||
var tag = await _unitOfWork.CollectionTagRepository.GetCollectionAsync(1);
|
||||
Assert.NotNull(tag);
|
||||
Assert.Equal(0, tag.Id);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetTagOrCreate_ShouldReturnExistingTag()
|
||||
{
|
||||
await SeedSeries();
|
||||
var tag = await _service.GetTagOrCreate(1, "Some new tag");
|
||||
Assert.NotNull(tag);
|
||||
Assert.Equal(1, tag.Id);
|
||||
Assert.Equal("Tag 1", tag.Title);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task RemoveTagsWithoutSeries_ShouldRemoveAbandonedEntries()
|
||||
{
|
||||
await SeedSeries();
|
||||
// Setup a tag with one series
|
||||
var tag = await _service.GetTagOrCreate(0, "Tag with a series");
|
||||
await _unitOfWork.CommitAsync();
|
||||
|
||||
var metadatas = await _unitOfWork.SeriesRepository.GetSeriesMetadataForIdsAsync(new[] {1});
|
||||
tag.SeriesMetadatas.Add(metadatas.First());
|
||||
var tagId = tag.Id;
|
||||
await _unitOfWork.CommitAsync();
|
||||
|
||||
// Validate it doesn't remove tags it shouldn't
|
||||
await _service.RemoveTagsWithoutSeries();
|
||||
Assert.NotNull(await _unitOfWork.CollectionTagRepository.GetTagAsync(tagId));
|
||||
|
||||
await _service.RemoveTagFromSeries(tag, new[] {1});
|
||||
|
||||
// Validate it does remove tags it should
|
||||
await _service.RemoveTagsWithoutSeries();
|
||||
Assert.Null(await _unitOfWork.CollectionTagRepository.GetTagAsync(tagId));
|
||||
var tag2 = await _unitOfWork.CollectionTagRepository.GetCollectionAsync(1);
|
||||
Assert.Null(tag2);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
|
|
@ -768,7 +768,7 @@ public class SeriesServiceTests : AbstractDbTest
|
|||
SeriesId = 1,
|
||||
Genres = new List<GenreTagDto> {new GenreTagDto {Id = 0, Title = "New Genre"}}
|
||||
},
|
||||
CollectionTags = new List<CollectionTagDto>()
|
||||
|
||||
});
|
||||
|
||||
Assert.True(success);
|
||||
|
@ -777,46 +777,6 @@ public class SeriesServiceTests : AbstractDbTest
|
|||
Assert.NotNull(series);
|
||||
Assert.NotNull(series.Metadata);
|
||||
Assert.Contains("New Genre".SentenceCase(), series.Metadata.Genres.Select(g => g.Title));
|
||||
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task UpdateSeriesMetadata_ShouldCreateNewTags_IfNoneExist()
|
||||
{
|
||||
await ResetDb();
|
||||
var s = new SeriesBuilder("Test")
|
||||
.Build();
|
||||
s.Library = new LibraryBuilder("Test LIb", LibraryType.Book).Build();
|
||||
|
||||
_context.Series.Add(s);
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var success = await _seriesService.UpdateSeriesMetadata(new UpdateSeriesMetadataDto
|
||||
{
|
||||
SeriesMetadata = new SeriesMetadataDto
|
||||
{
|
||||
SeriesId = 1,
|
||||
Genres = new List<GenreTagDto> {new GenreTagDto {Id = 0, Title = "New Genre"}},
|
||||
Tags = new List<TagDto> {new TagDto {Id = 0, Title = "New Tag"}},
|
||||
Characters = new List<PersonDto> {new PersonDto {Id = 0, Name = "Joe Shmo", Role = PersonRole.Character}},
|
||||
Colorists = new List<PersonDto> {new PersonDto {Id = 0, Name = "Joe Shmo", Role = PersonRole.Colorist}},
|
||||
Pencillers = new List<PersonDto> {new PersonDto {Id = 0, Name = "Joe Shmo 2", Role = PersonRole.Penciller}},
|
||||
},
|
||||
CollectionTags = new List<CollectionTagDto>
|
||||
{
|
||||
new CollectionTagDto {Id = 0, Promoted = false, Summary = string.Empty, CoverImageLocked = false, Title = "New Collection"}
|
||||
}
|
||||
});
|
||||
|
||||
Assert.True(success);
|
||||
|
||||
var series = await _unitOfWork.SeriesRepository.GetSeriesByIdAsync(1);
|
||||
Assert.NotNull(series.Metadata);
|
||||
Assert.Contains("New Genre".SentenceCase(), series.Metadata.Genres.Select(g => g.Title));
|
||||
Assert.True(series.Metadata.People.All(g => g.Name is "Joe Shmo" or "Joe Shmo 2"));
|
||||
Assert.Contains("New Tag".SentenceCase(), series.Metadata.Tags.Select(g => g.Title));
|
||||
Assert.Contains("New Collection", series.Metadata.CollectionTags.Select(g => g.Title));
|
||||
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
@ -842,7 +802,7 @@ public class SeriesServiceTests : AbstractDbTest
|
|||
SeriesId = 1,
|
||||
Genres = new List<GenreTagDto> {new () {Id = 0, Title = "New Genre"}},
|
||||
},
|
||||
CollectionTags = new List<CollectionTagDto>()
|
||||
|
||||
});
|
||||
|
||||
Assert.True(success);
|
||||
|
@ -875,7 +835,7 @@ public class SeriesServiceTests : AbstractDbTest
|
|||
SeriesId = 1,
|
||||
Publishers = new List<PersonDto> {new () {Id = 0, Name = "Existing Person", Role = PersonRole.Publisher}},
|
||||
},
|
||||
CollectionTags = new List<CollectionTagDto>()
|
||||
|
||||
});
|
||||
|
||||
Assert.True(success);
|
||||
|
@ -911,7 +871,7 @@ public class SeriesServiceTests : AbstractDbTest
|
|||
Publishers = new List<PersonDto> {new () {Id = 0, Name = "Existing Person", Role = PersonRole.Publisher}},
|
||||
PublisherLocked = true
|
||||
},
|
||||
CollectionTags = new List<CollectionTagDto>()
|
||||
|
||||
});
|
||||
|
||||
Assert.True(success);
|
||||
|
@ -944,7 +904,7 @@ public class SeriesServiceTests : AbstractDbTest
|
|||
SeriesId = 1,
|
||||
Publishers = new List<PersonDto>(),
|
||||
},
|
||||
CollectionTags = new List<CollectionTagDto>()
|
||||
|
||||
});
|
||||
|
||||
Assert.True(success);
|
||||
|
@ -978,7 +938,7 @@ public class SeriesServiceTests : AbstractDbTest
|
|||
Genres = new List<GenreTagDto> {new () {Id = 1, Title = "Existing Genre"}},
|
||||
GenresLocked = true
|
||||
},
|
||||
CollectionTags = new List<CollectionTagDto>()
|
||||
|
||||
});
|
||||
|
||||
Assert.True(success);
|
||||
|
@ -1007,7 +967,7 @@ public class SeriesServiceTests : AbstractDbTest
|
|||
SeriesId = 1,
|
||||
ReleaseYear = 100,
|
||||
},
|
||||
CollectionTags = new List<CollectionTagDto>()
|
||||
|
||||
});
|
||||
|
||||
Assert.True(success);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue