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