mirror of
				https://github.com/Kareadita/Kavita.git
				synced 2025-10-27 00:32:29 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			679 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			679 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using API.Data.Misc;
 | |
| using API.Entities;
 | |
| using API.Entities.Enums;
 | |
| using API.Entities.Metadata;
 | |
| using API.Entities.Person;
 | |
| using API.Extensions.QueryExtensions;
 | |
| using API.Helpers.Builders;
 | |
| using Xunit;
 | |
| 
 | |
| namespace API.Tests.Extensions;
 | |
| 
 | |
| public class QueryableExtensionsTests
 | |
| {
 | |
|     [Theory]
 | |
|     [InlineData(true, 2)]
 | |
|     [InlineData(false, 1)]
 | |
|     public void RestrictAgainstAgeRestriction_Series_ShouldRestrictEverythingAboveTeen(bool includeUnknowns,
 | |
|         int expectedCount)
 | |
|     {
 | |
|         var items = new List<Series>
 | |
|         {
 | |
|             new SeriesBuilder("Test 1")
 | |
|                 .WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build())
 | |
|                 .Build(),
 | |
|             new SeriesBuilder("Test 2")
 | |
|                 .WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Unknown).Build())
 | |
|                 .Build(),
 | |
|             new SeriesBuilder("Test 3")
 | |
|                 .WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.X18Plus).Build())
 | |
|                 .Build()
 | |
|         };
 | |
| 
 | |
|         var filtered = items.AsQueryable().RestrictAgainstAgeRestriction(new AgeRestriction
 | |
|         {
 | |
|             AgeRating = AgeRating.Teen,
 | |
|             IncludeUnknowns = includeUnknowns
 | |
|         });
 | |
|         Assert.Equal(expectedCount, filtered.Count());
 | |
|     }
 | |
| 
 | |
|     [Theory]
 | |
|     [InlineData(true, 2)]
 | |
|     [InlineData(false, 1)]
 | |
|     public void RestrictAgainstAgeRestriction_CollectionTag_ShouldRestrictEverythingAboveTeen(bool includeUnknowns,
 | |
|         int expectedCount)
 | |
|     {
 | |
|         var items = new List<AppUserCollection>
 | |
|         {
 | |
|             new AppUserCollectionBuilder("Test")
 | |
|                 .WithItem(new SeriesBuilder("S1")
 | |
|                     .WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build()).Build())
 | |
|                 .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 AppUserCollectionBuilder("Test 3")
 | |
|                 .WithItem(new SeriesBuilder("S3")
 | |
|                     .WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.X18Plus).Build()).Build())
 | |
|                 .Build()
 | |
|         };
 | |
| 
 | |
|         var filtered = items.AsQueryable().RestrictAgainstAgeRestriction(new AgeRestriction
 | |
|         {
 | |
|             AgeRating = AgeRating.Teen,
 | |
|             IncludeUnknowns = includeUnknowns
 | |
|         });
 | |
|         Assert.Equal(expectedCount, filtered.Count());
 | |
|     }
 | |
| 
 | |
|     [Theory]
 | |
|     [InlineData(true, 2)]
 | |
|     [InlineData(false, 2)]
 | |
|     public void RestrictAgainstAgeRestriction_Genre_ShouldRestrictEverythingAboveTeen(bool includeUnknowns,
 | |
|         int expectedCount)
 | |
|     {
 | |
|         var items = new List<Genre>
 | |
|         {
 | |
|             new GenreBuilder("A")
 | |
|                 .WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build())
 | |
|                 .Build(),
 | |
|             new GenreBuilder("B")
 | |
|                 .WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Unknown).Build())
 | |
|                 .WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build())
 | |
|                 .Build(),
 | |
|             new GenreBuilder("C")
 | |
|                 .WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.X18Plus).Build())
 | |
|                 .Build()
 | |
|         };
 | |
| 
 | |
|         var filtered = items.AsQueryable().RestrictAgainstAgeRestriction(new AgeRestriction
 | |
|         {
 | |
|             AgeRating = AgeRating.Teen,
 | |
|             IncludeUnknowns = includeUnknowns
 | |
|         });
 | |
|         Assert.Equal(expectedCount, filtered.Count());
 | |
|     }
 | |
| 
 | |
|     [Theory]
 | |
|     [InlineData(true, 2)]
 | |
|     [InlineData(false, 2)]
 | |
|     public void RestrictAgainstAgeRestriction_Tag_ShouldRestrictEverythingAboveTeen(bool includeUnknowns,
 | |
|         int expectedCount)
 | |
|     {
 | |
|         var items = new List<Tag>
 | |
|         {
 | |
|             new TagBuilder("Test 1")
 | |
|                 .WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build())
 | |
|                 .Build(),
 | |
|             new TagBuilder("Test 2")
 | |
|                 .WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Unknown).Build())
 | |
|                 .WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.Teen).Build())
 | |
|                 .Build(),
 | |
|             new TagBuilder("Test 3")
 | |
|                 .WithSeriesMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.X18Plus).Build())
 | |
|                 .Build()
 | |
|         };
 | |
| 
 | |
|         var filtered = items.AsQueryable().RestrictAgainstAgeRestriction(new AgeRestriction
 | |
|         {
 | |
|             AgeRating = AgeRating.Teen,
 | |
|             IncludeUnknowns = includeUnknowns
 | |
|         });
 | |
|         Assert.Equal(expectedCount, filtered.Count());
 | |
|     }
 | |
| 
 | |
|     [Theory]
 | |
|     [InlineData(true, 2)]
 | |
|     [InlineData(false, 2)]
 | |
|     public void RestrictAgainstAgeRestriction_Person_ShouldRestrictEverythingAboveTeen(bool includeUnknowns,
 | |
|         int expectedPeopleCount)
 | |
|     {
 | |
|         // Arrange
 | |
|         var items = new List<Person>
 | |
|         {
 | |
|             CreatePersonWithSeriesMetadata("Test1", AgeRating.Teen),
 | |
|             CreatePersonWithSeriesMetadata("Test2", AgeRating.Unknown,
 | |
|                 AgeRating.Teen), // 2 series on this person, restrict will still allow access
 | |
|             CreatePersonWithSeriesMetadata("Test3", AgeRating.X18Plus)
 | |
|         };
 | |
| 
 | |
|         var ageRestriction = new AgeRestriction
 | |
|         {
 | |
|             AgeRating = AgeRating.Teen,
 | |
|             IncludeUnknowns = includeUnknowns
 | |
|         };
 | |
| 
 | |
|         // Act
 | |
|         var filtered = items.AsQueryable().RestrictAgainstAgeRestriction(ageRestriction);
 | |
| 
 | |
|         // Assert
 | |
|         Assert.Equal(expectedPeopleCount, filtered.Count());
 | |
|     }
 | |
| 
 | |
|     private static Person CreatePersonWithSeriesMetadata(string name, params AgeRating[] ageRatings)
 | |
|     {
 | |
|         var person = new PersonBuilder(name).Build();
 | |
| 
 | |
|         foreach (var ageRating in ageRatings)
 | |
|         {
 | |
|             var seriesMetadata = new SeriesMetadataBuilder().WithAgeRating(ageRating).Build();
 | |
|             person.SeriesMetadataPeople.Add(new SeriesMetadataPeople
 | |
|             {
 | |
|                 SeriesMetadata = seriesMetadata,
 | |
|                 Person = person,
 | |
|                 Role = PersonRole.Character // Role is now part of the relationship
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         return person;
 | |
|     }
 | |
| 
 | |
|     [Theory]
 | |
|     [InlineData(true, 2)]
 | |
|     [InlineData(false, 1)]
 | |
|     public void RestrictAgainstAgeRestriction_ReadingList_ShouldRestrictEverythingAboveTeen(bool includeUnknowns,
 | |
|         int expectedCount)
 | |
|     {
 | |
|         var items = new List<ReadingList>
 | |
|         {
 | |
|             new ReadingListBuilder("Test List").WithRating(AgeRating.Teen).Build(),
 | |
|             new ReadingListBuilder("Test List").WithRating(AgeRating.Unknown).Build(),
 | |
|             new ReadingListBuilder("Test List").WithRating(AgeRating.X18Plus).Build()
 | |
|         };
 | |
| 
 | |
|         var filtered = items.AsQueryable().RestrictAgainstAgeRestriction(new AgeRestriction
 | |
|         {
 | |
|             AgeRating = AgeRating.Teen,
 | |
|             IncludeUnknowns = includeUnknowns
 | |
|         });
 | |
|         Assert.Equal(expectedCount, filtered.Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_SocialLibs()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(2, [1], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(3, [], AgeRating.NotApplicable, true, false, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.Unknown),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Unknown),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 2, AgeRating.Unknown),
 | |
|             CreateAnnotationInLibraryWithAgeRating(3, 1, AgeRating.Unknown),
 | |
|             CreateAnnotationInLibraryWithAgeRating(3, 1, AgeRating.Unknown)
 | |
|         ];
 | |
| 
 | |
|         // Own annotation, and the other in lib 1
 | |
|         Assert.Equal(2, annotations.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
| 
 | |
|         // Own annotations, and from user 1 in lib 1
 | |
|         Assert.Equal(3, annotations.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
| 
 | |
|         // Own annotations, and user 1 in lib 1 and user 2 in lib 1
 | |
|         Assert.Equal(4, annotations.AsQueryable().RestrictBySocialPreferences(3, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Theory]
 | |
|     [InlineData(true, 4, 3)]
 | |
|     [InlineData(false, 3, 2)]
 | |
|     public void RestrictBySocialPreferences_AgeRating(bool includeUnknowns, int expected1, int expected2)
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(2, [], AgeRating.Mature, includeUnknowns, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.AdultsOnly),
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.Unknown),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Unknown)
 | |
|         ];
 | |
| 
 | |
|         Assert.Equal(expected1, annotations.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|         Assert.Equal(expected2, annotations.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_UserNotSharingAnnotations()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, false, true), // User 1 NOT sharing
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Everyone)
 | |
|         ];
 | |
| 
 | |
|         // User 2 should only see their own annotation since User 1 is not sharing
 | |
|         Assert.Equal(1, annotations.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
| 
 | |
|         // User 1 should see both (own + user 2's shared)
 | |
|         Assert.Equal(2, annotations.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_UserNotViewingOtherAnnotations()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, true, false), // User 1 NOT viewing others
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Everyone)
 | |
|         ];
 | |
| 
 | |
|         // User 1 should only see their own annotation (not viewing others)
 | |
|         Assert.Equal(1, annotations.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
| 
 | |
|         // User 2 should see both
 | |
|         Assert.Equal(2, annotations.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_RequestingUserLibraryFilter()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [1], AgeRating.NotApplicable, true, true, true), // User 1 only wants lib 1
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 2, AgeRating.Everyone), // User 1's own in lib 2
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 2, AgeRating.Everyone)
 | |
|         ];
 | |
| 
 | |
|         // User 1 should see: own (always) + user 2's in lib 1 only = 3
 | |
|         Assert.Equal(3, annotations.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_RequestingUserAgeRatingFilter()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.Teen, false, true, true), // User 1 wants Teen max, no unknowns
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.AdultsOnly), // User 1's own - always included
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.AdultsOnly),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Teen),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Unknown)
 | |
|         ];
 | |
| 
 | |
|         // User 1 should see: own (1) + user 2's Teen (1) = 2
 | |
|         Assert.Equal(2, annotations.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_CombinedLibraryAndAgeRatingFilters()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(2, [1], AgeRating.Teen, true, true,
 | |
|                 true) // User 2: lib 1 only + Teen max + unknowns ok
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 2, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.AdultsOnly),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Teen),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 2, AgeRating.Everyone) // User 2's own in lib 2
 | |
|         ];
 | |
| 
 | |
|         // User 2 should see:
 | |
|         // - Own annotations (always): 2
 | |
|         // - User 1's in lib 1 with age <= Teen: 1 (Everyone)
 | |
|         // Total: 3
 | |
|         Assert.Equal(3, annotations.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_MultipleUsersWithDifferentLibraryRestrictions()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(2, [1], AgeRating.NotApplicable, true, true, true), // User 2 shares lib 1 only
 | |
|             CreateUserPreferences(3, [2], AgeRating.NotApplicable, true, true, true) // User 3 shares lib 2 only
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 2, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(3, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(3, 2, AgeRating.Everyone)
 | |
|         ];
 | |
| 
 | |
|         // User 1 should see: own (1) + user 2 lib 1 (1) + user 3 lib 2 (1) = 3
 | |
|         Assert.Equal(3, annotations.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_NoOtherUsersSharing()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, false, true),
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, false, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Everyone)
 | |
|         ];
 | |
| 
 | |
|         // Each user should only see their own
 | |
|         Assert.Equal(1, annotations.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|         Assert.Equal(1, annotations.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Theory]
 | |
|     [InlineData(AgeRating.Everyone, true, 3)]
 | |
|     [InlineData(AgeRating.Everyone, false, 2)]
 | |
|     [InlineData(AgeRating.Teen, true, 4)]
 | |
|     [InlineData(AgeRating.Mature17Plus, false, 3)]
 | |
|     public void RestrictBySocialPreferences_RequestingUserAgeRatingVariations(AgeRating maxRating, bool includeUnknowns,
 | |
|         int expected)
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], maxRating, includeUnknowns, true, true),
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserAnnotation> annotations =
 | |
|         [
 | |
|             CreateAnnotationInLibraryWithAgeRating(1, 1, AgeRating.AdultsOnly), // Own - always included
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Everyone),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Teen),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Mature),
 | |
|             CreateAnnotationInLibraryWithAgeRating(2, 1, AgeRating.Unknown)
 | |
|         ];
 | |
| 
 | |
|         Assert.Equal(expected, annotations.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     private static AppUserPreferences CreateUserPreferences(int user, IList<int> libs, AgeRating ageRating,
 | |
|         bool includeUnknowns, bool share, bool seeAn)
 | |
|     {
 | |
|         return new AppUserPreferences
 | |
|         {
 | |
|             AppUserId = user,
 | |
|             Theme = null,
 | |
|             SocialPreferences = new AppUserSocialPreferences
 | |
|             {
 | |
|                 ShareReviews = share,
 | |
|                 ShareAnnotations = share,
 | |
|                 ViewOtherAnnotations = seeAn,
 | |
|                 SocialLibraries = libs,
 | |
|                 SocialMaxAgeRating = ageRating,
 | |
|                 SocialIncludeUnknowns = includeUnknowns
 | |
|             }
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     private static AppUserAnnotation CreateAnnotationInLibraryWithAgeRating(int user, int lib, AgeRating ageRating)
 | |
|     {
 | |
|         return new AppUserAnnotation
 | |
|         {
 | |
|             XPath = null,
 | |
|             LibraryId = lib,
 | |
|             SeriesId = 0,
 | |
|             VolumeId = 0,
 | |
|             ChapterId = 0,
 | |
|             AppUserId = user,
 | |
|             Series = new Series
 | |
|             {
 | |
|                 Name = null,
 | |
|                 NormalizedName = null,
 | |
|                 NormalizedLocalizedName = null,
 | |
|                 SortName = null,
 | |
|                 LocalizedName = null,
 | |
|                 OriginalName = null,
 | |
|                 Metadata = new SeriesMetadata
 | |
|                 {
 | |
|                     AgeRating = ageRating
 | |
|                 }
 | |
|             }
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_Rating_SocialLibs()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(2, [1], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(3, [], AgeRating.NotApplicable, true, false, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserRating> ratings =
 | |
|         [
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.Unknown),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Unknown),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 2, AgeRating.Unknown),
 | |
|             CreateRatingInLibraryWithAgeRating(3, 1, AgeRating.Unknown),
 | |
|             CreateRatingInLibraryWithAgeRating(3, 1, AgeRating.Unknown)
 | |
|         ];
 | |
| 
 | |
|         // Own rating, and the other in lib 1
 | |
|         Assert.Equal(2, ratings.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
| 
 | |
|         // Own ratings, and from user 1 in lib 1
 | |
|         Assert.Equal(3, ratings.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
| 
 | |
|         // Own ratings, and user 1 in lib 1 and user 2 in lib 1
 | |
|         Assert.Equal(4, ratings.AsQueryable().RestrictBySocialPreferences(3, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Theory]
 | |
|     [InlineData(true, 4, 3)]
 | |
|     [InlineData(false, 3, 2)]
 | |
|     public void RestrictBySocialPreferences_Rating_AgeRating(bool includeUnknowns, int expected1, int expected2)
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(2, [], AgeRating.Mature, includeUnknowns, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserRating> ratings =
 | |
|         [
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.AdultsOnly),
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.Unknown),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Unknown)
 | |
|         ];
 | |
| 
 | |
|         var f = ratings.AsQueryable().RestrictBySocialPreferences(1, userPreferences);
 | |
|         Assert.Equal(expected1, ratings.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|         Assert.Equal(expected2, ratings.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_Rating_UserNotSharingReviews()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, false, true),
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserRating> ratings =
 | |
|         [
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Everyone)
 | |
|         ];
 | |
| 
 | |
|         Assert.Equal(1, ratings.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
|         Assert.Equal(2, ratings.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_Rating_RequestingUserLibraryFilter()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [1], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserRating> ratings =
 | |
|         [
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(1, 2, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 2, AgeRating.Everyone)
 | |
|         ];
 | |
| 
 | |
|         Assert.Equal(3, ratings.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_Rating_RequestingUserAgeRatingFilter()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.Teen, false, true, true),
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserRating> ratings =
 | |
|         [
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.AdultsOnly),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.AdultsOnly),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Teen),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Unknown)
 | |
|         ];
 | |
| 
 | |
|         Assert.Equal(2, ratings.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_Rating_CombinedFilters()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(2, [1], AgeRating.Teen, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserRating> ratings =
 | |
|         [
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(1, 2, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.AdultsOnly),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Teen),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 2, AgeRating.Everyone)
 | |
|         ];
 | |
| 
 | |
|         Assert.Equal(3, ratings.AsQueryable().RestrictBySocialPreferences(2, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Fact]
 | |
|     public void RestrictBySocialPreferences_Rating_MultipleUsersWithDifferentLibraryRestrictions()
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(2, [1], AgeRating.NotApplicable, true, true, true),
 | |
|             CreateUserPreferences(3, [2], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserRating> ratings =
 | |
|         [
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 2, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(3, 1, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(3, 2, AgeRating.Everyone)
 | |
|         ];
 | |
| 
 | |
|         Assert.Equal(3, ratings.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     [Theory]
 | |
|     [InlineData(AgeRating.Everyone, true, 3)]
 | |
|     [InlineData(AgeRating.Everyone, false, 2)]
 | |
|     [InlineData(AgeRating.Teen, true, 4)]
 | |
|     [InlineData(AgeRating.Mature17Plus, false, 3)]
 | |
|     public void RestrictBySocialPreferences_Rating_RequestingUserAgeRatingVariations(AgeRating maxRating,
 | |
|         bool includeUnknowns, int expected)
 | |
|     {
 | |
|         IList<AppUserPreferences> userPreferences =
 | |
|         [
 | |
|             CreateUserPreferences(1, [], maxRating, includeUnknowns, true, true),
 | |
|             CreateUserPreferences(2, [], AgeRating.NotApplicable, true, true, true)
 | |
|         ];
 | |
| 
 | |
|         IList<AppUserRating> ratings =
 | |
|         [
 | |
|             CreateRatingInLibraryWithAgeRating(1, 1, AgeRating.AdultsOnly),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Everyone),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Teen),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Mature),
 | |
|             CreateRatingInLibraryWithAgeRating(2, 1, AgeRating.Unknown)
 | |
|         ];
 | |
| 
 | |
|         Assert.Equal(expected, ratings.AsQueryable().RestrictBySocialPreferences(1, userPreferences).Count());
 | |
|     }
 | |
| 
 | |
|     private static AppUserRating CreateRatingInLibraryWithAgeRating(int user, int lib, AgeRating ageRating)
 | |
|     {
 | |
|         return new AppUserRating
 | |
|         {
 | |
|             AppUserId = user,
 | |
|             Series = new Series
 | |
|             {
 | |
|                 Name = null,
 | |
|                 NormalizedName = null,
 | |
|                 NormalizedLocalizedName = null,
 | |
|                 SortName = null,
 | |
|                 LocalizedName = null,
 | |
|                 OriginalName = null,
 | |
|                 LibraryId = lib,
 | |
|                 Metadata = new SeriesMetadata
 | |
|                 {
 | |
|                     AgeRating = ageRating
 | |
|                 }
 | |
|             }
 | |
|         };
 | |
|     }
 | |
| }
 |