Преглед изворни кода

Merge pull request #5952 from Bond-009/tests4

Bond-009 пре 4 година
родитељ
комит
ea5bc90189

+ 19 - 22
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -502,7 +502,7 @@ namespace Emby.Server.Implementations.Data
                     using (var saveImagesStatement = base.PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id"))
                     using (var saveImagesStatement = base.PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id"))
                     {
                     {
                         saveImagesStatement.TryBind("@Id", item.Id.ToByteArray());
                         saveImagesStatement.TryBind("@Id", item.Id.ToByteArray());
-                        saveImagesStatement.TryBind("@Images", SerializeImages(item));
+                        saveImagesStatement.TryBind("@Images", SerializeImages(item.ImageInfos));
 
 
                         saveImagesStatement.MoveNext();
                         saveImagesStatement.MoveNext();
                     }
                     }
@@ -898,7 +898,7 @@ namespace Emby.Server.Implementations.Data
             saveItemStatement.TryBind("@Tagline", item.Tagline);
             saveItemStatement.TryBind("@Tagline", item.Tagline);
 
 
             saveItemStatement.TryBind("@ProviderIds", SerializeProviderIds(item));
             saveItemStatement.TryBind("@ProviderIds", SerializeProviderIds(item));
-            saveItemStatement.TryBind("@Images", SerializeImages(item));
+            saveItemStatement.TryBind("@Images", SerializeImages(item.ImageInfos));
 
 
             if (item.ProductionLocations.Length > 0)
             if (item.ProductionLocations.Length > 0)
             {
             {
@@ -1020,10 +1020,8 @@ namespace Emby.Server.Implementations.Data
             }
             }
         }
         }
 
 
-        private string SerializeImages(BaseItem item)
+        internal string SerializeImages(ItemImageInfo[] images)
         {
         {
-            var images = item.ImageInfos;
-
             if (images.Length == 0)
             if (images.Length == 0)
             {
             {
                 return null;
                 return null;
@@ -1045,16 +1043,11 @@ namespace Emby.Server.Implementations.Data
             return str.ToString();
             return str.ToString();
         }
         }
 
 
-        private void DeserializeImages(string value, BaseItem item)
+        internal ItemImageInfo[] DeserializeImages(string value)
         {
         {
             if (string.IsNullOrWhiteSpace(value))
             if (string.IsNullOrWhiteSpace(value))
             {
             {
-                return;
-            }
-
-            if (item.ImageInfos.Length > 0)
-            {
-                return;
+                return Array.Empty<ItemImageInfo>();
             }
             }
 
 
             var parts = value.Split('|' , StringSplitOptions.RemoveEmptyEntries);
             var parts = value.Split('|' , StringSplitOptions.RemoveEmptyEntries);
@@ -1069,15 +1062,14 @@ namespace Emby.Server.Implementations.Data
                 }
                 }
             }
             }
 
 
-            item.ImageInfos = list.ToArray();
+            return list.ToArray();
         }
         }
 
 
-        public void AppendItemImageInfo(StringBuilder bldr, ItemImageInfo image)
+        private void AppendItemImageInfo(StringBuilder bldr, ItemImageInfo image)
         {
         {
             const char Delimiter = '*';
             const char Delimiter = '*';
 
 
             var path = image.Path ?? string.Empty;
             var path = image.Path ?? string.Empty;
-            var hash = image.BlurHash ?? string.Empty;
 
 
             bldr.Append(GetPathToSave(path))
             bldr.Append(GetPathToSave(path))
                 .Append(Delimiter)
                 .Append(Delimiter)
@@ -1087,11 +1079,16 @@ namespace Emby.Server.Implementations.Data
                 .Append(Delimiter)
                 .Append(Delimiter)
                 .Append(image.Width)
                 .Append(image.Width)
                 .Append(Delimiter)
                 .Append(Delimiter)
-                .Append(image.Height)
-                .Append(Delimiter)
-                // Replace delimiters with other characters.
-                // This can be removed when we migrate to a proper DB.
-                .Append(hash.Replace('*', '/').Replace('|', '\\'));
+                .Append(image.Height);
+
+            var hash = image.BlurHash;
+            if (!string.IsNullOrEmpty(hash))
+            {
+                bldr.Append(Delimiter)
+                    // Replace delimiters with other characters.
+                    // This can be removed when we migrate to a proper DB.
+                    .Append(hash.Replace('*', '/').Replace('|', '\\'));
+            }
         }
         }
 
 
         public ItemImageInfo ItemImageInfoFromValueString(string value)
         public ItemImageInfo ItemImageInfoFromValueString(string value)
@@ -1797,11 +1794,11 @@ namespace Emby.Server.Implementations.Data
 
 
             index++;
             index++;
 
 
-            if (query.DtoOptions.EnableImages)
+            if (query.DtoOptions.EnableImages && item.ImageInfos.Length == 0)
             {
             {
                 if (!reader.IsDBNull(index))
                 if (!reader.IsDBNull(index))
                 {
                 {
-                    DeserializeImages(reader.GetString(index), item);
+                    item.ImageInfos = DeserializeImages(reader.GetString(index));
                 }
                 }
 
 
                 index++;
                 index++;

+ 172 - 0
tests/Jellyfin.Server.Implementations.Tests/Data/SqliteItemRepositoryTests.cs

@@ -0,0 +1,172 @@
+using System;
+using System.Collections.Generic;
+using AutoFixture;
+using AutoFixture.AutoMoq;
+using Emby.Server.Implementations.Data;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Entities;
+using Moq;
+using Xunit;
+
+namespace Jellyfin.Server.Implementations.Tests.Data
+{
+    public class SqliteItemRepositoryTests
+    {
+        public const string VirtualMetaDataPath = "%MetadataPath%";
+        public const string MetaDataPath = "/meta/data/path";
+
+        private readonly IFixture _fixture;
+        private readonly SqliteItemRepository _sqliteItemRepository;
+
+        public SqliteItemRepositoryTests()
+        {
+            var appHost = new Mock<IServerApplicationHost>();
+            appHost.Setup(x => x.ExpandVirtualPath(It.IsAny<string>()))
+                .Returns((string x) => x.Replace(VirtualMetaDataPath, MetaDataPath, StringComparison.Ordinal));
+            appHost.Setup(x => x.ReverseVirtualPath(It.IsAny<string>()))
+                .Returns((string x) => x.Replace(MetaDataPath, VirtualMetaDataPath, StringComparison.Ordinal));
+
+            _fixture = new Fixture().Customize(new AutoMoqCustomization { ConfigureMembers = true });
+            _fixture.Inject(appHost);
+            _sqliteItemRepository = _fixture.Create<SqliteItemRepository>();
+        }
+
+        public static IEnumerable<object[]> ItemImageInfoFromValueString_Valid_TestData()
+        {
+            yield return new object[]
+            {
+                "/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg*637452096478512963*Primary*1920*1080*WjQbtJtSO8nhNZ%L_Io#R/oaS6o}-;adXAoIn7j[%hW9s:WGw[nN",
+                new ItemImageInfo()
+                {
+                    Path = "/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg",
+                    Type = ImageType.Primary,
+                    DateModified = new DateTime(637452096478512963, DateTimeKind.Utc),
+                    Width = 1920,
+                    Height = 1080,
+                    BlurHash = "WjQbtJtSO8nhNZ%L_Io#R*oaS6o}-;adXAoIn7j[%hW9s:WGw[nN"
+                }
+            };
+
+            yield return new object[]
+            {
+                "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg*0*Primary*0*0",
+                new ItemImageInfo()
+                {
+                    Path = "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg",
+                    Type = ImageType.Primary,
+                }
+            };
+
+            yield return new object[]
+            {
+                "%MetadataPath%/library/68/68578562b96c80a7ebd530848801f645/poster.jpg*637264380567586027*Primary*600*336",
+                new ItemImageInfo()
+                {
+                    Path = "/meta/data/path/library/68/68578562b96c80a7ebd530848801f645/poster.jpg",
+                    Type = ImageType.Primary,
+                    DateModified = new DateTime(637264380567586027, DateTimeKind.Utc),
+                    Width = 600,
+                    Height = 336
+                }
+            };
+        }
+
+        [Theory]
+        [MemberData(nameof(ItemImageInfoFromValueString_Valid_TestData))]
+        public void ItemImageInfoFromValueString_Valid_Success(string value, ItemImageInfo expected)
+        {
+            var result = _sqliteItemRepository.ItemImageInfoFromValueString(value);
+            Assert.Equal(expected.Path, result.Path);
+            Assert.Equal(expected.Type, result.Type);
+            Assert.Equal(expected.DateModified, result.DateModified);
+            Assert.Equal(expected.Width, result.Width);
+            Assert.Equal(expected.Height, result.Height);
+            Assert.Equal(expected.BlurHash, result.BlurHash);
+        }
+
+        [Theory]
+        [InlineData("")]
+        [InlineData("*")]
+        public void ItemImageInfoFromValueString_Invalid_Null(string value)
+        {
+            Assert.Null(_sqliteItemRepository.ItemImageInfoFromValueString(value));
+        }
+
+        public static IEnumerable<object[]> DeserializeImages_Valid_TestData()
+        {
+            yield return new object[]
+            {
+                "/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg*637452096478512963*Primary*1920*1080*WjQbtJtSO8nhNZ%L_Io#R/oaS6o}-;adXAoIn7j[%hW9s:WGw[nN",
+                new ItemImageInfo[]
+                {
+                    new ItemImageInfo()
+                    {
+                        Path = "/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg",
+                        Type = ImageType.Primary,
+                        DateModified = new DateTime(637452096478512963, DateTimeKind.Utc),
+                        Width = 1920,
+                        Height = 1080,
+                        BlurHash = "WjQbtJtSO8nhNZ%L_Io#R*oaS6o}-;adXAoIn7j[%hW9s:WGw[nN"
+                    }
+                }
+            };
+
+            yield return new object[]
+            {
+                "%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/poster.jpg*637261226720645297*Primary*0*0|%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/logo.png*637261226720805297*Logo*0*0|%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/landscape.jpg*637261226721285297*Thumb*0*0|%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/backdrop.jpg*637261226721685297*Backdrop*0*0",
+                new ItemImageInfo[]
+                {
+                    new ItemImageInfo()
+                    {
+                        Path = "/meta/data/path/library/2a/2a27372f1e9bc757b1db99721bbeae1e/poster.jpg",
+                        Type = ImageType.Primary,
+                        DateModified = new DateTime(637261226720645297, DateTimeKind.Utc),
+                    },
+                    new ItemImageInfo()
+                    {
+                        Path = "/meta/data/path/library/2a/2a27372f1e9bc757b1db99721bbeae1e/logo.png",
+                        Type = ImageType.Logo,
+                        DateModified = new DateTime(637261226720805297, DateTimeKind.Utc),
+                    },
+                    new ItemImageInfo()
+                    {
+                        Path = "/meta/data/path/library/2a/2a27372f1e9bc757b1db99721bbeae1e/landscape.jpg",
+                        Type = ImageType.Thumb,
+                        DateModified = new DateTime(637261226721285297, DateTimeKind.Utc),
+                    },
+                    new ItemImageInfo()
+                    {
+                        Path = "/meta/data/path/library/2a/2a27372f1e9bc757b1db99721bbeae1e/backdrop.jpg",
+                        Type = ImageType.Backdrop,
+                        DateModified = new DateTime(637261226721685297, DateTimeKind.Utc),
+                    }
+                }
+            };
+        }
+
+        [Theory]
+        [MemberData(nameof(DeserializeImages_Valid_TestData))]
+        public void DeserializeImages_Valid_Success(string value, ItemImageInfo[] expected)
+        {
+            var result = _sqliteItemRepository.DeserializeImages(value);
+            Assert.Equal(expected.Length, result.Length);
+            for (int i = 0; i < expected.Length; i++)
+            {
+                Assert.Equal(expected[i].Path, result[i].Path);
+                Assert.Equal(expected[i].Type, result[i].Type);
+                Assert.Equal(expected[i].DateModified, result[i].DateModified);
+                Assert.Equal(expected[i].Width, result[i].Width);
+                Assert.Equal(expected[i].Height, result[i].Height);
+                Assert.Equal(expected[i].BlurHash, result[i].BlurHash);
+            }
+        }
+
+        [Theory]
+        [MemberData(nameof(DeserializeImages_Valid_TestData))]
+        public void SerializeImages_Valid_Success(string expected, ItemImageInfo[] value)
+        {
+            Assert.Equal(expected, _sqliteItemRepository.SerializeImages(value));
+        }
+    }
+}