From d61f3538fe013fe2b3199e0348bdd6b379ed7132 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 8 Jun 2021 23:27:32 +0200 Subject: [PATCH] Adding tests --- Kyoo.CommonAPI/LocalRepository.cs | 2 +- Kyoo.Tests/Library/RepositoryActivator.cs | 7 +- Kyoo.Tests/Library/RepositoryTests.cs | 12 +- .../Library/SpecificTests/GlobalTests.cs | 32 ++++ Kyoo.Tests/Library/SpecificTests/ShowTests.cs | 150 +++++++++++++++--- Kyoo.Tests/Library/TestContext.cs | 28 +++- Kyoo.Tests/Library/TestSample.cs | 43 +++++ Kyoo.Tests/Utility/MergerTests.cs | 21 +++ .../Repositories/ShowRepository.cs | 17 +- 9 files changed, 269 insertions(+), 43 deletions(-) create mode 100644 Kyoo.Tests/Library/SpecificTests/GlobalTests.cs create mode 100644 Kyoo.Tests/Utility/MergerTests.cs diff --git a/Kyoo.CommonAPI/LocalRepository.cs b/Kyoo.CommonAPI/LocalRepository.cs index d63c1b06..42653843 100644 --- a/Kyoo.CommonAPI/LocalRepository.cs +++ b/Kyoo.CommonAPI/LocalRepository.cs @@ -225,7 +225,7 @@ namespace Kyoo.Controllers T old = await GetWithTracking(edited.ID); if (resetOld) - Merger.Nullify(old); + old = Merger.Nullify(old); Merger.Complete(old, edited, x => x.GetCustomAttribute() == null); await EditRelations(old, edited, resetOld); await Database.SaveChangesAsync(); diff --git a/Kyoo.Tests/Library/RepositoryActivator.cs b/Kyoo.Tests/Library/RepositoryActivator.cs index 09016c60..0d2dda01 100644 --- a/Kyoo.Tests/Library/RepositoryActivator.cs +++ b/Kyoo.Tests/Library/RepositoryActivator.cs @@ -1,14 +1,13 @@ using System; using System.Threading.Tasks; using Kyoo.Controllers; -using Kyoo.Models; namespace Kyoo.Tests { public class RepositoryActivator : IDisposable, IAsyncDisposable { - public TestContext Context { get; init; } - public ILibraryManager LibraryManager { get; init; } + public TestContext Context { get; } + public ILibraryManager LibraryManager { get; } private readonly DatabaseContext _database; @@ -50,8 +49,6 @@ namespace Kyoo.Tests studio, genre }); - - Context.AddTest(); } public void Dispose() diff --git a/Kyoo.Tests/Library/RepositoryTests.cs b/Kyoo.Tests/Library/RepositoryTests.cs index 9c350933..16bc4fa9 100644 --- a/Kyoo.Tests/Library/RepositoryTests.cs +++ b/Kyoo.Tests/Library/RepositoryTests.cs @@ -13,10 +13,11 @@ namespace Kyoo.Tests protected readonly RepositoryActivator Repositories; private readonly IRepository _repository; - protected RepositoryTests(RepositoryActivator repositories) + protected RepositoryTests() { - Repositories = repositories; + Repositories = new RepositoryActivator(); _repository = Repositories.LibraryManager.GetRepository(); + Repositories.Context.AddTest(); } [Fact] @@ -66,5 +67,12 @@ namespace Kyoo.Tests await _repository.Delete(TestSample.Get().Slug); Assert.Equal(0, await _repository.GetCount()); } + + [Fact] + public async Task DeleteByValueTest() + { + await _repository.Delete(TestSample.Get()); + Assert.Equal(0, await _repository.GetCount()); + } } } \ No newline at end of file diff --git a/Kyoo.Tests/Library/SpecificTests/GlobalTests.cs b/Kyoo.Tests/Library/SpecificTests/GlobalTests.cs new file mode 100644 index 00000000..284c2ad7 --- /dev/null +++ b/Kyoo.Tests/Library/SpecificTests/GlobalTests.cs @@ -0,0 +1,32 @@ +using System.Linq; +using System.Threading.Tasks; +using Kyoo.Models; +using Xunit; + +namespace Kyoo.Tests.SpecificTests +{ + public class GlobalTests + { + [Fact] + public async Task DeleteShowWithEpisodeAndSeason() + { + RepositoryActivator repositories = new(); + Show show = TestSample.Get(); + show.Seasons = new[] + { + TestSample.Get() + }; + show.Seasons.First().Episodes = new[] + { + TestSample.Get() + }; + await repositories.Context.AddAsync(show); + + Assert.Equal(1, await repositories.LibraryManager.ShowRepository.GetCount()); + await repositories.LibraryManager.ShowRepository.Delete(show); + Assert.Equal(0, await repositories.LibraryManager.ShowRepository.GetCount()); + Assert.Equal(0, await repositories.LibraryManager.SeasonRepository.GetCount()); + Assert.Equal(0, await repositories.LibraryManager.EpisodeRepository.GetCount()); + } + } +} \ No newline at end of file diff --git a/Kyoo.Tests/Library/SpecificTests/ShowTests.cs b/Kyoo.Tests/Library/SpecificTests/ShowTests.cs index cfae6a9e..5cfcfea2 100644 --- a/Kyoo.Tests/Library/SpecificTests/ShowTests.cs +++ b/Kyoo.Tests/Library/SpecificTests/ShowTests.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using System.Threading.Tasks; using Kyoo.Controllers; @@ -12,7 +13,6 @@ namespace Kyoo.Tests.SpecificTests private readonly IShowRepository _repository; public ShowTests() - : base(new RepositoryActivator()) { _repository = Repositories.LibraryManager.ShowRepository; } @@ -51,26 +51,132 @@ namespace Kyoo.Tests.SpecificTests Assert.Equal(value.Genres.Select(x => new{x.Slug, x.Name}), show.Genres.Select(x => new{x.Slug, x.Name})); } - // [Fact] - // public async Task EditPeopleTest() - // { - // Show value = await _repository.Get(TestSample.Get().Slug); - // value.People = new[] {new People - // { - // Name = "test" - // }}; - // Show edited = await _repository.Edit(value, false); - // - // Assert.Equal(value.Slug, edited.Slug); - // Assert.Equal(value.Genres.Select(x => new{x.Slug, x.Name}), edited.Genres.Select(x => new{x.Slug, x.Name})); - // - // await using DatabaseContext database = Repositories.Context.New(); - // Show show = await database.Shows - // .Include(x => x.Genres) - // .FirstAsync(); - // - // Assert.Equal(value.Slug, show.Slug); - // Assert.Equal(value.Genres.Select(x => new{x.Slug, x.Name}), show.Genres.Select(x => new{x.Slug, x.Name})); - // } + [Fact] + public async Task EditStudioTest() + { + Show value = await _repository.Get(TestSample.Get().Slug); + value.Studio = new Studio("studio"); + Show edited = await _repository.Edit(value, false); + + Assert.Equal(value.Slug, edited.Slug); + Assert.Equal("studio", edited.Studio.Slug); + + await using DatabaseContext database = Repositories.Context.New(); + Show show = await database.Shows + .Include(x => x.Genres) + .FirstAsync(); + + Assert.Equal(value.Slug, show.Slug); + Assert.Equal("studio", edited.Studio.Slug); + } + + [Fact] + public async Task EditAliasesTest() + { + Show value = await _repository.Get(TestSample.Get().Slug); + value.Aliases = new[] {"NiceNewAlias", "SecondAlias"}; + Show edited = await _repository.Edit(value, false); + + Assert.Equal(value.Slug, edited.Slug); + Assert.Equal(value.Aliases, edited.Aliases); + + await using DatabaseContext database = Repositories.Context.New(); + Show show = await database.Shows.FirstAsync(); + + Assert.Equal(value.Slug, show.Slug); + Assert.Equal(value.Aliases, edited.Aliases); + } + + [Fact] + public async Task EditPeopleTest() + { + Show value = await _repository.Get(TestSample.Get().Slug); + value.People = new[] + { + new PeopleRole + { + Show = value, + People = TestSample.Get(), + ForPeople = false, + Type = "Actor", + Role = "NiceCharacter" + } + }; + Show edited = await _repository.Edit(value, false); + + Assert.Equal(value.Slug, edited.Slug); + Assert.Equal(edited.People.First().ShowID, value.ID); + Assert.Equal( + value.People.Select(x => new{x.Role, x.Slug, x.People.Name}), + edited.People.Select(x => new{x.Role, x.Slug, x.People.Name})); + + await using DatabaseContext database = Repositories.Context.New(); + Show show = await database.Shows + .Include(x => x.People) + .FirstAsync(); + + Assert.Equal(value.Slug, show.Slug); + Assert.Equal( + value.People.Select(x => new{x.Role, x.Slug, x.People.Name}), + edited.People.Select(x => new{x.Role, x.Slug, x.People.Name})); + } + + [Fact] + public async Task EditExternalIDsTest() + { + Show value = await _repository.Get(TestSample.Get().Slug); + value.ExternalIDs = new[] + { + new MetadataID() + { + First = value, + Second = new Provider("test", "test.png"), + DataID = "1234" + } + }; + Show edited = await _repository.Edit(value, false); + + Assert.Equal(value.Slug, edited.Slug); + Assert.Equal( + value.ExternalIDs.Select(x => new {x.DataID, x.Second.Slug}), + edited.ExternalIDs.Select(x => new {x.DataID, x.Second.Slug})); + + await using DatabaseContext database = Repositories.Context.New(); + Show show = await database.Shows + .Include(x => x.ExternalIDs) + .ThenInclude(x => x.Second) + .FirstAsync(); + + Assert.Equal(value.Slug, show.Slug); + Assert.Equal( + value.ExternalIDs.Select(x => new {x.DataID, x.Second.Slug}), + show.ExternalIDs.Select(x => new {x.DataID, x.Second.Slug})); + } + + [Fact] + public async Task EditResetOldTest() + { + Show value = await _repository.Get(TestSample.Get().Slug); + Show newValue = new() + { + ID = value.ID, + Title = "Reset" + }; + + await Assert.ThrowsAsync(() => _repository.Edit(newValue, true)); + + newValue.Slug = "reset"; + Show edited = await _repository.Edit(newValue, true); + + Assert.Equal(value.ID, edited.ID); + Assert.Null(edited.Overview); + Assert.Equal("reset", edited.Slug); + Assert.Equal("Reset", edited.Title); + Assert.Null(edited.Aliases); + Assert.Null(edited.ExternalIDs); + Assert.Null(edited.People); + Assert.Null(edited.Genres); + Assert.Null(edited.Studio); + } } } \ No newline at end of file diff --git a/Kyoo.Tests/Library/TestContext.cs b/Kyoo.Tests/Library/TestContext.cs index 50db0b6b..a3d2a51e 100644 --- a/Kyoo.Tests/Library/TestContext.cs +++ b/Kyoo.Tests/Library/TestContext.cs @@ -37,6 +37,17 @@ namespace Kyoo.Tests context.Database.Migrate(); } + /// + /// Fill the database with pre defined values using a clean context. + /// + public void AddTest() + where T : class + { + using DatabaseContext context = New(); + context.Set().Add(TestSample.Get()); + context.SaveChanges(); + } + /// /// Fill the database with pre defined values using a clean context. /// @@ -49,15 +60,26 @@ namespace Kyoo.Tests } /// - /// Fill the database with pre defined values using a clean context. + /// Add an arbitrary data to the test context. /// - public void AddTest() + public void Add(T obj) where T : class { using DatabaseContext context = New(); - context.Set().Add(TestSample.Get()); + context.Set().Add(obj); context.SaveChanges(); } + + /// + /// Add an arbitrary data to the test context. + /// + public async Task AddAsync(T obj) + where T : class + { + await using DatabaseContext context = New(); + await context.Set().AddAsync(obj); + await context.SaveChangesAsync(); + } /// /// Get a new database context connected to a in memory Sqlite database. diff --git a/Kyoo.Tests/Library/TestSample.cs b/Kyoo.Tests/Library/TestSample.cs index 16eed5d8..3ad39969 100644 --- a/Kyoo.Tests/Library/TestSample.cs +++ b/Kyoo.Tests/Library/TestSample.cs @@ -34,6 +34,49 @@ namespace Kyoo.Tests IsMovie = false, Studio = null } + }, + { + typeof(Season), + new Season + { + ID = 1, + ShowSlug = "anohana", + ShowID = 1, + SeasonNumber = 1, + Title = "Season 1", + Overview = "The first season", + StartDate = new DateTime(2020, 06, 05), + EndDate = new DateTime(2020, 07, 05), + Poster = "poster" + } + }, + { + typeof(Episode), + new Episode + { + ID = 1, + ShowSlug = "anohana", + ShowID = 1, + SeasonID = 1, + SeasonNumber = 1, + EpisodeNumber = 1, + AbsoluteNumber = 1, + Path = "/home/kyoo/anohana-s1e1", + Thumb = "thumbnail", + Title = "Episode 1", + Overview = "Summary of the first episode", + ReleaseDate = new DateTime(2020, 06, 05) + } + }, + { + typeof(People), + new People + { + ID = 1, + Slug = "the-actor", + Name = "The Actor", + Poster = "NicePoster" + } } }; diff --git a/Kyoo.Tests/Utility/MergerTests.cs b/Kyoo.Tests/Utility/MergerTests.cs new file mode 100644 index 00000000..614d328f --- /dev/null +++ b/Kyoo.Tests/Utility/MergerTests.cs @@ -0,0 +1,21 @@ +using Kyoo.Models; +using Xunit; + +namespace Kyoo.Tests +{ + public class MergerTests + { + [Fact] + public void NullifyTest() + { + Genre genre = new("test") + { + ID = 5 + }; + Merger.Nullify(genre); + Assert.Equal(0, genre.ID); + Assert.Null(genre.Name); + Assert.Null(genre.Slug); + } + } +} \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index ba88a639..deeea623 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -131,6 +131,12 @@ namespace Kyoo.Controllers if (changed.Aliases != null || resetOld) resource.Aliases = changed.Aliases; + if (changed.Studio != null || resetOld) + { + await Database.Entry(resource).Reference(x => x.Studio).LoadAsync(); + resource.Studio = changed.Studio; + } + if (changed.Genres != null || resetOld) { await Database.Entry(resource).Collection(x => x.GenreLinks).LoadAsync(); @@ -189,18 +195,9 @@ namespace Kyoo.Controllers throw new ArgumentNullException(nameof(obj)); _database.Entry(obj).State = EntityState.Deleted; - - - if (obj.People != null) - foreach (PeopleRole entry in obj.People) - _database.Entry(entry).State = EntityState.Deleted; - - if (obj.ExternalIDs != null) - foreach (MetadataID entry in obj.ExternalIDs) - _database.Entry(entry).State = EntityState.Deleted; - await _database.SaveChangesAsync(); + // TODO handle that with events maybe. (for now, seasons & episodes might not be loaded) if (obj.Seasons != null) await _seasons.Value.DeleteRange(obj.Seasons);