Sfoglia il codice sorgente

Implement CanRefresh tests for ProviderManager.GetImageProviders

Joe Rogers 3 anni fa
parent
commit
56900d0fc3

+ 87 - 6
tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using MediaBrowser.Controller.BaseItemManager;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
@@ -53,7 +54,7 @@ namespace Jellyfin.Providers.Tests.Manager
             for (var i = 0; i < providerCount; i++)
             {
                 var order = hasOrderOrder?[i];
-                providerList.Add(MockIImageProvider<IImageProvider>(nameProvider(i), item, order));
+                providerList.Add(MockIImageProvider<IImageProvider>(nameProvider(i), item, order: order));
             }
 
             var libraryOptions = new LibraryOptions();
@@ -95,7 +96,78 @@ namespace Jellyfin.Providers.Tests.Manager
             }
         }
 
-        private static IImageProvider MockIImageProvider<T>(string name, BaseItem supportedType, int? order = null)
+        [Theory]
+        [InlineData(true, false, true)]
+        [InlineData(false, false, false)]
+        [InlineData(true, true, false)]
+        public void GetImageProviders_CanRefreshBasic_WhenSupportsWithoutError(bool supports, bool errorOnSupported, bool expected)
+        {
+            GetImageProviders_CanRefresh_Tester(typeof(IImageProvider), supports, expected, errorOnSupported: errorOnSupported);
+        }
+
+        [Theory]
+        [InlineData(typeof(ILocalImageProvider), false, true)]
+        [InlineData(typeof(ILocalImageProvider), true, true)]
+        [InlineData(typeof(IImageProvider), false, false)]
+        [InlineData(typeof(IImageProvider), true, true)]
+        public void GetImageProviders_CanRefreshLocked_WhenLocalOrFullRefresh(Type providerType, bool fullRefresh, bool expected)
+        {
+            GetImageProviders_CanRefresh_Tester(providerType, true, expected, itemLocked: true, fullRefresh: fullRefresh);
+        }
+
+        [Theory]
+        [InlineData(typeof(ILocalImageProvider), false, true)]
+        [InlineData(typeof(IRemoteImageProvider), true, true)]
+        [InlineData(typeof(IDynamicImageProvider), true, true)]
+        [InlineData(typeof(IRemoteImageProvider), false, false)]
+        [InlineData(typeof(IDynamicImageProvider), false, false)]
+        public void GetImageProviders_CanRefreshEnabled_WhenLocalOrEnabled(Type providerType, bool enabled, bool expected)
+        {
+            GetImageProviders_CanRefresh_Tester(providerType, true, expected, baseItemEnabled: enabled);
+        }
+
+        private static void GetImageProviders_CanRefresh_Tester(Type providerType, bool supports, bool expected, bool errorOnSupported = false, bool itemLocked = false, bool fullRefresh = false, bool baseItemEnabled = true)
+        {
+            var item = new Movie
+            {
+                IsLocked = itemLocked
+            };
+
+            var providerName = "provider";
+            IImageProvider provider = providerType.Name switch
+            {
+                "IImageProvider" => MockIImageProvider<IImageProvider>(providerName, item, supports: supports, errorOnSupported: errorOnSupported),
+                "ILocalImageProvider" => MockIImageProvider<ILocalImageProvider>(providerName, item, supports: supports, errorOnSupported: errorOnSupported),
+                "IRemoteImageProvider" => MockIImageProvider<IRemoteImageProvider>(providerName, item, supports: supports, errorOnSupported: errorOnSupported),
+                "IDynamicImageProvider" => MockIImageProvider<IDynamicImageProvider>(providerName, item, supports: supports, errorOnSupported: errorOnSupported),
+                _ => throw new ArgumentException("Unexpected provider type")
+            };
+
+            var refreshOptions = new ImageRefreshOptions(Mock.Of<IDirectoryService>(MockBehavior.Strict))
+            {
+                ImageRefreshMode = fullRefresh ? MetadataRefreshMode.FullRefresh : MetadataRefreshMode.Default
+            };
+
+            var baseItemManager = new Mock<IBaseItemManager>(MockBehavior.Strict);
+            baseItemManager.Setup(i => i.IsImageFetcherEnabled(item, It.IsAny<LibraryOptions>(), providerName))
+                .Returns(baseItemEnabled);
+
+            var providerManager = GetProviderManager(baseItemManager: baseItemManager.Object);
+            AddParts(providerManager, imageProviders: new[] { provider });
+
+            var actualProviders = providerManager.GetImageProviders(item, refreshOptions);
+
+            if (expected)
+            {
+                Assert.Single(actualProviders);
+            }
+            else
+            {
+                Assert.Empty(actualProviders);
+            }
+        }
+
+        private static IImageProvider MockIImageProvider<T>(string name, BaseItem expectedType, bool supports = true, int? order = null, bool errorOnSupported = false)
             where T : class, IImageProvider
         {
             Mock<IHasOrder>? hasOrder = null;
@@ -111,12 +183,21 @@ namespace Jellyfin.Providers.Tests.Manager
                 : hasOrder.As<T>();
             provider.Setup(p => p.Name)
                 .Returns(name);
-            provider.Setup(p => p.Supports(supportedType))
-                .Returns(true);
+            if (errorOnSupported)
+            {
+                provider.Setup(p => p.Supports(It.IsAny<BaseItem>()))
+                    .Throws(new ArgumentException());
+            }
+            else
+            {
+                provider.Setup(p => p.Supports(expectedType))
+                    .Returns(supports);
+            }
+
             return provider.Object;
         }
 
-        private static ProviderManager GetProviderManager(ServerConfiguration? serverConfiguration = null, LibraryOptions? libraryOptions = null)
+        private static ProviderManager GetProviderManager(ServerConfiguration? serverConfiguration = null, LibraryOptions? libraryOptions = null, IBaseItemManager? baseItemManager = null)
         {
             var serverConfigurationManager = new Mock<IServerConfigurationManager>(MockBehavior.Strict);
             serverConfigurationManager.Setup(i => i.Configuration)
@@ -135,7 +216,7 @@ namespace Jellyfin.Providers.Tests.Manager
                 null,
                 null,
                 libraryManager.Object,
-                null);
+                baseItemManager);
 
             return providerManager;
         }