From 76e640b0b9f46ed82433da9cb8f8c27aa5889743 Mon Sep 17 00:00:00 2001 From: Joe Rogers <1337joe@gmail.com> Date: Tue, 28 Dec 2021 15:10:41 +0100 Subject: [PATCH] Add tests and documentation for ProviderUtils --- .../Manager/ProviderUtils.cs | 17 +- .../Manager/ProviderUtilsTests.cs | 375 ++++++++++++++++++ 2 files changed, 389 insertions(+), 3 deletions(-) create mode 100644 tests/Jellyfin.Providers.Tests/Manager/ProviderUtilsTests.cs diff --git a/MediaBrowser.Providers/Manager/ProviderUtils.cs b/MediaBrowser.Providers/Manager/ProviderUtils.cs index b90136d509..798fd0d681 100644 --- a/MediaBrowser.Providers/Manager/ProviderUtils.cs +++ b/MediaBrowser.Providers/Manager/ProviderUtils.cs @@ -1,7 +1,5 @@ #nullable disable -#pragma warning disable CS1591 - using System; using System.Collections.Generic; using System.Linq; @@ -13,8 +11,21 @@ using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Manager { + /// + /// Class ProviderUtils. + /// public static class ProviderUtils { + /// + /// Merges metadata from source into target. + /// + /// The source for new metadata. + /// The target to insert new metadata into. + /// The fields that are locked and should not be updated. + /// true if existing data should be replaced. + /// true if the metadata settings in target should be updated to match source. + /// The type being acted upon. + /// Thrown if source or target are null. public static void MergeBaseItemData( MetadataResult sourceResult, MetadataResult targetResult, @@ -200,7 +211,7 @@ namespace MediaBrowser.Providers.Manager target.LockedFields = source.LockedFields; target.IsLocked = source.IsLocked; - // Grab the value if it's there, but if not then don't overwrite the default + // Grab the value if it's there, but if not then don't overwrite with the default if (source.DateCreated != default) { target.DateCreated = source.DateCreated; diff --git a/tests/Jellyfin.Providers.Tests/Manager/ProviderUtilsTests.cs b/tests/Jellyfin.Providers.Tests/Manager/ProviderUtilsTests.cs new file mode 100644 index 0000000000..9e4bbef136 --- /dev/null +++ b/tests/Jellyfin.Providers.Tests/Manager/ProviderUtilsTests.cs @@ -0,0 +1,375 @@ +using System; +using System.Collections.Generic; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Providers.Manager; +using Xunit; + +namespace Jellyfin.Providers.Tests.Manager +{ + public class ProviderUtilsTests + { + [Theory] + [InlineData(false, false)] + [InlineData(true, false)] + [InlineData(true, true)] + public void MergeBaseItemData_MergeMetadataSettings_MergesWhenSet(bool mergeMetadataSettings, bool defaultDate) + { + var newLocked = new[] { MetadataField.Cast }; + var newString = "new"; + var newDate = DateTime.Now; + + var oldLocked = new[] { MetadataField.Genres }; + var oldString = "old"; + var oldDate = DateTime.UnixEpoch; + + var source = new MetadataResult + { + Item = new Movie + { + LockedFields = newLocked, + IsLocked = true, + PreferredMetadataCountryCode = newString, + PreferredMetadataLanguage = newString, + DateCreated = newDate + } + }; + if (defaultDate) + { + source.Item.DateCreated = default; + } + + var target = new MetadataResult + { + Item = new Movie + { + LockedFields = oldLocked, + IsLocked = false, + PreferredMetadataCountryCode = oldString, + PreferredMetadataLanguage = oldString, + DateCreated = oldDate + } + }; + + ProviderUtils.MergeBaseItemData(source, target, Array.Empty(), true, mergeMetadataSettings); + + if (mergeMetadataSettings) + { + Assert.Equal(newLocked, target.Item.LockedFields); + Assert.True(target.Item.IsLocked); + Assert.Equal(newString, target.Item.PreferredMetadataCountryCode); + Assert.Equal(newString, target.Item.PreferredMetadataLanguage); + Assert.Equal(defaultDate ? oldDate : newDate, target.Item.DateCreated); + } + else + { + Assert.Equal(oldLocked, target.Item.LockedFields); + Assert.False(target.Item.IsLocked); + Assert.Equal(oldString, target.Item.PreferredMetadataCountryCode); + Assert.Equal(oldString, target.Item.PreferredMetadataLanguage); + Assert.Equal(oldDate, target.Item.DateCreated); + } + } + + [Theory] + [InlineData("Name", MetadataField.Name, false)] + [InlineData("OriginalTitle", null, false)] + [InlineData("OfficialRating", MetadataField.OfficialRating)] + [InlineData("CustomRating")] + [InlineData("Tagline")] + [InlineData("Overview", MetadataField.Overview)] + [InlineData("DisplayOrder", null, false)] + [InlineData("ForcedSortName", null, false)] + public void MergeBaseItemData_StringField_ReplacesAppropriately(string propName, MetadataField? lockField = null, bool replacesWithEmpty = true) + { + var oldValue = "Old"; + var newValue = "New"; + + // Use type Series to hit DisplayOrder + Assert.False(TestMergeBaseItemData(propName, oldValue, newValue, null, false, out _)); + if (lockField != null) + { + Assert.False(TestMergeBaseItemData(propName, oldValue, newValue, lockField, true, out _)); + Assert.False(TestMergeBaseItemData(propName, null, newValue, lockField, false, out _)); + Assert.False(TestMergeBaseItemData(propName, string.Empty, newValue, lockField, false, out _)); + } + + Assert.True(TestMergeBaseItemData(propName, oldValue, newValue, null, true, out _)); + Assert.True(TestMergeBaseItemData(propName, null, newValue, null, false, out _)); + Assert.True(TestMergeBaseItemData(propName, string.Empty, newValue, null, false, out _)); + + var replacedWithEmpty = TestMergeBaseItemData(propName, oldValue, string.Empty, null, true, out _); + Assert.Equal(replacesWithEmpty, replacedWithEmpty); + } + + [Theory] + [InlineData("Genres", MetadataField.Genres)] + [InlineData("Studios", MetadataField.Studios)] + [InlineData("Tags", MetadataField.Tags)] + [InlineData("ProductionLocations", MetadataField.ProductionLocations)] + [InlineData("AlbumArtists")] + public void MergeBaseItemData_StringArrayField_ReplacesAppropriately(string propName, MetadataField? lockField = null) + { + // Note that arrays are replaced, not merged + var oldValue = new[] { "Old" }; + var newValue = new[] { "New" }; + + // Use type Audio to hit AlbumArtists + Assert.False(TestMergeBaseItemData