A bunch of bug fixes and some enhancements (#3871)
Co-authored-by: Joseph Milazzo <josephmajora@gmail.com>
This commit is contained in:
parent
62231d3c4e
commit
6fa1cf994e
24 changed files with 1464 additions and 91 deletions
280
API.Tests/Repository/GenreRepositoryTests.cs
Normal file
280
API.Tests/Repository/GenreRepositoryTests.cs
Normal file
|
@ -0,0 +1,280 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using API.DTOs.Metadata.Browse;
|
||||
using API.Entities;
|
||||
using API.Entities.Enums;
|
||||
using API.Entities.Metadata;
|
||||
using API.Helpers;
|
||||
using API.Helpers.Builders;
|
||||
using Xunit;
|
||||
|
||||
namespace API.Tests.Repository;
|
||||
|
||||
public class GenreRepositoryTests : AbstractDbTest
|
||||
{
|
||||
private AppUser _fullAccess;
|
||||
private AppUser _restrictedAccess;
|
||||
private AppUser _restrictedAgeAccess;
|
||||
|
||||
protected override async Task ResetDb()
|
||||
{
|
||||
Context.Genre.RemoveRange(Context.Genre);
|
||||
Context.Library.RemoveRange(Context.Library);
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private TestGenreSet CreateTestGenres()
|
||||
{
|
||||
return new TestGenreSet
|
||||
{
|
||||
SharedSeriesChaptersGenre = new GenreBuilder("Shared Series Chapter Genre").Build(),
|
||||
SharedSeriesGenre = new GenreBuilder("Shared Series Genre").Build(),
|
||||
SharedChaptersGenre = new GenreBuilder("Shared Chapters Genre").Build(),
|
||||
Lib0SeriesChaptersGenre = new GenreBuilder("Lib0 Series Chapter Genre").Build(),
|
||||
Lib0SeriesGenre = new GenreBuilder("Lib0 Series Genre").Build(),
|
||||
Lib0ChaptersGenre = new GenreBuilder("Lib0 Chapters Genre").Build(),
|
||||
Lib1SeriesChaptersGenre = new GenreBuilder("Lib1 Series Chapter Genre").Build(),
|
||||
Lib1SeriesGenre = new GenreBuilder("Lib1 Series Genre").Build(),
|
||||
Lib1ChaptersGenre = new GenreBuilder("Lib1 Chapters Genre").Build(),
|
||||
Lib1ChapterAgeGenre = new GenreBuilder("Lib1 Chapter Age Genre").Build()
|
||||
};
|
||||
}
|
||||
|
||||
private async Task SeedDbWithGenres(TestGenreSet genres)
|
||||
{
|
||||
await CreateTestUsers();
|
||||
await AddGenresToContext(genres);
|
||||
await CreateLibrariesWithGenres(genres);
|
||||
await AssignLibrariesToUsers();
|
||||
}
|
||||
|
||||
private async Task CreateTestUsers()
|
||||
{
|
||||
_fullAccess = new AppUserBuilder("amelia", "amelia@example.com").Build();
|
||||
_restrictedAccess = new AppUserBuilder("mila", "mila@example.com").Build();
|
||||
_restrictedAgeAccess = new AppUserBuilder("eva", "eva@example.com").Build();
|
||||
_restrictedAgeAccess.AgeRestriction = AgeRating.Teen;
|
||||
_restrictedAgeAccess.AgeRestrictionIncludeUnknowns = true;
|
||||
|
||||
Context.Users.Add(_fullAccess);
|
||||
Context.Users.Add(_restrictedAccess);
|
||||
Context.Users.Add(_restrictedAgeAccess);
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private async Task AddGenresToContext(TestGenreSet genres)
|
||||
{
|
||||
var allGenres = genres.GetAllGenres();
|
||||
Context.Genre.AddRange(allGenres);
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private async Task CreateLibrariesWithGenres(TestGenreSet genres)
|
||||
{
|
||||
var lib0 = new LibraryBuilder("lib0")
|
||||
.WithSeries(new SeriesBuilder("lib0-s0")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithGenres([genres.SharedSeriesChaptersGenre, genres.SharedSeriesGenre, genres.Lib0SeriesChaptersGenre, genres.Lib0SeriesGenre])
|
||||
.Build())
|
||||
.WithVolume(new VolumeBuilder("1")
|
||||
.WithChapter(new ChapterBuilder("1")
|
||||
.WithGenres([genres.SharedSeriesChaptersGenre, genres.SharedChaptersGenre, genres.Lib0SeriesChaptersGenre, genres.Lib0ChaptersGenre])
|
||||
.Build())
|
||||
.WithChapter(new ChapterBuilder("2")
|
||||
.WithGenres([genres.SharedSeriesChaptersGenre, genres.SharedChaptersGenre, genres.Lib1SeriesChaptersGenre, genres.Lib1ChaptersGenre])
|
||||
.Build())
|
||||
.Build())
|
||||
.Build())
|
||||
.Build();
|
||||
|
||||
var lib1 = new LibraryBuilder("lib1")
|
||||
.WithSeries(new SeriesBuilder("lib1-s0")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithGenres([genres.SharedSeriesChaptersGenre, genres.SharedSeriesGenre, genres.Lib1SeriesChaptersGenre, genres.Lib1SeriesGenre])
|
||||
.WithAgeRating(AgeRating.Mature17Plus)
|
||||
.Build())
|
||||
.WithVolume(new VolumeBuilder("1")
|
||||
.WithChapter(new ChapterBuilder("1")
|
||||
.WithGenres([genres.SharedSeriesChaptersGenre, genres.SharedChaptersGenre, genres.Lib1SeriesChaptersGenre, genres.Lib1ChaptersGenre])
|
||||
.Build())
|
||||
.WithChapter(new ChapterBuilder("2")
|
||||
.WithGenres([genres.SharedSeriesChaptersGenre, genres.SharedChaptersGenre, genres.Lib1SeriesChaptersGenre, genres.Lib1ChaptersGenre, genres.Lib1ChapterAgeGenre])
|
||||
.WithAgeRating(AgeRating.Mature17Plus)
|
||||
.Build())
|
||||
.Build())
|
||||
.Build())
|
||||
.WithSeries(new SeriesBuilder("lib1-s1")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithGenres([genres.SharedSeriesChaptersGenre, genres.SharedSeriesGenre, genres.Lib1SeriesChaptersGenre, genres.Lib1SeriesGenre])
|
||||
.Build())
|
||||
.WithVolume(new VolumeBuilder("1")
|
||||
.WithChapter(new ChapterBuilder("1")
|
||||
.WithGenres([genres.SharedSeriesChaptersGenre, genres.SharedChaptersGenre, genres.Lib1SeriesChaptersGenre, genres.Lib1ChaptersGenre])
|
||||
.Build())
|
||||
.WithChapter(new ChapterBuilder("2")
|
||||
.WithGenres([genres.SharedSeriesChaptersGenre, genres.SharedChaptersGenre, genres.Lib1SeriesChaptersGenre, genres.Lib1ChaptersGenre])
|
||||
.Build())
|
||||
.Build())
|
||||
.Build())
|
||||
.Build();
|
||||
|
||||
Context.Library.Add(lib0);
|
||||
Context.Library.Add(lib1);
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private async Task AssignLibrariesToUsers()
|
||||
{
|
||||
var lib0 = Context.Library.First(l => l.Name == "lib0");
|
||||
var lib1 = Context.Library.First(l => l.Name == "lib1");
|
||||
|
||||
_fullAccess.Libraries.Add(lib0);
|
||||
_fullAccess.Libraries.Add(lib1);
|
||||
_restrictedAccess.Libraries.Add(lib1);
|
||||
_restrictedAgeAccess.Libraries.Add(lib1);
|
||||
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private static Predicate<BrowseGenreDto> ContainsGenreCheck(Genre genre)
|
||||
{
|
||||
return g => g.Id == genre.Id;
|
||||
}
|
||||
|
||||
private static void AssertGenrePresent(IEnumerable<BrowseGenreDto> genres, Genre expectedGenre)
|
||||
{
|
||||
Assert.Contains(genres, ContainsGenreCheck(expectedGenre));
|
||||
}
|
||||
|
||||
private static void AssertGenreNotPresent(IEnumerable<BrowseGenreDto> genres, Genre expectedGenre)
|
||||
{
|
||||
Assert.DoesNotContain(genres, ContainsGenreCheck(expectedGenre));
|
||||
}
|
||||
|
||||
private static BrowseGenreDto GetGenreDto(IEnumerable<BrowseGenreDto> genres, Genre genre)
|
||||
{
|
||||
return genres.First(dto => dto.Id == genre.Id);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetBrowseableGenre_FullAccess_ReturnsAllGenresWithCorrectCounts()
|
||||
{
|
||||
// Arrange
|
||||
await ResetDb();
|
||||
var genres = CreateTestGenres();
|
||||
await SeedDbWithGenres(genres);
|
||||
|
||||
// Act
|
||||
var fullAccessGenres = await UnitOfWork.GenreRepository.GetBrowseableGenre(_fullAccess.Id, new UserParams());
|
||||
|
||||
// Assert
|
||||
Assert.Equal(genres.GetAllGenres().Count, fullAccessGenres.TotalCount);
|
||||
|
||||
foreach (var genre in genres.GetAllGenres())
|
||||
{
|
||||
AssertGenrePresent(fullAccessGenres, genre);
|
||||
}
|
||||
|
||||
// Verify counts - 1 lib0 series, 2 lib1 series = 3 total series
|
||||
Assert.Equal(3, GetGenreDto(fullAccessGenres, genres.SharedSeriesChaptersGenre).SeriesCount);
|
||||
Assert.Equal(6, GetGenreDto(fullAccessGenres, genres.SharedSeriesChaptersGenre).ChapterCount);
|
||||
Assert.Equal(1, GetGenreDto(fullAccessGenres, genres.Lib0SeriesGenre).SeriesCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetBrowseableGenre_RestrictedAccess_ReturnsOnlyAccessibleGenres()
|
||||
{
|
||||
// Arrange
|
||||
await ResetDb();
|
||||
var genres = CreateTestGenres();
|
||||
await SeedDbWithGenres(genres);
|
||||
|
||||
// Act
|
||||
var restrictedAccessGenres = await UnitOfWork.GenreRepository.GetBrowseableGenre(_restrictedAccess.Id, new UserParams());
|
||||
|
||||
// Assert - Should see: 3 shared + 4 library 1 specific = 7 genres
|
||||
Assert.Equal(7, restrictedAccessGenres.TotalCount);
|
||||
|
||||
// Verify shared and Library 1 genres are present
|
||||
AssertGenrePresent(restrictedAccessGenres, genres.SharedSeriesChaptersGenre);
|
||||
AssertGenrePresent(restrictedAccessGenres, genres.SharedSeriesGenre);
|
||||
AssertGenrePresent(restrictedAccessGenres, genres.SharedChaptersGenre);
|
||||
AssertGenrePresent(restrictedAccessGenres, genres.Lib1SeriesChaptersGenre);
|
||||
AssertGenrePresent(restrictedAccessGenres, genres.Lib1SeriesGenre);
|
||||
AssertGenrePresent(restrictedAccessGenres, genres.Lib1ChaptersGenre);
|
||||
AssertGenrePresent(restrictedAccessGenres, genres.Lib1ChapterAgeGenre);
|
||||
|
||||
// Verify Library 0 specific genres are not present
|
||||
AssertGenreNotPresent(restrictedAccessGenres, genres.Lib0SeriesChaptersGenre);
|
||||
AssertGenreNotPresent(restrictedAccessGenres, genres.Lib0SeriesGenre);
|
||||
AssertGenreNotPresent(restrictedAccessGenres, genres.Lib0ChaptersGenre);
|
||||
|
||||
// Verify counts - 2 lib1 series
|
||||
Assert.Equal(2, GetGenreDto(restrictedAccessGenres, genres.SharedSeriesChaptersGenre).SeriesCount);
|
||||
Assert.Equal(4, GetGenreDto(restrictedAccessGenres, genres.SharedSeriesChaptersGenre).ChapterCount);
|
||||
Assert.Equal(2, GetGenreDto(restrictedAccessGenres, genres.Lib1SeriesGenre).SeriesCount);
|
||||
Assert.Equal(4, GetGenreDto(restrictedAccessGenres, genres.Lib1ChaptersGenre).ChapterCount);
|
||||
Assert.Equal(1, GetGenreDto(restrictedAccessGenres, genres.Lib1ChapterAgeGenre).ChapterCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetBrowseableGenre_RestrictedAgeAccess_FiltersAgeRestrictedContent()
|
||||
{
|
||||
// Arrange
|
||||
await ResetDb();
|
||||
var genres = CreateTestGenres();
|
||||
await SeedDbWithGenres(genres);
|
||||
|
||||
// Act
|
||||
var restrictedAgeAccessGenres = await UnitOfWork.GenreRepository.GetBrowseableGenre(_restrictedAgeAccess.Id, new UserParams());
|
||||
|
||||
// Assert - Should see: 3 shared + 3 lib1 specific = 6 genres (age-restricted genre filtered out)
|
||||
Assert.Equal(6, restrictedAgeAccessGenres.TotalCount);
|
||||
|
||||
// Verify accessible genres are present
|
||||
AssertGenrePresent(restrictedAgeAccessGenres, genres.SharedSeriesChaptersGenre);
|
||||
AssertGenrePresent(restrictedAgeAccessGenres, genres.SharedSeriesGenre);
|
||||
AssertGenrePresent(restrictedAgeAccessGenres, genres.SharedChaptersGenre);
|
||||
AssertGenrePresent(restrictedAgeAccessGenres, genres.Lib1SeriesChaptersGenre);
|
||||
AssertGenrePresent(restrictedAgeAccessGenres, genres.Lib1SeriesGenre);
|
||||
AssertGenrePresent(restrictedAgeAccessGenres, genres.Lib1ChaptersGenre);
|
||||
|
||||
// Verify age-restricted genre is filtered out
|
||||
AssertGenreNotPresent(restrictedAgeAccessGenres, genres.Lib1ChapterAgeGenre);
|
||||
|
||||
// Verify counts - 1 series lib1 (age-restricted series filtered out)
|
||||
Assert.Equal(1, GetGenreDto(restrictedAgeAccessGenres, genres.SharedSeriesChaptersGenre).SeriesCount);
|
||||
Assert.Equal(1, GetGenreDto(restrictedAgeAccessGenres, genres.Lib1SeriesGenre).SeriesCount);
|
||||
|
||||
// These values represent a bug - chapters are not properly filtered when their series is age-restricted
|
||||
// Should be 2, but currently returns 3 due to the filtering issue
|
||||
Assert.Equal(3, GetGenreDto(restrictedAgeAccessGenres, genres.SharedSeriesChaptersGenre).ChapterCount);
|
||||
Assert.Equal(3, GetGenreDto(restrictedAgeAccessGenres, genres.Lib1ChaptersGenre).ChapterCount);
|
||||
}
|
||||
|
||||
private class TestGenreSet
|
||||
{
|
||||
public Genre SharedSeriesChaptersGenre { get; set; }
|
||||
public Genre SharedSeriesGenre { get; set; }
|
||||
public Genre SharedChaptersGenre { get; set; }
|
||||
public Genre Lib0SeriesChaptersGenre { get; set; }
|
||||
public Genre Lib0SeriesGenre { get; set; }
|
||||
public Genre Lib0ChaptersGenre { get; set; }
|
||||
public Genre Lib1SeriesChaptersGenre { get; set; }
|
||||
public Genre Lib1SeriesGenre { get; set; }
|
||||
public Genre Lib1ChaptersGenre { get; set; }
|
||||
public Genre Lib1ChapterAgeGenre { get; set; }
|
||||
|
||||
public List<Genre> GetAllGenres()
|
||||
{
|
||||
return
|
||||
[
|
||||
SharedSeriesChaptersGenre, SharedSeriesGenre, SharedChaptersGenre,
|
||||
Lib0SeriesChaptersGenre, Lib0SeriesGenre, Lib0ChaptersGenre,
|
||||
Lib1SeriesChaptersGenre, Lib1SeriesGenre, Lib1ChaptersGenre, Lib1ChapterAgeGenre
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
342
API.Tests/Repository/PersonRepositoryTests.cs
Normal file
342
API.Tests/Repository/PersonRepositoryTests.cs
Normal file
|
@ -0,0 +1,342 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using API.DTOs.Metadata.Browse;
|
||||
using API.DTOs.Metadata.Browse.Requests;
|
||||
using API.Entities;
|
||||
using API.Entities.Enums;
|
||||
using API.Entities.Person;
|
||||
using API.Helpers;
|
||||
using API.Helpers.Builders;
|
||||
using Xunit;
|
||||
|
||||
namespace API.Tests.Repository;
|
||||
|
||||
public class PersonRepositoryTests : AbstractDbTest
|
||||
{
|
||||
private AppUser _fullAccess;
|
||||
private AppUser _restrictedAccess;
|
||||
private AppUser _restrictedAgeAccess;
|
||||
|
||||
protected override async Task ResetDb()
|
||||
{
|
||||
Context.Person.RemoveRange(Context.Person.ToList());
|
||||
Context.Library.RemoveRange(Context.Library.ToList());
|
||||
Context.AppUser.RemoveRange(Context.AppUser.ToList());
|
||||
await UnitOfWork.CommitAsync();
|
||||
}
|
||||
|
||||
private async Task SeedDb()
|
||||
{
|
||||
_fullAccess = new AppUserBuilder("amelia", "amelia@example.com").Build();
|
||||
_restrictedAccess = new AppUserBuilder("mila", "mila@example.com").Build();
|
||||
_restrictedAgeAccess = new AppUserBuilder("eva", "eva@example.com").Build();
|
||||
_restrictedAgeAccess.AgeRestriction = AgeRating.Teen;
|
||||
_restrictedAgeAccess.AgeRestrictionIncludeUnknowns = true;
|
||||
|
||||
Context.AppUser.Add(_fullAccess);
|
||||
Context.AppUser.Add(_restrictedAccess);
|
||||
Context.AppUser.Add(_restrictedAgeAccess);
|
||||
await Context.SaveChangesAsync();
|
||||
|
||||
var people = CreateTestPeople();
|
||||
Context.Person.AddRange(people);
|
||||
await Context.SaveChangesAsync();
|
||||
|
||||
var libraries = CreateTestLibraries(people);
|
||||
Context.Library.AddRange(libraries);
|
||||
await Context.SaveChangesAsync();
|
||||
|
||||
_fullAccess.Libraries.Add(libraries[0]); // lib0
|
||||
_fullAccess.Libraries.Add(libraries[1]); // lib1
|
||||
_restrictedAccess.Libraries.Add(libraries[1]); // lib1 only
|
||||
_restrictedAgeAccess.Libraries.Add(libraries[1]); // lib1 only
|
||||
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private static List<Person> CreateTestPeople()
|
||||
{
|
||||
return new List<Person>
|
||||
{
|
||||
new PersonBuilder("Shared Series Chapter Person").Build(),
|
||||
new PersonBuilder("Shared Series Person").Build(),
|
||||
new PersonBuilder("Shared Chapters Person").Build(),
|
||||
new PersonBuilder("Lib0 Series Chapter Person").Build(),
|
||||
new PersonBuilder("Lib0 Series Person").Build(),
|
||||
new PersonBuilder("Lib0 Chapters Person").Build(),
|
||||
new PersonBuilder("Lib1 Series Chapter Person").Build(),
|
||||
new PersonBuilder("Lib1 Series Person").Build(),
|
||||
new PersonBuilder("Lib1 Chapters Person").Build(),
|
||||
new PersonBuilder("Lib1 Chapter Age Person").Build()
|
||||
};
|
||||
}
|
||||
|
||||
private static List<Library> CreateTestLibraries(List<Person> people)
|
||||
{
|
||||
var lib0 = new LibraryBuilder("lib0")
|
||||
.WithSeries(new SeriesBuilder("lib0-s0")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Chapter Person"), PersonRole.Writer)
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Person"), PersonRole.Writer)
|
||||
.WithPerson(GetPersonByName(people, "Lib0 Series Chapter Person"), PersonRole.Writer)
|
||||
.WithPerson(GetPersonByName(people, "Lib0 Series Person"), PersonRole.Writer)
|
||||
.Build())
|
||||
.WithVolume(new VolumeBuilder("1")
|
||||
.WithChapter(new ChapterBuilder("1")
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Chapter Person"), PersonRole.Colorist)
|
||||
.WithPerson(GetPersonByName(people, "Shared Chapters Person"), PersonRole.Colorist)
|
||||
.WithPerson(GetPersonByName(people, "Lib0 Series Chapter Person"), PersonRole.Colorist)
|
||||
.WithPerson(GetPersonByName(people, "Lib0 Chapters Person"), PersonRole.Colorist)
|
||||
.Build())
|
||||
.WithChapter(new ChapterBuilder("2")
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Chapter Person"), PersonRole.Editor)
|
||||
.WithPerson(GetPersonByName(people, "Shared Chapters Person"), PersonRole.Editor)
|
||||
.WithPerson(GetPersonByName(people, "Lib0 Series Chapter Person"), PersonRole.Editor)
|
||||
.WithPerson(GetPersonByName(people, "Lib0 Chapters Person"), PersonRole.Editor)
|
||||
.Build())
|
||||
.Build())
|
||||
.Build())
|
||||
.Build();
|
||||
|
||||
var lib1 = new LibraryBuilder("lib1")
|
||||
.WithSeries(new SeriesBuilder("lib1-s0")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Chapter Person"), PersonRole.Letterer)
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Person"), PersonRole.Letterer)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Series Chapter Person"), PersonRole.Letterer)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Series Person"), PersonRole.Letterer)
|
||||
.WithAgeRating(AgeRating.Mature17Plus)
|
||||
.Build())
|
||||
.WithVolume(new VolumeBuilder("1")
|
||||
.WithChapter(new ChapterBuilder("1")
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Chapter Person"), PersonRole.Imprint)
|
||||
.WithPerson(GetPersonByName(people, "Shared Chapters Person"), PersonRole.Imprint)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Series Chapter Person"), PersonRole.Imprint)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Chapters Person"), PersonRole.Imprint)
|
||||
.Build())
|
||||
.WithChapter(new ChapterBuilder("2")
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Chapter Person"), PersonRole.CoverArtist)
|
||||
.WithPerson(GetPersonByName(people, "Shared Chapters Person"), PersonRole.CoverArtist)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Series Chapter Person"), PersonRole.CoverArtist)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Chapters Person"), PersonRole.CoverArtist)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Chapter Age Person"), PersonRole.CoverArtist)
|
||||
.WithAgeRating(AgeRating.Mature17Plus)
|
||||
.Build())
|
||||
.Build())
|
||||
.Build())
|
||||
.WithSeries(new SeriesBuilder("lib1-s1")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Chapter Person"), PersonRole.Inker)
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Person"), PersonRole.Inker)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Series Chapter Person"), PersonRole.Inker)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Series Person"), PersonRole.Inker)
|
||||
.Build())
|
||||
.WithVolume(new VolumeBuilder("1")
|
||||
.WithChapter(new ChapterBuilder("1")
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Chapter Person"), PersonRole.Team)
|
||||
.WithPerson(GetPersonByName(people, "Shared Chapters Person"), PersonRole.Team)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Series Chapter Person"), PersonRole.Team)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Chapters Person"), PersonRole.Team)
|
||||
.Build())
|
||||
.WithChapter(new ChapterBuilder("2")
|
||||
.WithPerson(GetPersonByName(people, "Shared Series Chapter Person"), PersonRole.Translator)
|
||||
.WithPerson(GetPersonByName(people, "Shared Chapters Person"), PersonRole.Translator)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Series Chapter Person"), PersonRole.Translator)
|
||||
.WithPerson(GetPersonByName(people, "Lib1 Chapters Person"), PersonRole.Translator)
|
||||
.Build())
|
||||
.Build())
|
||||
.Build())
|
||||
.Build();
|
||||
|
||||
return new List<Library> { lib0, lib1 };
|
||||
}
|
||||
|
||||
private static Person GetPersonByName(List<Person> people, string name)
|
||||
{
|
||||
return people.First(p => p.Name == name);
|
||||
}
|
||||
|
||||
private Person GetPersonByName(string name)
|
||||
{
|
||||
return Context.Person.First(p => p.Name == name);
|
||||
}
|
||||
|
||||
private static Predicate<BrowsePersonDto> ContainsPersonCheck(Person person)
|
||||
{
|
||||
return p => p.Id == person.Id;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetBrowsePersonDtos()
|
||||
{
|
||||
await ResetDb();
|
||||
await SeedDb();
|
||||
|
||||
// Get people from database for assertions
|
||||
var sharedSeriesChaptersPerson = GetPersonByName("Shared Series Chapter Person");
|
||||
var lib0SeriesPerson = GetPersonByName("Lib0 Series Person");
|
||||
var lib1SeriesPerson = GetPersonByName("Lib1 Series Person");
|
||||
var lib1ChapterAgePerson = GetPersonByName("Lib1 Chapter Age Person");
|
||||
var allPeople = Context.Person.ToList();
|
||||
|
||||
var fullAccessPeople =
|
||||
await UnitOfWork.PersonRepository.GetBrowsePersonDtos(_fullAccess.Id, new BrowsePersonFilterDto(),
|
||||
new UserParams());
|
||||
Assert.Equal(allPeople.Count, fullAccessPeople.TotalCount);
|
||||
|
||||
foreach (var person in allPeople)
|
||||
Assert.Contains(fullAccessPeople, ContainsPersonCheck(person));
|
||||
|
||||
// 1 series in lib0, 2 series in lib1
|
||||
Assert.Equal(3, fullAccessPeople.First(dto => dto.Id == sharedSeriesChaptersPerson.Id).SeriesCount);
|
||||
// 3 series with each 2 chapters
|
||||
Assert.Equal(6, fullAccessPeople.First(dto => dto.Id == sharedSeriesChaptersPerson.Id).ChapterCount);
|
||||
// 1 series in lib0
|
||||
Assert.Equal(1, fullAccessPeople.First(dto => dto.Id == lib0SeriesPerson.Id).SeriesCount);
|
||||
// 2 series in lib1
|
||||
Assert.Equal(2, fullAccessPeople.First(dto => dto.Id == lib1SeriesPerson.Id).SeriesCount);
|
||||
|
||||
var restrictedAccessPeople =
|
||||
await UnitOfWork.PersonRepository.GetBrowsePersonDtos(_restrictedAccess.Id, new BrowsePersonFilterDto(),
|
||||
new UserParams());
|
||||
|
||||
Assert.Equal(7, restrictedAccessPeople.TotalCount);
|
||||
|
||||
Assert.Contains(restrictedAccessPeople, ContainsPersonCheck(GetPersonByName("Shared Series Chapter Person")));
|
||||
Assert.Contains(restrictedAccessPeople, ContainsPersonCheck(GetPersonByName("Shared Series Person")));
|
||||
Assert.Contains(restrictedAccessPeople, ContainsPersonCheck(GetPersonByName("Shared Chapters Person")));
|
||||
Assert.Contains(restrictedAccessPeople, ContainsPersonCheck(GetPersonByName("Lib1 Series Chapter Person")));
|
||||
Assert.Contains(restrictedAccessPeople, ContainsPersonCheck(GetPersonByName("Lib1 Series Person")));
|
||||
Assert.Contains(restrictedAccessPeople, ContainsPersonCheck(GetPersonByName("Lib1 Chapters Person")));
|
||||
Assert.Contains(restrictedAccessPeople, ContainsPersonCheck(GetPersonByName("Lib1 Chapter Age Person")));
|
||||
|
||||
// 2 series in lib1, no series in lib0
|
||||
Assert.Equal(2, restrictedAccessPeople.First(dto => dto.Id == sharedSeriesChaptersPerson.Id).SeriesCount);
|
||||
// 2 series with each 2 chapters
|
||||
Assert.Equal(4, restrictedAccessPeople.First(dto => dto.Id == sharedSeriesChaptersPerson.Id).ChapterCount);
|
||||
// 2 series in lib1
|
||||
Assert.Equal(2, restrictedAccessPeople.First(dto => dto.Id == lib1SeriesPerson.Id).SeriesCount);
|
||||
|
||||
var restrictedAgeAccessPeople = await UnitOfWork.PersonRepository.GetBrowsePersonDtos(_restrictedAgeAccess.Id,
|
||||
new BrowsePersonFilterDto(), new UserParams());
|
||||
|
||||
// Note: There is a potential bug here where a person in a different chapter of an age restricted series will show up
|
||||
Assert.Equal(6, restrictedAgeAccessPeople.TotalCount);
|
||||
|
||||
// No access to the age restricted chapter
|
||||
Assert.DoesNotContain(restrictedAgeAccessPeople, ContainsPersonCheck(lib1ChapterAgePerson));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetRolesForPersonByName()
|
||||
{
|
||||
await ResetDb();
|
||||
await SeedDb();
|
||||
|
||||
var sharedSeriesPerson = GetPersonByName("Shared Series Person");
|
||||
var sharedChaptersPerson = GetPersonByName("Shared Chapters Person");
|
||||
var lib1ChapterAgePerson = GetPersonByName("Lib1 Chapter Age Person");
|
||||
|
||||
var sharedSeriesRoles = await UnitOfWork.PersonRepository.GetRolesForPersonByName(sharedSeriesPerson.Id, _fullAccess.Id);
|
||||
var chapterRoles = await UnitOfWork.PersonRepository.GetRolesForPersonByName(sharedChaptersPerson.Id, _fullAccess.Id);
|
||||
var ageChapterRoles = await UnitOfWork.PersonRepository.GetRolesForPersonByName(lib1ChapterAgePerson.Id, _fullAccess.Id);
|
||||
Assert.Equal(3, sharedSeriesRoles.Count());
|
||||
Assert.Equal(6, chapterRoles.Count());
|
||||
Assert.Single(ageChapterRoles);
|
||||
|
||||
var restrictedRoles = await UnitOfWork.PersonRepository.GetRolesForPersonByName(sharedSeriesPerson.Id, _restrictedAccess.Id);
|
||||
var restrictedChapterRoles = await UnitOfWork.PersonRepository.GetRolesForPersonByName(sharedChaptersPerson.Id, _restrictedAccess.Id);
|
||||
var restrictedAgePersonChapterRoles = await UnitOfWork.PersonRepository.GetRolesForPersonByName(lib1ChapterAgePerson.Id, _restrictedAccess.Id);
|
||||
Assert.Equal(2, restrictedRoles.Count());
|
||||
Assert.Equal(4, restrictedChapterRoles.Count());
|
||||
Assert.Single(restrictedAgePersonChapterRoles);
|
||||
|
||||
var restrictedAgeRoles = await UnitOfWork.PersonRepository.GetRolesForPersonByName(sharedSeriesPerson.Id, _restrictedAgeAccess.Id);
|
||||
var restrictedAgeChapterRoles = await UnitOfWork.PersonRepository.GetRolesForPersonByName(sharedChaptersPerson.Id, _restrictedAgeAccess.Id);
|
||||
var restrictedAgeAgePersonChapterRoles = await UnitOfWork.PersonRepository.GetRolesForPersonByName(lib1ChapterAgePerson.Id, _restrictedAgeAccess.Id);
|
||||
Assert.Single(restrictedAgeRoles);
|
||||
Assert.Equal(2, restrictedAgeChapterRoles.Count());
|
||||
// Note: There is a potential bug here where a person in a different chapter of an age restricted series will show up
|
||||
Assert.Empty(restrictedAgeAgePersonChapterRoles);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetPersonDtoByName()
|
||||
{
|
||||
await ResetDb();
|
||||
await SeedDb();
|
||||
|
||||
var allPeople = Context.Person.ToList();
|
||||
|
||||
foreach (var person in allPeople)
|
||||
{
|
||||
Assert.NotNull(await UnitOfWork.PersonRepository.GetPersonDtoByName(person.Name, _fullAccess.Id));
|
||||
}
|
||||
|
||||
Assert.Null(await UnitOfWork.PersonRepository.GetPersonDtoByName("Lib0 Chapters Person", _restrictedAccess.Id));
|
||||
Assert.NotNull(await UnitOfWork.PersonRepository.GetPersonDtoByName("Shared Series Person", _restrictedAccess.Id));
|
||||
Assert.NotNull(await UnitOfWork.PersonRepository.GetPersonDtoByName("Lib1 Series Person", _restrictedAccess.Id));
|
||||
|
||||
Assert.Null(await UnitOfWork.PersonRepository.GetPersonDtoByName("Lib0 Chapters Person", _restrictedAgeAccess.Id));
|
||||
Assert.NotNull(await UnitOfWork.PersonRepository.GetPersonDtoByName("Lib1 Series Person", _restrictedAgeAccess.Id));
|
||||
// Note: There is a potential bug here where a person in a different chapter of an age restricted series will show up
|
||||
Assert.Null(await UnitOfWork.PersonRepository.GetPersonDtoByName("Lib1 Chapter Age Person", _restrictedAgeAccess.Id));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetSeriesKnownFor()
|
||||
{
|
||||
await ResetDb();
|
||||
await SeedDb();
|
||||
|
||||
var sharedSeriesPerson = GetPersonByName("Shared Series Person");
|
||||
var lib1SeriesPerson = GetPersonByName("Lib1 Series Person");
|
||||
|
||||
var series = await UnitOfWork.PersonRepository.GetSeriesKnownFor(sharedSeriesPerson.Id, _fullAccess.Id);
|
||||
Assert.Equal(3, series.Count());
|
||||
|
||||
series = await UnitOfWork.PersonRepository.GetSeriesKnownFor(sharedSeriesPerson.Id, _restrictedAccess.Id);
|
||||
Assert.Equal(2, series.Count());
|
||||
|
||||
series = await UnitOfWork.PersonRepository.GetSeriesKnownFor(sharedSeriesPerson.Id, _restrictedAgeAccess.Id);
|
||||
Assert.Single(series);
|
||||
|
||||
series = await UnitOfWork.PersonRepository.GetSeriesKnownFor(lib1SeriesPerson.Id, _restrictedAgeAccess.Id);
|
||||
Assert.Single(series);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetChaptersForPersonByRole()
|
||||
{
|
||||
await ResetDb();
|
||||
await SeedDb();
|
||||
|
||||
var sharedChaptersPerson = GetPersonByName("Shared Chapters Person");
|
||||
|
||||
// Lib0
|
||||
var chapters = await UnitOfWork.PersonRepository.GetChaptersForPersonByRole(sharedChaptersPerson.Id, _fullAccess.Id, PersonRole.Colorist);
|
||||
var restrictedChapters = await UnitOfWork.PersonRepository.GetChaptersForPersonByRole(sharedChaptersPerson.Id, _restrictedAccess.Id, PersonRole.Colorist);
|
||||
var restrictedAgeChapters = await UnitOfWork.PersonRepository.GetChaptersForPersonByRole(sharedChaptersPerson.Id, _restrictedAgeAccess.Id, PersonRole.Colorist);
|
||||
Assert.Single(chapters);
|
||||
Assert.Empty(restrictedChapters);
|
||||
Assert.Empty(restrictedAgeChapters);
|
||||
|
||||
// Lib1 - age restricted series
|
||||
chapters = await UnitOfWork.PersonRepository.GetChaptersForPersonByRole(sharedChaptersPerson.Id, _fullAccess.Id, PersonRole.Imprint);
|
||||
restrictedChapters = await UnitOfWork.PersonRepository.GetChaptersForPersonByRole(sharedChaptersPerson.Id, _restrictedAccess.Id, PersonRole.Imprint);
|
||||
restrictedAgeChapters = await UnitOfWork.PersonRepository.GetChaptersForPersonByRole(sharedChaptersPerson.Id, _restrictedAgeAccess.Id, PersonRole.Imprint);
|
||||
Assert.Single(chapters);
|
||||
Assert.Single(restrictedChapters);
|
||||
Assert.Empty(restrictedAgeChapters);
|
||||
|
||||
// Lib1 - not age restricted series
|
||||
chapters = await UnitOfWork.PersonRepository.GetChaptersForPersonByRole(sharedChaptersPerson.Id, _fullAccess.Id, PersonRole.Team);
|
||||
restrictedChapters = await UnitOfWork.PersonRepository.GetChaptersForPersonByRole(sharedChaptersPerson.Id, _restrictedAccess.Id, PersonRole.Team);
|
||||
restrictedAgeChapters = await UnitOfWork.PersonRepository.GetChaptersForPersonByRole(sharedChaptersPerson.Id, _restrictedAgeAccess.Id, PersonRole.Team);
|
||||
Assert.Single(chapters);
|
||||
Assert.Single(restrictedChapters);
|
||||
Assert.Single(restrictedAgeChapters);
|
||||
}
|
||||
}
|
278
API.Tests/Repository/TagRepositoryTests.cs
Normal file
278
API.Tests/Repository/TagRepositoryTests.cs
Normal file
|
@ -0,0 +1,278 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using API.DTOs.Metadata.Browse;
|
||||
using API.Entities;
|
||||
using API.Entities.Enums;
|
||||
using API.Entities.Metadata;
|
||||
using API.Helpers;
|
||||
using API.Helpers.Builders;
|
||||
using Xunit;
|
||||
|
||||
namespace API.Tests.Repository;
|
||||
|
||||
public class TagRepositoryTests : AbstractDbTest
|
||||
{
|
||||
private AppUser _fullAccess;
|
||||
private AppUser _restrictedAccess;
|
||||
private AppUser _restrictedAgeAccess;
|
||||
|
||||
protected override async Task ResetDb()
|
||||
{
|
||||
Context.Tag.RemoveRange(Context.Tag);
|
||||
Context.Library.RemoveRange(Context.Library);
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private TestTagSet CreateTestTags()
|
||||
{
|
||||
return new TestTagSet
|
||||
{
|
||||
SharedSeriesChaptersTag = new TagBuilder("Shared Series Chapter Tag").Build(),
|
||||
SharedSeriesTag = new TagBuilder("Shared Series Tag").Build(),
|
||||
SharedChaptersTag = new TagBuilder("Shared Chapters Tag").Build(),
|
||||
Lib0SeriesChaptersTag = new TagBuilder("Lib0 Series Chapter Tag").Build(),
|
||||
Lib0SeriesTag = new TagBuilder("Lib0 Series Tag").Build(),
|
||||
Lib0ChaptersTag = new TagBuilder("Lib0 Chapters Tag").Build(),
|
||||
Lib1SeriesChaptersTag = new TagBuilder("Lib1 Series Chapter Tag").Build(),
|
||||
Lib1SeriesTag = new TagBuilder("Lib1 Series Tag").Build(),
|
||||
Lib1ChaptersTag = new TagBuilder("Lib1 Chapters Tag").Build(),
|
||||
Lib1ChapterAgeTag = new TagBuilder("Lib1 Chapter Age Tag").Build()
|
||||
};
|
||||
}
|
||||
|
||||
private async Task SeedDbWithTags(TestTagSet tags)
|
||||
{
|
||||
await CreateTestUsers();
|
||||
await AddTagsToContext(tags);
|
||||
await CreateLibrariesWithTags(tags);
|
||||
await AssignLibrariesToUsers();
|
||||
}
|
||||
|
||||
private async Task CreateTestUsers()
|
||||
{
|
||||
_fullAccess = new AppUserBuilder("amelia", "amelia@example.com").Build();
|
||||
_restrictedAccess = new AppUserBuilder("mila", "mila@example.com").Build();
|
||||
_restrictedAgeAccess = new AppUserBuilder("eva", "eva@example.com").Build();
|
||||
_restrictedAgeAccess.AgeRestriction = AgeRating.Teen;
|
||||
_restrictedAgeAccess.AgeRestrictionIncludeUnknowns = true;
|
||||
|
||||
Context.Users.Add(_fullAccess);
|
||||
Context.Users.Add(_restrictedAccess);
|
||||
Context.Users.Add(_restrictedAgeAccess);
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private async Task AddTagsToContext(TestTagSet tags)
|
||||
{
|
||||
var allTags = tags.GetAllTags();
|
||||
Context.Tag.AddRange(allTags);
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private async Task CreateLibrariesWithTags(TestTagSet tags)
|
||||
{
|
||||
var lib0 = new LibraryBuilder("lib0")
|
||||
.WithSeries(new SeriesBuilder("lib0-s0")
|
||||
.WithMetadata(new SeriesMetadata
|
||||
{
|
||||
Tags = [tags.SharedSeriesChaptersTag, tags.SharedSeriesTag, tags.Lib0SeriesChaptersTag, tags.Lib0SeriesTag]
|
||||
})
|
||||
.WithVolume(new VolumeBuilder("1")
|
||||
.WithChapter(new ChapterBuilder("1")
|
||||
.WithTags([tags.SharedSeriesChaptersTag, tags.SharedChaptersTag, tags.Lib0SeriesChaptersTag, tags.Lib0ChaptersTag])
|
||||
.Build())
|
||||
.WithChapter(new ChapterBuilder("2")
|
||||
.WithTags([tags.SharedSeriesChaptersTag, tags.SharedChaptersTag, tags.Lib1SeriesChaptersTag, tags.Lib1ChaptersTag])
|
||||
.Build())
|
||||
.Build())
|
||||
.Build())
|
||||
.Build();
|
||||
|
||||
var lib1 = new LibraryBuilder("lib1")
|
||||
.WithSeries(new SeriesBuilder("lib1-s0")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithTags([tags.SharedSeriesChaptersTag, tags.SharedSeriesTag, tags.Lib1SeriesChaptersTag, tags.Lib1SeriesTag])
|
||||
.WithAgeRating(AgeRating.Mature17Plus)
|
||||
.Build())
|
||||
.WithVolume(new VolumeBuilder("1")
|
||||
.WithChapter(new ChapterBuilder("1")
|
||||
.WithTags([tags.SharedSeriesChaptersTag, tags.SharedChaptersTag, tags.Lib1SeriesChaptersTag, tags.Lib1ChaptersTag])
|
||||
.Build())
|
||||
.WithChapter(new ChapterBuilder("2")
|
||||
.WithTags([tags.SharedSeriesChaptersTag, tags.SharedChaptersTag, tags.Lib1SeriesChaptersTag, tags.Lib1ChaptersTag, tags.Lib1ChapterAgeTag])
|
||||
.WithAgeRating(AgeRating.Mature17Plus)
|
||||
.Build())
|
||||
.Build())
|
||||
.Build())
|
||||
.WithSeries(new SeriesBuilder("lib1-s1")
|
||||
.WithMetadata(new SeriesMetadataBuilder()
|
||||
.WithTags([tags.SharedSeriesChaptersTag, tags.SharedSeriesTag, tags.Lib1SeriesChaptersTag, tags.Lib1SeriesTag])
|
||||
.Build())
|
||||
.WithVolume(new VolumeBuilder("1")
|
||||
.WithChapter(new ChapterBuilder("1")
|
||||
.WithTags([tags.SharedSeriesChaptersTag, tags.SharedChaptersTag, tags.Lib1SeriesChaptersTag, tags.Lib1ChaptersTag])
|
||||
.Build())
|
||||
.WithChapter(new ChapterBuilder("2")
|
||||
.WithTags([tags.SharedSeriesChaptersTag, tags.SharedChaptersTag, tags.Lib1SeriesChaptersTag, tags.Lib1ChaptersTag])
|
||||
.WithAgeRating(AgeRating.Mature17Plus)
|
||||
.Build())
|
||||
.Build())
|
||||
.Build())
|
||||
.Build();
|
||||
|
||||
Context.Library.Add(lib0);
|
||||
Context.Library.Add(lib1);
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private async Task AssignLibrariesToUsers()
|
||||
{
|
||||
var lib0 = Context.Library.First(l => l.Name == "lib0");
|
||||
var lib1 = Context.Library.First(l => l.Name == "lib1");
|
||||
|
||||
_fullAccess.Libraries.Add(lib0);
|
||||
_fullAccess.Libraries.Add(lib1);
|
||||
_restrictedAccess.Libraries.Add(lib1);
|
||||
_restrictedAgeAccess.Libraries.Add(lib1);
|
||||
|
||||
await Context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private static Predicate<BrowseTagDto> ContainsTagCheck(Tag tag)
|
||||
{
|
||||
return t => t.Id == tag.Id;
|
||||
}
|
||||
|
||||
private static void AssertTagPresent(IEnumerable<BrowseTagDto> tags, Tag expectedTag)
|
||||
{
|
||||
Assert.Contains(tags, ContainsTagCheck(expectedTag));
|
||||
}
|
||||
|
||||
private static void AssertTagNotPresent(IEnumerable<BrowseTagDto> tags, Tag expectedTag)
|
||||
{
|
||||
Assert.DoesNotContain(tags, ContainsTagCheck(expectedTag));
|
||||
}
|
||||
|
||||
private static BrowseTagDto GetTagDto(IEnumerable<BrowseTagDto> tags, Tag tag)
|
||||
{
|
||||
return tags.First(dto => dto.Id == tag.Id);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetBrowseableTag_FullAccess_ReturnsAllTagsWithCorrectCounts()
|
||||
{
|
||||
// Arrange
|
||||
await ResetDb();
|
||||
var tags = CreateTestTags();
|
||||
await SeedDbWithTags(tags);
|
||||
|
||||
// Act
|
||||
var fullAccessTags = await UnitOfWork.TagRepository.GetBrowseableTag(_fullAccess.Id, new UserParams());
|
||||
|
||||
// Assert
|
||||
Assert.Equal(tags.GetAllTags().Count, fullAccessTags.TotalCount);
|
||||
|
||||
foreach (var tag in tags.GetAllTags())
|
||||
{
|
||||
AssertTagPresent(fullAccessTags, tag);
|
||||
}
|
||||
|
||||
// Verify counts - 1 series lib0, 2 series lib1 = 3 total series
|
||||
Assert.Equal(3, GetTagDto(fullAccessTags, tags.SharedSeriesChaptersTag).SeriesCount);
|
||||
Assert.Equal(6, GetTagDto(fullAccessTags, tags.SharedSeriesChaptersTag).ChapterCount);
|
||||
Assert.Equal(1, GetTagDto(fullAccessTags, tags.Lib0SeriesTag).SeriesCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetBrowseableTag_RestrictedAccess_ReturnsOnlyAccessibleTags()
|
||||
{
|
||||
// Arrange
|
||||
await ResetDb();
|
||||
var tags = CreateTestTags();
|
||||
await SeedDbWithTags(tags);
|
||||
|
||||
// Act
|
||||
var restrictedAccessTags = await UnitOfWork.TagRepository.GetBrowseableTag(_restrictedAccess.Id, new UserParams());
|
||||
|
||||
// Assert - Should see: 3 shared + 4 library 1 specific = 7 tags
|
||||
Assert.Equal(7, restrictedAccessTags.TotalCount);
|
||||
|
||||
// Verify shared and Library 1 tags are present
|
||||
AssertTagPresent(restrictedAccessTags, tags.SharedSeriesChaptersTag);
|
||||
AssertTagPresent(restrictedAccessTags, tags.SharedSeriesTag);
|
||||
AssertTagPresent(restrictedAccessTags, tags.SharedChaptersTag);
|
||||
AssertTagPresent(restrictedAccessTags, tags.Lib1SeriesChaptersTag);
|
||||
AssertTagPresent(restrictedAccessTags, tags.Lib1SeriesTag);
|
||||
AssertTagPresent(restrictedAccessTags, tags.Lib1ChaptersTag);
|
||||
AssertTagPresent(restrictedAccessTags, tags.Lib1ChapterAgeTag);
|
||||
|
||||
// Verify Library 0 specific tags are not present
|
||||
AssertTagNotPresent(restrictedAccessTags, tags.Lib0SeriesChaptersTag);
|
||||
AssertTagNotPresent(restrictedAccessTags, tags.Lib0SeriesTag);
|
||||
AssertTagNotPresent(restrictedAccessTags, tags.Lib0ChaptersTag);
|
||||
|
||||
// Verify counts - 2 series lib1
|
||||
Assert.Equal(2, GetTagDto(restrictedAccessTags, tags.SharedSeriesChaptersTag).SeriesCount);
|
||||
Assert.Equal(4, GetTagDto(restrictedAccessTags, tags.SharedSeriesChaptersTag).ChapterCount);
|
||||
Assert.Equal(2, GetTagDto(restrictedAccessTags, tags.Lib1SeriesTag).SeriesCount);
|
||||
Assert.Equal(4, GetTagDto(restrictedAccessTags, tags.Lib1ChaptersTag).ChapterCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetBrowseableTag_RestrictedAgeAccess_FiltersAgeRestrictedContent()
|
||||
{
|
||||
// Arrange
|
||||
await ResetDb();
|
||||
var tags = CreateTestTags();
|
||||
await SeedDbWithTags(tags);
|
||||
|
||||
// Act
|
||||
var restrictedAgeAccessTags = await UnitOfWork.TagRepository.GetBrowseableTag(_restrictedAgeAccess.Id, new UserParams());
|
||||
|
||||
// Assert - Should see: 3 shared + 3 lib1 specific = 6 tags (age-restricted tag filtered out)
|
||||
Assert.Equal(6, restrictedAgeAccessTags.TotalCount);
|
||||
|
||||
// Verify accessible tags are present
|
||||
AssertTagPresent(restrictedAgeAccessTags, tags.SharedSeriesChaptersTag);
|
||||
AssertTagPresent(restrictedAgeAccessTags, tags.SharedSeriesTag);
|
||||
AssertTagPresent(restrictedAgeAccessTags, tags.SharedChaptersTag);
|
||||
AssertTagPresent(restrictedAgeAccessTags, tags.Lib1SeriesChaptersTag);
|
||||
AssertTagPresent(restrictedAgeAccessTags, tags.Lib1SeriesTag);
|
||||
AssertTagPresent(restrictedAgeAccessTags, tags.Lib1ChaptersTag);
|
||||
|
||||
// Verify age-restricted tag is filtered out
|
||||
AssertTagNotPresent(restrictedAgeAccessTags, tags.Lib1ChapterAgeTag);
|
||||
|
||||
// Verify counts - 1 series lib1 (age-restricted series filtered out)
|
||||
Assert.Equal(1, GetTagDto(restrictedAgeAccessTags, tags.SharedSeriesChaptersTag).SeriesCount);
|
||||
Assert.Equal(2, GetTagDto(restrictedAgeAccessTags, tags.SharedSeriesChaptersTag).ChapterCount);
|
||||
Assert.Equal(1, GetTagDto(restrictedAgeAccessTags, tags.Lib1SeriesTag).SeriesCount);
|
||||
Assert.Equal(2, GetTagDto(restrictedAgeAccessTags, tags.Lib1ChaptersTag).ChapterCount);
|
||||
}
|
||||
|
||||
private class TestTagSet
|
||||
{
|
||||
public Tag SharedSeriesChaptersTag { get; set; }
|
||||
public Tag SharedSeriesTag { get; set; }
|
||||
public Tag SharedChaptersTag { get; set; }
|
||||
public Tag Lib0SeriesChaptersTag { get; set; }
|
||||
public Tag Lib0SeriesTag { get; set; }
|
||||
public Tag Lib0ChaptersTag { get; set; }
|
||||
public Tag Lib1SeriesChaptersTag { get; set; }
|
||||
public Tag Lib1SeriesTag { get; set; }
|
||||
public Tag Lib1ChaptersTag { get; set; }
|
||||
public Tag Lib1ChapterAgeTag { get; set; }
|
||||
|
||||
public List<Tag> GetAllTags()
|
||||
{
|
||||
return
|
||||
[
|
||||
SharedSeriesChaptersTag, SharedSeriesTag, SharedChaptersTag,
|
||||
Lib0SeriesChaptersTag, Lib0SeriesTag, Lib0ChaptersTag,
|
||||
Lib1SeriesChaptersTag, Lib1SeriesTag, Lib1ChaptersTag, Lib1ChapterAgeTag
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue