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