diff options
| -rw-r--r-- | tests/Jellyfin.Providers.Tests/Manager/MetadataServiceRefreshTests.cs | 113 |
1 files changed, 50 insertions, 63 deletions
diff --git a/tests/Jellyfin.Providers.Tests/Manager/MetadataServiceRefreshTests.cs b/tests/Jellyfin.Providers.Tests/Manager/MetadataServiceRefreshTests.cs index 465a032328..3b4d6fc9bb 100644 --- a/tests/Jellyfin.Providers.Tests/Manager/MetadataServiceRefreshTests.cs +++ b/tests/Jellyfin.Providers.Tests/Manager/MetadataServiceRefreshTests.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Jellyfin.Data.Enums; -using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; @@ -15,7 +15,6 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.IO; -using MediaBrowser.Model.MediaInfo; using MediaBrowser.Providers.Manager; using Microsoft.Extensions.Logging.Abstractions; using Moq; @@ -236,13 +235,10 @@ namespace Jellyfin.Providers.Tests.Manager [InlineData(MetadataRefreshMode.Default, false)] public async Task RefreshMetadata_ProvidersFoundNothing_PersistsRefreshDateOnFullRefresh(MetadataRefreshMode mode, bool expectSaved) { - var peoplePath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "people"); - - var item = new Person + var item = new TestItem { Id = Guid.NewGuid(), - Name = "Test Person", - Path = System.IO.Path.Combine(peoplePath, "T", "Test Person"), + Name = "Test Item", PreferredMetadataLanguage = "en", PreferredMetadataCountryCode = "US", DateLastRefreshed = DateTime.UtcNow.AddDays(-60), @@ -252,72 +248,38 @@ namespace Jellyfin.Providers.Tests.Manager var stampBefore = item.DateLastRefreshed; - var provider = new Mock<IRemoteMetadataProvider<Person, PersonLookupInfo>>(MockBehavior.Loose); + var provider = new Mock<IRemoteMetadataProvider<TestItem, ItemLookupInfo>>(MockBehavior.Loose); provider.Setup(p => p.Name).Returns("Provider"); - provider.Setup(p => p.GetMetadata(It.IsAny<PersonLookupInfo>(), It.IsAny<CancellationToken>())) - .ReturnsAsync(new MetadataResult<Person> { HasMetadata = false }); - - var libraryOptions = new LibraryOptions(); + provider.Setup(p => p.GetMetadata(It.IsAny<ItemLookupInfo>(), It.IsAny<CancellationToken>())) + .ReturnsAsync(new MetadataResult<TestItem> { HasMetadata = false }); var libraryManager = new Mock<ILibraryManager>(MockBehavior.Loose); - libraryManager.Setup(l => l.GetLibraryOptions(It.IsAny<BaseItem>())).Returns(libraryOptions); + libraryManager.Setup(l => l.GetLibraryOptions(It.IsAny<BaseItem>())).Returns(new LibraryOptions()); var providerManager = new Mock<IProviderManager>(MockBehavior.Loose); providerManager.Setup(p => p.GetImageProviders(It.IsAny<BaseItem>(), It.IsAny<ImageRefreshOptions>())) .Returns(Array.Empty<IImageProvider>()); - providerManager.Setup(p => p.GetMetadataProviders<Person>(It.IsAny<BaseItem>(), It.IsAny<LibraryOptions>())) - .Returns(new[] { (IMetadataProvider<Person>)provider.Object }); + providerManager.Setup(p => p.GetMetadataProviders<TestItem>(It.IsAny<BaseItem>(), It.IsAny<LibraryOptions>())) + .Returns(new[] { (IMetadataProvider<TestItem>)provider.Object }); providerManager.Setup(p => p.GetMetadataSavers(It.IsAny<BaseItem>(), It.IsAny<LibraryOptions>())) .Returns(Array.Empty<IMetadataSaver>()); var itemRepository = new Mock<IItemRepository>(MockBehavior.Loose); itemRepository.Setup(r => r.ItemExistsAsync(It.IsAny<Guid>())).ReturnsAsync(true); - var applicationPaths = new Mock<IServerApplicationPaths>(MockBehavior.Loose); - applicationPaths.Setup(a => a.PeoplePath).Returns(peoplePath); - var configurationManager = new Mock<IServerConfigurationManager>(MockBehavior.Loose); - configurationManager.Setup(c => c.ApplicationPaths).Returns(applicationPaths.Object); - configurationManager.Setup(c => c.Configuration).Returns(new ServerConfiguration()); - - var fileSystem = new Mock<IFileSystem>(MockBehavior.Loose); - fileSystem.Setup(f => f.GetFileSystemInfo(It.IsAny<string>())).Returns(new FileSystemMetadata { Exists = false }); - fileSystem.Setup(f => f.GetValidFilename(It.IsAny<string>())).Returns<string>(name => name); - - var mediaSourceManager = new Mock<IMediaSourceManager>(MockBehavior.Loose); - mediaSourceManager.Setup(m => m.GetPathProtocol(It.IsAny<string>())).Returns(MediaProtocol.File); - - var previousLibraryManager = BaseItem.LibraryManager; - var previousConfigurationManager = BaseItem.ConfigurationManager; - var previousFileSystem = BaseItem.FileSystem; - var previousMediaSourceManager = BaseItem.MediaSourceManager; - BaseItem.LibraryManager = libraryManager.Object; - BaseItem.ConfigurationManager = configurationManager.Object; - BaseItem.FileSystem = fileSystem.Object; - BaseItem.MediaSourceManager = mediaSourceManager.Object; - try - { - var service = new TestPersonMetadataService(libraryManager.Object, providerManager.Object, itemRepository.Object, fileSystem.Object); - - await service.RefreshMetadata( - item, - new MetadataRefreshOptions(Mock.Of<IDirectoryService>()) - { - MetadataRefreshMode = mode, - ImageRefreshMode = mode - }, - CancellationToken.None).ConfigureAwait(true); - } - finally - { - BaseItem.LibraryManager = previousLibraryManager; - BaseItem.ConfigurationManager = previousConfigurationManager; - BaseItem.FileSystem = previousFileSystem; - BaseItem.MediaSourceManager = previousMediaSourceManager; - } + var service = new TestItemMetadataService(libraryManager.Object, providerManager.Object, itemRepository.Object); - libraryManager.Verify( - l => l.UpdateItemAsync(item, It.IsAny<BaseItem>(), It.IsAny<ItemUpdateType>(), It.IsAny<CancellationToken>()), - expectSaved ? Times.Once() : Times.Never()); + await service.RefreshMetadata( + item, + new MetadataRefreshOptions(Mock.Of<IDirectoryService>()) + { + MetadataRefreshMode = mode, + ImageRefreshMode = mode + }, + CancellationToken.None).ConfigureAwait(true); + + // Nothing was found, so on a full refresh the advanced stamp is the only reason to write the row. + Assert.Equal(expectSaved, item.Saved); if (expectSaved) { @@ -325,6 +287,31 @@ namespace Jellyfin.Providers.Tests.Manager } } + /// <summary> + /// Stands in for a real item so the refresh stays off the shared BaseItem statics, which other + /// test classes in this assembly overwrite while xUnit runs them in parallel. + /// </summary> + internal sealed class TestItem : BaseItem + { + public bool Saved { get; private set; } + + public override bool RequiresRefresh() => false; + + public override bool IsSaveLocalMetadataEnabled() => false; + + public override string CreatePresentationUniqueKey() => Id.ToString("N", CultureInfo.InvariantCulture); + + public override ItemUpdateType OnMetadataChanged() => ItemUpdateType.None; + + public override bool BeforeMetadataRefresh(bool replaceAllMetadata) => false; + + public override Task UpdateToRepositoryAsync(ItemUpdateType updateReason, CancellationToken cancellationToken) + { + Saved = true; + return Task.CompletedTask; + } + } + private sealed class TestMetadataService : MetadataService<Movie, MovieInfo> { public TestMetadataService() @@ -347,14 +334,14 @@ namespace Jellyfin.Providers.Tests.Manager => RefreshWithProviders(metadata, id, options, providers, ImageProvider, false, CancellationToken.None); } - private sealed class TestPersonMetadataService : MetadataService<Person, PersonLookupInfo> + private sealed class TestItemMetadataService : MetadataService<TestItem, ItemLookupInfo> { - public TestPersonMetadataService(ILibraryManager libraryManager, IProviderManager providerManager, IItemRepository itemRepository, IFileSystem fileSystem) + public TestItemMetadataService(ILibraryManager libraryManager, IProviderManager providerManager, IItemRepository itemRepository) : base( Mock.Of<IServerConfigurationManager>(), - NullLogger<MetadataService<Person, PersonLookupInfo>>.Instance, + NullLogger<MetadataService<TestItem, ItemLookupInfo>>.Instance, providerManager, - fileSystem, + Mock.Of<IFileSystem>(), libraryManager, Mock.Of<IExternalDataManager>(), itemRepository) |
