diff options
Diffstat (limited to 'tests')
19 files changed, 421 insertions, 100 deletions
diff --git a/tests/Jellyfin.Api.Tests/Helpers/RequestHelpersTests.cs b/tests/Jellyfin.Api.Tests/Helpers/RequestHelpersTests.cs index 606041c7f..97e441b1d 100644 --- a/tests/Jellyfin.Api.Tests/Helpers/RequestHelpersTests.cs +++ b/tests/Jellyfin.Api.Tests/Helpers/RequestHelpersTests.cs @@ -6,11 +6,11 @@ using Xunit; namespace Jellyfin.Api.Tests.Helpers { - public class RequestHelpersTests + public static class RequestHelpersTests { [Theory] [MemberData(nameof(GetOrderBy_Success_TestData))] - public void GetOrderBy_Success(IReadOnlyList<string> sortBy, IReadOnlyList<SortOrder> requestedSortOrder, (string, SortOrder)[] expected) + public static void GetOrderBy_Success(IReadOnlyList<string> sortBy, IReadOnlyList<SortOrder> requestedSortOrder, (string, SortOrder)[] expected) { Assert.Equal(expected, RequestHelpers.GetOrderBy(sortBy, requestedSortOrder)); } @@ -55,5 +55,35 @@ namespace Jellyfin.Api.Tests.Helpers } }; } + + [Fact] + public static void GetItemTypeStrings_Empty_Empty() + { + Assert.Empty(RequestHelpers.GetItemTypeStrings(Array.Empty<BaseItemKind>())); + } + + [Fact] + public static void GetItemTypeStrings_Valid_Success() + { + BaseItemKind[] input = + { + BaseItemKind.AggregateFolder, + BaseItemKind.Audio, + BaseItemKind.BasePluginFolder, + BaseItemKind.CollectionFolder + }; + + string[] expected = + { + "AggregateFolder", + "Audio", + "BasePluginFolder", + "CollectionFolder" + }; + + var res = RequestHelpers.GetItemTypeStrings(input); + + Assert.Equal(expected, res); + } } } diff --git a/tests/Jellyfin.Naming.Tests/Video/VideoListResolverTests.cs b/tests/Jellyfin.Naming.Tests/Video/VideoListResolverTests.cs index 215c7e540..08af76669 100644 --- a/tests/Jellyfin.Naming.Tests/Video/VideoListResolverTests.cs +++ b/tests/Jellyfin.Naming.Tests/Video/VideoListResolverTests.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using Emby.Naming.Common; using Emby.Naming.Video; @@ -8,11 +9,10 @@ namespace Jellyfin.Naming.Tests.Video { public class VideoListResolverTests { - private readonly NamingOptions _namingOptions = new NamingOptions(); + private readonly VideoListResolver _videoListResolver = new VideoListResolver(new NamingOptions()); - // FIXME - // [Fact] - private void TestStackAndExtras() + [Fact] + public void TestStackAndExtras() { // No stacking here because there is no part/disc/etc var files = new[] @@ -40,23 +40,22 @@ namespace Jellyfin.Naming.Tests.Video "WillyWonka-trailer.mkv" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i }).ToList()).ToList(); Assert.Equal(5, result.Count); - - Assert.Equal(3, result[1].Files.Count); - Assert.Equal(3, result[1].Extras.Count); - Assert.Equal("Batman", result[1].Name); - - Assert.Equal(4, result[2].Files.Count); - Assert.Equal(2, result[2].Extras.Count); - Assert.Equal("Harry Potter and the Deathly Hallows", result[2].Name); + var batman = result.FirstOrDefault(x => string.Equals(x.Name, "Batman", StringComparison.Ordinal)); + Assert.NotNull(batman); + Assert.Equal(3, batman!.Files.Count); + Assert.Equal(3, batman!.Extras.Count); + + var harry = result.FirstOrDefault(x => string.Equals(x.Name, "Harry Potter and the Deathly Hallows", StringComparison.Ordinal)); + Assert.NotNull(harry); + Assert.Equal(4, harry!.Files.Count); + Assert.Equal(2, harry!.Extras.Count); } [Fact] @@ -68,9 +67,7 @@ namespace Jellyfin.Naming.Tests.Video "300.nfo" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -88,9 +85,7 @@ namespace Jellyfin.Naming.Tests.Video "300 trailer.mkv" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -108,9 +103,7 @@ namespace Jellyfin.Naming.Tests.Video "X-Men Days of Future Past-trailer.mp4" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -129,9 +122,7 @@ namespace Jellyfin.Naming.Tests.Video "X-Men Days of Future Past-trailer2.mp4" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -149,9 +140,7 @@ namespace Jellyfin.Naming.Tests.Video "Looper.2012.bluray.720p.x264.mkv" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -173,9 +162,7 @@ namespace Jellyfin.Naming.Tests.Video "My video 5.mkv" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -193,9 +180,7 @@ namespace Jellyfin.Naming.Tests.Video @"M:/Movies (DVD)/Movies (Musical)/Sound of Music (1965)/Sound of Music Disc 2" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = true, FullName = i @@ -214,9 +199,7 @@ namespace Jellyfin.Naming.Tests.Video @"My movie #2.mp4" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = true, FullName = i @@ -235,9 +218,7 @@ namespace Jellyfin.Naming.Tests.Video @"No (2012) part1-trailer.mp4" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -256,9 +237,7 @@ namespace Jellyfin.Naming.Tests.Video @"No (2012)-trailer.mp4" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -278,9 +257,7 @@ namespace Jellyfin.Naming.Tests.Video @"trailer.mp4" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -300,9 +277,7 @@ namespace Jellyfin.Naming.Tests.Video @"/MCFAMILY-PC/Private3$/Heterosexual/Breast In Class 2 Counterfeit Racks (2011)/Breast In Class 2 Disc 2 cd2.avi" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -319,9 +294,7 @@ namespace Jellyfin.Naming.Tests.Video @"/nas-markrobbo78/Videos/INDEX HTPC/Movies/Watched/3 - ACTION/Argo (2012)/movie.mkv" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -338,9 +311,7 @@ namespace Jellyfin.Naming.Tests.Video @"The Colony.mkv" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -358,9 +329,7 @@ namespace Jellyfin.Naming.Tests.Video @"Four Sisters and a Wedding - B.avi" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -378,9 +347,7 @@ namespace Jellyfin.Naming.Tests.Video @"Four Rooms - A.mp4" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -398,9 +365,7 @@ namespace Jellyfin.Naming.Tests.Video @"/Server/Despicable Me/movie-trailer.mkv" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -420,9 +385,7 @@ namespace Jellyfin.Naming.Tests.Video @"/Server/Despicable Me/Baywatch (2017) - Trailer.mkv" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -440,9 +403,7 @@ namespace Jellyfin.Naming.Tests.Video @"/Movies/Despicable Me/trailers/trailer.mkv" }; - var resolver = GetResolver(); - - var result = resolver.Resolve(files.Select(i => new FileSystemMetadata + var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata { IsDirectory = false, FullName = i @@ -457,10 +418,5 @@ namespace Jellyfin.Naming.Tests.Video var stack = new FileStack(); Assert.False(stack.ContainsFile("XX", true)); } - - private VideoListResolver GetResolver() - { - return new VideoListResolver(_namingOptions); - } } } diff --git a/tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj b/tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj index 174f29b09..c3b3155fe 100644 --- a/tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj +++ b/tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj @@ -39,6 +39,7 @@ <ItemGroup> <ProjectReference Include="..\..\Emby.Server.Implementations\Emby.Server.Implementations.csproj" /> + <ProjectReference Include="..\..\Jellyfin.Server.Implementations\Jellyfin.Server.Implementations.csproj" /> </ItemGroup> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> diff --git a/tests/Jellyfin.Server.Implementations.Tests/Users/UserManagerTests.cs b/tests/Jellyfin.Server.Implementations.Tests/Users/UserManagerTests.cs new file mode 100644 index 000000000..867dda29d --- /dev/null +++ b/tests/Jellyfin.Server.Implementations.Tests/Users/UserManagerTests.cs @@ -0,0 +1,28 @@ +using System; +using Jellyfin.Server.Implementations.Users; +using Xunit; + +namespace Jellyfin.Server.Implementations.Tests.Users +{ + public class UserManagerTests + { + [Theory] + [InlineData("this_is_valid")] + [InlineData("this is also valid")] + [InlineData("0@_-' .")] + public void ThrowIfInvalidUsername_WhenValidUsername_DoesNotThrowArgumentException(string username) + { + var ex = Record.Exception(() => UserManager.ThrowIfInvalidUsername(username)); + Assert.Null(ex); + } + + [Theory] + [InlineData(" ")] + [InlineData("")] + [InlineData("special characters like & $ ? are not allowed")] + public void ThrowIfInvalidUsername_WhenInvalidUsername_ThrowsArgumentException(string username) + { + Assert.Throws<ArgumentException>(() => UserManager.ThrowIfInvalidUsername(username)); + } + } +} diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Location/MovieNfoLocationTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Location/MovieNfoLocationTests.cs new file mode 100644 index 000000000..357d61c0b --- /dev/null +++ b/tests/Jellyfin.XbmcMetadata.Tests/Location/MovieNfoLocationTests.cs @@ -0,0 +1,65 @@ +using System.Linq; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.System; +using MediaBrowser.XbmcMetadata.Savers; +using Xunit; + +namespace Jellyfin.XbmcMetadata.Tests.Location +{ + public class MovieNfoLocationTests + { + [Fact] + public static void Movie_MixedFolder_Success() + { + var movie = new Movie() { Path = "/media/movies/Avengers Endgame.mp4", IsInMixedFolder = true }; + + var paths = MovieNfoSaver.GetMovieSavePaths(new ItemInfo(movie)).ToArray(); + Assert.Single(paths); + Assert.Contains("/media/movies/Avengers Endgame.nfo", paths); + } + + [Fact] + public static void Movie_SeparateFolder_Success() + { + var movie = new Movie() { Path = "/media/movies/Avengers Endgame/Avengers Endgame.mp4" }; + var path1 = "/media/movies/Avengers Endgame/Avengers Endgame.nfo"; + var path2 = "/media/movies/Avengers Endgame/movie.nfo"; + + // uses ContainingFolderPath which uses Operating system specific paths + if (MediaBrowser.Common.System.OperatingSystem.Id == OperatingSystemId.Windows) + { + movie.Path = movie.Path.Replace('/', '\\'); + path1 = path1.Replace('/', '\\'); + path2 = path2.Replace('/', '\\'); + } + + var paths = MovieNfoSaver.GetMovieSavePaths(new ItemInfo(movie)).ToArray(); + Assert.Equal(2, paths.Length); + Assert.Contains(path1, paths); + Assert.Contains(path2, paths); + } + + [Fact] + public void Movie_DVD_Success() + { + var movie = new Movie() { Path = "/media/movies/Avengers Endgame", VideoType = VideoType.Dvd }; + var path1 = "/media/movies/Avengers Endgame/Avengers Endgame.nfo"; + var path2 = "/media/movies/Avengers Endgame/VIDEO_TS/VIDEO_TS.nfo"; + + // uses ContainingFolderPath which uses Operating system specific paths + if (MediaBrowser.Common.System.OperatingSystem.Id == OperatingSystemId.Windows) + { + movie.Path = movie.Path.Replace('/', '\\'); + path1 = path1.Replace('/', '\\'); + path2 = path2.Replace('/', '\\'); + } + + var paths = MovieNfoSaver.GetMovieSavePaths(new ItemInfo(movie)).ToArray(); + Assert.Equal(2, paths.Length); + Assert.Contains(path1, paths); + Assert.Contains(path2, paths); + } + } +} diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs index d0cd8b287..d10ef9b47 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs +++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; @@ -34,7 +35,10 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers var config = new Mock<IConfigurationManager>(); config.Setup(x => x.GetConfiguration(It.IsAny<string>())) .Returns(new XbmcMetadataOptions()); - _parser = new EpisodeNfoParser(new NullLogger<EpisodeNfoParser>(), config.Object, providerManager.Object); + var user = new Mock<IUserManager>(); + var userData = new Mock<IUserDataManager>(); + + _parser = new EpisodeNfoParser(new NullLogger<EpisodeNfoParser>(), config.Object, providerManager.Object, user.Object, userData.Object); } [Fact] @@ -62,6 +66,10 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers Assert.Equal(2017, item.ProductionYear); Assert.Single(item.Studios); Assert.Contains("Starz", item.Studios); + Assert.Equal(1, item.IndexNumberEnd); + Assert.Equal(2, item.AirsAfterSeasonNumber); + Assert.Equal(3, item.AirsBeforeSeasonNumber); + Assert.Equal(1, item.AirsBeforeEpisodeNumber); Assert.Equal("tt5017734", item.ProviderIds[MetadataProvider.Imdb.ToString()]); Assert.Equal("1276153", item.ProviderIds[MetadataProvider.Tmdb.ToString()]); diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs index 2f7ee65d5..76231391e 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs +++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs @@ -1,8 +1,11 @@ using System; using System.Linq; using System.Threading; +using Jellyfin.Data.Entities; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; @@ -18,9 +21,13 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers public class MovieNfoParserTests { private readonly MovieNfoParser _parser; + private readonly IUserDataManager _userDataManager; + private readonly User _testUser; public MovieNfoParserTests() { + _testUser = new User("Test User", "Auth provider", "Reset provider"); + var providerManager = new Mock<IProviderManager>(); var tmdbExternalId = new TmdbMovieExternalId(); @@ -29,10 +36,24 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny<IHasProviderIds>())) .Returns(new[] { externalIdInfo }); - var config = new Mock<IConfigurationManager>(); - config.Setup(x => x.GetConfiguration(It.IsAny<string>())) - .Returns(new XbmcMetadataOptions()); - _parser = new MovieNfoParser(new NullLogger<MovieNfoParser>(), config.Object, providerManager.Object); + var nfoConfig = new XbmcMetadataOptions() + { + UserId = "F38E6443-090B-4F7A-BD12-9CFF5020F7BC" + }; + var configManager = new Mock<IConfigurationManager>(); + configManager.Setup(x => x.GetConfiguration(It.IsAny<string>())) + .Returns(nfoConfig); + + var user = new Mock<IUserManager>(); + user.Setup(x => x.GetUserById(It.IsAny<Guid>())) + .Returns(_testUser); + + var userData = new Mock<IUserDataManager>(); + userData.Setup(x => x.GetUserData(_testUser, It.IsAny<BaseItem>())) + .Returns(new UserItemData()); + + _userDataManager = userData.Object; + _parser = new MovieNfoParser(new NullLogger<MovieNfoParser>(), configManager.Object, providerManager.Object, user.Object, userData.Object); } [Fact] @@ -40,11 +61,11 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers { var result = new MetadataResult<Video>() { - Item = new Video() + Item = new Movie() }; _parser.Fetch(result, "Test Data/Justice League.nfo", CancellationToken.None); - var item = result.Item; + var item = (Movie)result.Item; Assert.Equal("Justice League", item.OriginalTitle); Assert.Equal("Justice for all.", item.Tagline); @@ -58,22 +79,31 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers Assert.Contains("Sci-Fi", item.Genres); Assert.Equal(new DateTime(2017, 11, 15), item.PremiereDate); + Assert.Equal(new DateTime(2017, 11, 16), item.EndDate); Assert.Single(item.Studios); Assert.Contains("DC Comics", item.Studios); Assert.Equal("1.777778", item.AspectRatio); + Assert.Equal(Video3DFormat.HalfSideBySide, item.Video3DFormat); Assert.Equal(1920, item.Width); Assert.Equal(1080, item.Height); Assert.Equal(new TimeSpan(0, 0, 6268).Ticks, item.RunTimeTicks); Assert.True(item.HasSubtitles); + Assert.Equal(7.6f, item.CriticRating); + Assert.Equal("8.7", item.CustomRating); + Assert.Equal("en", item.PreferredMetadataLanguage); + Assert.Equal("us", item.PreferredMetadataCountryCode); + Assert.Single(item.RemoteTrailers); + Assert.Equal("https://www.youtube.com/watch?v=dQw4w9WgXcQ", item.RemoteTrailers[0].Url); - Assert.Equal(19, result.People.Count); + Assert.Equal(20, result.People.Count); var writers = result.People.Where(x => x.Type == PersonType.Writer).ToArray(); - Assert.Equal(2, writers.Length); + Assert.Equal(3, writers.Length); var writerNames = writers.Select(x => x.Name); Assert.Contains("Jerry Siegel", writerNames); Assert.Contains("Joe Shuster", writerNames); + Assert.Contains("Test", writerNames); var directors = result.People.Where(x => x.Type == PersonType.Director).ToArray(); Assert.Single(directors); @@ -94,6 +124,32 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers Assert.Equal("Test Lyricist", lyricist!.Name); Assert.Equal(new DateTime(2019, 8, 6, 9, 1, 18), item.DateCreated); + + // userData + var userData = _userDataManager.GetUserData(_testUser, item); + Assert.Equal(2, userData.PlayCount); + Assert.True(userData.Played); + Assert.Equal(new DateTime(2021, 02, 11, 07, 47, 23), userData.LastPlayedDate); + + // Movie set + Assert.Equal("702342", item.ProviderIds[MetadataProvider.TmdbCollection.ToString()]); + Assert.Equal("Justice League Collection", item.CollectionName); + } + + [Theory] + [InlineData("Test Data/Tmdb.nfo", "Tmdb", "30287")] + [InlineData("Test Data/Imdb.nfo", "Imdb", "tt0944947")] + public void Parse_UrlFile_Success(string path, string provider, string id) + { + var result = new MetadataResult<Video>() + { + Item = new Movie() + }; + + _parser.Fetch(result, path, CancellationToken.None); + var item = (Movie)result.Item; + + Assert.Equal(id, item.ProviderIds[provider]); } [Fact] @@ -109,7 +165,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers { var result = new MetadataResult<Video>() { - Item = new Video() + Item = new Movie() }; Assert.Throws<ArgumentException>(() => _parser.Fetch(result, string.Empty, CancellationToken.None)); diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicAlbumNfoProviderTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicAlbumNfoProviderTests.cs index 1fe56cadd..2183d2a2f 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicAlbumNfoProviderTests.cs +++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicAlbumNfoProviderTests.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Threading; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; @@ -35,7 +36,10 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers var config = new Mock<IConfigurationManager>(); config.Setup(x => x.GetConfiguration(It.IsAny<string>())) .Returns(new XbmcMetadataOptions()); - _parser = new BaseNfoParser<MusicAlbum>(new NullLogger<BaseNfoParser<MusicAlbum>>(), config.Object, providerManager.Object); + var user = new Mock<IUserManager>(); + var userData = new Mock<IUserDataManager>(); + + _parser = new BaseNfoParser<MusicAlbum>(new NullLogger<BaseNfoParser<MusicAlbum>>(), config.Object, providerManager.Object, user.Object, userData.Object); } [Fact] diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicArtistNfoParserTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicArtistNfoParserTests.cs index 4869cf088..f86b7604e 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicArtistNfoParserTests.cs +++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicArtistNfoParserTests.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; @@ -32,7 +33,10 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers var config = new Mock<IConfigurationManager>(); config.Setup(x => x.GetConfiguration(It.IsAny<string>())) .Returns(new XbmcMetadataOptions()); - _parser = new BaseNfoParser<MusicArtist>(new NullLogger<BaseNfoParser<MusicArtist>>(), config.Object, providerManager.Object); + var user = new Mock<IUserManager>(); + var userData = new Mock<IUserDataManager>(); + + _parser = new BaseNfoParser<MusicArtist>(new NullLogger<BaseNfoParser<MusicArtist>>(), config.Object, providerManager.Object, user.Object, userData.Object); } [Fact] diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicVideoNfoParserTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicVideoNfoParserTests.cs new file mode 100644 index 000000000..898554936 --- /dev/null +++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicVideoNfoParserTests.cs @@ -0,0 +1,73 @@ +using System; +using System.Linq; +using System.Threading; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Providers; +using MediaBrowser.XbmcMetadata.Parsers; +using Microsoft.Extensions.Logging.Abstractions; +using Moq; +using Xunit; + +namespace Jellyfin.XbmcMetadata.Tests.Parsers +{ + public class MusicVideoNfoParserTests + { + private readonly MovieNfoParser _parser; + + public MusicVideoNfoParserTests() + { + var providerManager = new Mock<IProviderManager>(); + providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny<IHasProviderIds>())) + .Returns(Enumerable.Empty<ExternalIdInfo>()); + var config = new Mock<IConfigurationManager>(); + config.Setup(x => x.GetConfiguration(It.IsAny<string>())) + .Returns(new XbmcMetadataOptions()); + + var user = new Mock<IUserManager>(); + var userData = new Mock<IUserDataManager>(); + + _parser = new MovieNfoParser(new NullLogger<BaseNfoParser<MusicVideo>>(), config.Object, providerManager.Object, user.Object, userData.Object); + } + + [Fact] + public void Fetch_Valid_Succes() + { + var result = new MetadataResult<Video>() + { + Item = new MusicVideo() + }; + + _parser.Fetch(result, "Test Data/Dancing Queen.nfo", CancellationToken.None); + var item = (MusicVideo)result.Item; + + Assert.Equal("Dancing Queen", item.Name); + Assert.Single(item.Artists); + Assert.Contains("ABBA", item.Artists); + Assert.Equal("Arrival", item.Album); + } + + [Fact] + public void Fetch_WithNullItem_ThrowsArgumentException() + { + var result = new MetadataResult<Video>(); + + Assert.Throws<ArgumentException>(() => _parser.Fetch(result, "Test Data/Dancing Queen.nfo", CancellationToken.None)); + } + + [Fact] + public void Fetch_NullResult_ThrowsArgumentException() + { + var result = new MetadataResult<Video>() + { + Item = new MusicVideo() + }; + + Assert.Throws<ArgumentException>(() => _parser.Fetch(result, string.Empty, CancellationToken.None)); + } + } +} diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/SeasonNfoProviderTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/SeasonNfoProviderTests.cs index 68b7239d2..602db7c09 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/SeasonNfoProviderTests.cs +++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/SeasonNfoProviderTests.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Threading; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; @@ -28,7 +29,10 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers var config = new Mock<IConfigurationManager>(); config.Setup(x => x.GetConfiguration(It.IsAny<string>())) .Returns(new XbmcMetadataOptions()); - _parser = new SeasonNfoParser(new NullLogger<SeasonNfoParser>(), config.Object, providerManager.Object); + var user = new Mock<IUserManager>(); + var userData = new Mock<IUserDataManager>(); + + _parser = new SeasonNfoParser(new NullLogger<SeasonNfoParser>(), config.Object, providerManager.Object, user.Object, userData.Object); } [Fact] diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/SeriesNfoParserTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/SeriesNfoParserTests.cs index 9e535182e..f8eb04b3a 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/SeriesNfoParserTests.cs +++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/SeriesNfoParserTests.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; @@ -26,7 +27,10 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers var config = new Mock<IConfigurationManager>(); config.Setup(x => x.GetConfiguration(It.IsAny<string>())) .Returns(new XbmcMetadataOptions()); - _parser = new SeriesNfoParser(new NullLogger<SeriesNfoParser>(), config.Object, providerManager.Object); + var user = new Mock<IUserManager>(); + var userData = new Mock<IUserDataManager>(); + + _parser = new SeriesNfoParser(new NullLogger<SeriesNfoParser>(), config.Object, providerManager.Object, user.Object, userData.Object); } [Fact] @@ -45,6 +49,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers Assert.Equal(0, item.RunTimeTicks); Assert.Equal("46639", item.ProviderIds[MetadataProvider.Tmdb.ToString()]); Assert.Equal("253573", item.ProviderIds[MetadataProvider.Tvdb.ToString()]); + Assert.Equal("tt11111", item.ProviderIds[MetadataProvider.Imdb.ToString()]); Assert.Equal(3, item.Genres.Length); Assert.Contains("Drama", item.Genres); @@ -54,6 +59,10 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers Assert.Equal(new DateTime(2017, 4, 30), item.PremiereDate); Assert.Single(item.Studios); Assert.Contains("Starz", item.Studios); + Assert.Equal("9 PM", item.AirTime); + Assert.Single(item.AirDays); + Assert.Contains(DayOfWeek.Friday, item.AirDays); + Assert.Equal(SeriesStatus.Ended, item.Status); Assert.Equal(6, result.People.Count); @@ -69,6 +78,21 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers Assert.Equal(new DateTime(2017, 10, 7, 14, 25, 47), item.DateCreated); } + [Theory] + [InlineData("Test Data/Tvdb.nfo", "Tvdb", "121361")] + public void Parse_UrlFile_Success(string path, string provider, string id) + { + var result = new MetadataResult<Series>() + { + Item = new Series() + }; + + _parser.Fetch(result, path, CancellationToken.None); + var item = (Series)result.Item; + + Assert.Equal(id, item.ProviderIds[provider]); + } + [Fact] public void Fetch_WithNullItem_ThrowsArgumentException() { diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/American Gods.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/American Gods.nfo index b9f31f2f6..5bf7e08eb 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/American Gods.nfo +++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/American Gods.nfo @@ -126,7 +126,7 @@ <episodeguide> <url cache="tmdb-46639-en.json">http://api.themoviedb.org/3/tv/46639?api_key=6a5be4999abf74eba1f9a8311294c267&language=en</url> </episodeguide> - <id>46639</id> + <id IMDB="tt11111" TMDB="46639">253573</id> <uniqueid type="tmdb" default="true">46639</uniqueid> <uniqueid type="tvdb">253573</uniqueid> <genre>Drama</genre> @@ -134,7 +134,9 @@ <genre>Sci-Fi & Fantasy</genre> <premiered>2017-04-30</premiered> <year>2017</year> - <status></status> + <status>ended</status> + <airs_time>9 PM</airs_time> + <airs_dayofweek>Friday</airs_dayofweek> <code></code> <aired></aired> <studio>Starz</studio> diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Dancing Queen.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Dancing Queen.nfo new file mode 100644 index 000000000..29f19e1a0 --- /dev/null +++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Dancing Queen.nfo @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<musicvideo> + <title>Dancing Queen</title> + <userrating>0</userrating> + <top250>0</top250> + <track>3</track> + <album>Arrival</album> + <outline></outline> + <plot>Dancing Queen est un des tubes emblématiques de l'ère disco produits par le groupe suédois ABBA en 1976. Ce tube connaît un regain de popularité en 1994 lors de la sortie de Priscilla, folle du désert, et fait « presque » partie de la distribution du film Muriel.
Le groupe a également enregistré une version espagnole de ce titre, La reina del baile, pour le marché d'Amérique latine. On peut retrouver ces versions en espagnol des succès de ABBA sur l'abum Oro. Le 18 juin 1976, ABBA a interprété cette chanson lors d'un spectacle télévisé organisé en l'honneur du roi Charles XVI Gustave de Suède, qui venait de se marier. Le titre sera repris en 2011 par Glee dans la saison 2, épisode 20.</plot> + <tagline></tagline> + <runtime>2</runtime> + <thumb preview="https://www.theaudiodb.com/images/media/album/thumb/arrival-4ee244732bbde.jpg/preview">https://www.theaudiodb.com/images/media/album/thumb/arrival-4ee244732bbde.jpg</thumb> + <thumb preview="https://assets.fanart.tv/preview/music/d87e52c5-bb8d-4da8-b941-9f4928627dc8/albumcover/arrival-548ab7a698b49.jpg">https://assets.fanart.tv/fanart/music/d87e52c5-bb8d-4da8-b941-9f4928627dc8/albumcover/arrival-548ab7a698b49.jpg</thumb> + <mpaa></mpaa> + <playcount>0</playcount> + <lastplayed></lastplayed> + <id></id> + <genre>Pop</genre> + <director>John Smith</director> + <premiered>1976-01-01</premiered> + <year>1976</year> + <status></status> + <code></code> + <aired></aired> + <studio>Studio 54</studio> + <trailer></trailer> + <fileinfo> + <streamdetails> + <video> + <codec>hevc</codec> + <aspect>1.792230</aspect> + <width>716</width> + <height>568</height> + <durationinseconds>143</durationinseconds> + <stereomode></stereomode> + </video> + <audio> + <codec>ac3</codec> + <language>eng</language> + <channels>2</channels> + </audio> + </streamdetails> + </fileinfo> + <artist>ABBA</artist> + <resume> + <position>0.000000</position> + <total>0.000000</total> + </resume> + <dateadded>2018-09-10 09:46:06</dateadded> +</musicvideo> diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Imdb.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Imdb.nfo new file mode 100644 index 000000000..e30a1c660 --- /dev/null +++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Imdb.nfo @@ -0,0 +1 @@ +https://www.imdb.com/title/tt0944947/ diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Justice League.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Justice League.nfo index 18b44d944..72e27fe50 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Justice League.nfo +++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Justice League.nfo @@ -24,12 +24,20 @@ <votes>119873</votes> </rating> </ratings> + <criticrating>7.6</criticrating> + <language>en</language> + <countrycode>us</countrycode> + <customrating>8.7</customrating> + <aspectratio>1.777778</aspectratio> <userrating>0</userrating> <top250>0</top250> <outline>Fueled by his restored faith in humanity and inspired by Superman's selfless act, Bruce Wayne enlists the help of his new-found ally, Diana Prince, to face an even greater enemy.</outline> <plot>Fueled by his restored faith in humanity and inspired by Superman's selfless act, Bruce Wayne enlists the help of his newfound ally, Diana Prince, to face an even greater enemy. Together, Batman and Wonder Woman work quickly to find and recruit a team of meta-humans to stand against this newly awakened threat. But despite the formation of this unprecedented league of heroes-Batman, Wonder Woman, Aquaman, Cyborg and The Flash-it may already be too late to save the planet from an assault of catastrophic proportions.</plot> <tagline>Justice for all.</tagline> <runtime>120</runtime> + <playcount>2</playcount> + <watched>true</watched> + <lastplayed>2021-02-11 07:47:23</lastplayed> <tmdbId>141052</tmdbId> <thumb aspect="set.poster" preview="https://assets.fanart.tv/preview/movies/468551/movieposter/justice-league-collection-5c24ea65591d3.jpg">https://assets.fanart.tv/fanart/movies/468551/movieposter/justice-league-collection-5c24ea65591d3.jpg</thumb> <thumb aspect="set.poster" preview="https://assets.fanart.tv/preview/movies/468551/movieposter/justice-league-collection-5c24ea65591d3.jpg">https://assets.fanart.tv/fanart/movies/468551/movieposter/justice-league-collection-5c24ea65591d3.jpg</thumb> @@ -82,8 +90,6 @@ <thumb preview="https://assets.fanart.tv/preview/movies/141052/moviebackground/justice-league-5a119394ea362.jpg">https://assets.fanart.tv/fanart/movies/141052/moviebackground/justice-league-5a119394ea362.jpg</thumb> </fanart> <mpaa>Australia:M</mpaa> - <playcount>0</playcount> - <lastplayed></lastplayed> <id>tt0974015</id> <uniqueid type="imdb" default="true">tt0974015</uniqueid> <genre>Action</genre> @@ -93,20 +99,22 @@ <country>USA</country> <country>Canada</country> <country>UK</country> - <set> + <set tmdbcolid="702342"> <name>Justice League Collection</name> <overview>Based on the DC Comics superhero team</overview> </set> <credits>Jerry Siegel</credits> <credits>Joe Shuster</credits> - <director>Zack Snyder</director> + <director>Zack Snyder,</director> + <writer>Test</writer> <premiered>2017-11-15</premiered> + <enddate>2017-11-16</enddate> <year>2017</year> <status></status> <code></code> <aired></aired> <studio>DC Comics</studio> - <trailer></trailer> + <trailer>plugin://plugin.video.youtube/?action=play_video&videoid=dQw4w9WgXcQ</trailer> <fileinfo> <streamdetails> <video> @@ -116,6 +124,7 @@ <height>1080</height> <durationinseconds>6268</durationinseconds> <stereomode></stereomode> + <format3d>HSBS</format3d> </video> <audio> <codec>truehd</codec> diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/The Bone Orchard.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/The Bone Orchard.nfo index 14feffcba..cd275e4cf 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/The Bone Orchard.nfo +++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/The Bone Orchard.nfo @@ -14,6 +14,10 @@ <episode>1</episode> <displayseason>-1</displayseason> <displayepisode>-1</displayepisode> + <episodenumberend>1</episodenumberend> + <airsbefore_episode>1</airsbefore_episode> + <airsafter_season>2</airsafter_season> + <airsbefore_season>3</airsbefore_season> <outline></outline> <plot>When Shadow Moon is released from prison early after the death of his wife, he meets Mr. Wednesday and is recruited as his bodyguard. Shadow discovers that this may be more than he bargained for.</plot> <tagline></tagline> diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Tmdb.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Tmdb.nfo new file mode 100644 index 000000000..15af71852 --- /dev/null +++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Tmdb.nfo @@ -0,0 +1 @@ +https://www.themoviedb.org/movie/30287-fallo diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Tvdb.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Tvdb.nfo new file mode 100644 index 000000000..9de69f8e1 --- /dev/null +++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Tvdb.nfo @@ -0,0 +1 @@ +https://www.thetvdb.com/?tab=series&id=121361 |
