Adding tests

This commit is contained in:
Zoe Roux 2021-06-08 23:27:32 +02:00
parent cc672876ae
commit d61f3538fe
9 changed files with 269 additions and 43 deletions

View File

@ -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<LoadableRelationAttribute>() == null);
await EditRelations(old, edited, resetOld);
await Database.SaveChangesAsync();

View File

@ -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<Show>();
}
public void Dispose()

View File

@ -13,10 +13,11 @@ namespace Kyoo.Tests
protected readonly RepositoryActivator Repositories;
private readonly IRepository<T> _repository;
protected RepositoryTests(RepositoryActivator repositories)
protected RepositoryTests()
{
Repositories = repositories;
Repositories = new RepositoryActivator();
_repository = Repositories.LibraryManager.GetRepository<T>();
Repositories.Context.AddTest<T>();
}
[Fact]
@ -66,5 +67,12 @@ namespace Kyoo.Tests
await _repository.Delete(TestSample.Get<T>().Slug);
Assert.Equal(0, await _repository.GetCount());
}
[Fact]
public async Task DeleteByValueTest()
{
await _repository.Delete(TestSample.Get<T>());
Assert.Equal(0, await _repository.GetCount());
}
}
}

View File

@ -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>();
show.Seasons = new[]
{
TestSample.Get<Season>()
};
show.Seasons.First().Episodes = new[]
{
TestSample.Get<Episode>()
};
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());
}
}
}

View File

@ -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<Show>().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<Show>().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<Show>().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<Show>().Slug);
value.People = new[]
{
new PeopleRole
{
Show = value,
People = TestSample.Get<People>(),
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<Show>().Slug);
value.ExternalIDs = new[]
{
new MetadataID<Show>()
{
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<Show>().Slug);
Show newValue = new()
{
ID = value.ID,
Title = "Reset"
};
await Assert.ThrowsAsync<ArgumentException>(() => _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);
}
}
}

View File

@ -37,6 +37,17 @@ namespace Kyoo.Tests
context.Database.Migrate();
}
/// <summary>
/// Fill the database with pre defined values using a clean context.
/// </summary>
public void AddTest<T>()
where T : class
{
using DatabaseContext context = New();
context.Set<T>().Add(TestSample.Get<T>());
context.SaveChanges();
}
/// <summary>
/// Fill the database with pre defined values using a clean context.
/// </summary>
@ -49,16 +60,27 @@ namespace Kyoo.Tests
}
/// <summary>
/// Fill the database with pre defined values using a clean context.
/// Add an arbitrary data to the test context.
/// </summary>
public void AddTest<T>()
public void Add<T>(T obj)
where T : class
{
using DatabaseContext context = New();
context.Set<T>().Add(TestSample.Get<T>());
context.Set<T>().Add(obj);
context.SaveChanges();
}
/// <summary>
/// Add an arbitrary data to the test context.
/// </summary>
public async Task AddAsync<T>(T obj)
where T : class
{
await using DatabaseContext context = New();
await context.Set<T>().AddAsync(obj);
await context.SaveChangesAsync();
}
/// <summary>
/// Get a new database context connected to a in memory Sqlite database.
/// </summary>

View File

@ -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"
}
}
};

View File

@ -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);
}
}
}

View File

@ -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<Show> 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);