aboutsummaryrefslogtreecommitdiff
path: root/tests/Jellyfin.Api.Tests/Controllers/ItemUpdateControllerTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Jellyfin.Api.Tests/Controllers/ItemUpdateControllerTests.cs')
-rw-r--r--tests/Jellyfin.Api.Tests/Controllers/ItemUpdateControllerTests.cs82
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);