//
// Copyright (c) PlaceholderCompany. All rights reserved.
//
namespace Jellyfin.Providers.Tests.Manager
{
using System;
using System.Collections.Generic;
using System.Linq;
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;
public class MetadataServiceTests
{
[Theory]
[InlineData(false, false)]
[InlineData(true, false)]
[InlineData(true, true)]
public void MergeBaseItemData_MergeMetadataSettings_MergesWhenSet(bool mergeMetadataSettings, bool defaultDate)
{
var newLocked = new[] { MetadataField.Genres, MetadataField.Cast };
var newString = "new";
var newDate = DateTime.UtcNow;
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
}
};
MetadataService.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)]
[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 is not 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