diff options
Diffstat (limited to 'tests/Jellyfin.Api.Tests/Controllers/ItemUpdateControllerTests.cs')
| -rw-r--r-- | tests/Jellyfin.Api.Tests/Controllers/ItemUpdateControllerTests.cs | 82 |
1 files changed, 81 insertions, 1 deletions
diff --git a/tests/Jellyfin.Api.Tests/Controllers/ItemUpdateControllerTests.cs b/tests/Jellyfin.Api.Tests/Controllers/ItemUpdateControllerTests.cs index 1a91efe4f2..7b37550e29 100644 --- a/tests/Jellyfin.Api.Tests/Controllers/ItemUpdateControllerTests.cs +++ b/tests/Jellyfin.Api.Tests/Controllers/ItemUpdateControllerTests.cs @@ -4,9 +4,11 @@ using Jellyfin.Api.Controllers; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Globalization; using MediaBrowser.Model.IO; using Moq; @@ -14,12 +16,21 @@ using Xunit; namespace Jellyfin.Api.Tests.Controllers; -public class ItemUpdateControllerTests +[Collection("LibraryManagerTests")] +public sealed class ItemUpdateControllerTests : IDisposable { private readonly ItemUpdateController _subject; + private readonly ILibraryManager? _previousLibraryManager; + private readonly ILocalizationManager? _previousLocalizationManager; public ItemUpdateControllerTests() { + // Children are scored and saved through BaseItem's process-wide statics; restored in Dispose. + _previousLibraryManager = BaseItem.LibraryManager; + _previousLocalizationManager = BaseItem.LocalizationManager; + BaseItem.LibraryManager = Mock.Of<ILibraryManager>(); + BaseItem.LocalizationManager = Mock.Of<ILocalizationManager>(); + _subject = new ItemUpdateController( Mock.Of<IFileSystem>(), Mock.Of<ILibraryManager>(), @@ -70,6 +81,75 @@ public class ItemUpdateControllerTests Assert.Equal("tt1234567", movie.ProviderIds["Imdb"]); } + public void Dispose() + { + BaseItem.LibraryManager = _previousLibraryManager!; + BaseItem.LocalizationManager = _previousLocalizationManager!; + } + + [Fact] + public async Task UpdateItem_SeriesRatingUnchanged_KeepsEpisodeRatings() + { + // Regression test for https://github.com/jellyfin/jellyfin/issues/18241 + var (series, season, episodes) = CreateSeries("TV-PG", "TV-PG", "TV-14", null); + + await InvokeUpdateItem(new BaseItemDto { Overview = "New overview", OfficialRating = "TV-PG" }, series); + + Assert.Equal("TV-PG", season.OfficialRating); + Assert.Equal("TV-14", episodes[1].OfficialRating); + Assert.Null(episodes[2].OfficialRating); + } + + [Fact] + public async Task UpdateItem_SeriesRatingChanged_PropagatesOnlyToChildrenFollowingIt() + { + var (series, season, episodes) = CreateSeries("TV-PG", "TV-PG", "TV-14", null); + var locked = new Episode { OfficialRating = "TV-PG", PreferredMetadataCountryCode = "us", LockedFields = [MetadataField.OfficialRating] }; + season.Children = [.. episodes, locked]; + + await InvokeUpdateItem(new BaseItemDto { OfficialRating = "TV-MA" }, series); + + Assert.Equal("TV-MA", season.OfficialRating); + Assert.Equal("TV-MA", episodes[0].OfficialRating); + Assert.Equal("TV-14", episodes[1].OfficialRating); + Assert.Equal("TV-MA", episodes[2].OfficialRating); + Assert.Equal("TV-PG", locked.OfficialRating); + } + + [Fact] + public async Task UpdateItem_SeriesCustomRatingChanged_PropagatesIt() + { + var (series, season, episodes) = CreateSeries("TV-PG", "TV-PG", "TV-14", null); + episodes[0].CustomRating = "TV-Y"; + + await InvokeUpdateItem(new BaseItemDto { OfficialRating = "TV-PG", CustomRating = "XXX" }, series); + + Assert.Equal("XXX", season.CustomRating); + Assert.Equal("TV-Y", episodes[0].CustomRating); + Assert.Equal("XXX", episodes[1].CustomRating); + Assert.Equal("TV-14", episodes[1].OfficialRating); + } + + [Fact] + public async Task UpdateItem_SeasonRatingChanged_KeepsEpisodesWithTheirOwnRating() + { + var (_, season, episodes) = CreateSeries("TV-PG", "TV-PG", "TV-14", null); + + await InvokeUpdateItem(new BaseItemDto { OfficialRating = "TV-MA" }, season); + + Assert.Equal("TV-MA", episodes[0].OfficialRating); + Assert.Equal("TV-14", episodes[1].OfficialRating); + Assert.Equal("TV-MA", episodes[2].OfficialRating); + } + + private static (Series Series, Season Season, Episode[] Episodes) CreateSeries(string seriesRating, params string?[] episodeRatings) + { + var episodes = Array.ConvertAll(episodeRatings, r => new Episode { OfficialRating = r, PreferredMetadataCountryCode = "us" }); + var season = new Season { OfficialRating = seriesRating, PreferredMetadataCountryCode = "us", Children = episodes }; + var series = new Series { OfficialRating = seriesRating, PreferredMetadataCountryCode = "us", Children = [season] }; + return (series, season, episodes); + } + private Task InvokeUpdateItem(BaseItemDto request, BaseItem item) { return _subject.UpdateItem(request, item); |
