| 
					
				 | 
			
			
				@@ -0,0 +1,129 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.IO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Emby.Naming.Common; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Emby.Naming.Video; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Emby.Server.Implementations.Library; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using MediaBrowser.Controller; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using MediaBrowser.Controller.Entities; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using MediaBrowser.Model.Entities; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using MediaBrowser.Model.IO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Moq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Xunit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace Jellyfin.Server.Implementations.Tests.Library; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class CoreResolutionIgnoreRuleTest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private readonly CoreResolutionIgnoreRule _rule; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private readonly NamingOptions _namingOptions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private readonly Mock<IServerApplicationPaths> _appPathsMock; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public CoreResolutionIgnoreRuleTest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _namingOptions = new NamingOptions(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _namingOptions.AllExtrasTypesFolderNames.TryAdd("extras", ExtraType.Trailer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _appPathsMock = new Mock<IServerApplicationPaths>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _appPathsMock.SetupGet(x => x.RootFolderPath).Returns("/server/root"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _rule = new CoreResolutionIgnoreRule(_namingOptions, _appPathsMock.Object); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private FileSystemMetadata MakeFileSystemMetadata(string fullName, bool isDirectory = false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        => new FileSystemMetadata { FullName = fullName, Name = Path.GetFileName(fullName), IsDirectory = isDirectory }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private BaseItem MakeParent(string name = "Parent", bool isTopParent = false, Type? type = null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return type switch 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Type t when t == typeof(Folder) => CreateMock<Folder>(name, isTopParent).Object, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Type t when t == typeof(AggregateFolder) => CreateMock<AggregateFolder>(name, isTopParent).Object, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Type t when t == typeof(UserRootFolder) => CreateMock<UserRootFolder>(name, isTopParent).Object, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _ => CreateMock<BaseItem>(name, isTopParent).Object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static Mock<T> CreateMock<T>(string name, bool isTopParent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    where T : BaseItem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var mock = new Mock<T>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mock.SetupGet(p => p.Name).Returns(name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mock.SetupGet(p => p.IsTopParent).Returns(isTopParent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return mock; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void TestApplicationFolder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.False(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeFileSystemMetadata("/server/root/extras", isDirectory: true), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            null)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.False(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeFileSystemMetadata("/server/root/small.jpg"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            null)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void TestTopLevelDirectory() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.False(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeFileSystemMetadata("Series/Extras", true), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent(type: typeof(AggregateFolder)))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.False(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeFileSystemMetadata("Series/Extras/Extras", true), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent(isTopParent: true))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void TestIgnorePatterns() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.False(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeFileSystemMetadata("/Media/big.jpg"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.True(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeFileSystemMetadata("/Media/small.jpg"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void TestExtrasTypesFolderNames() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FileSystemMetadata fileSystemMetadata = MakeFileSystemMetadata("/Movies/Up/extras", true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.False(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fileSystemMetadata, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent(type: typeof(AggregateFolder)))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.False(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fileSystemMetadata, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent(type: typeof(UserRootFolder)))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.False(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fileSystemMetadata, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            null)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.True(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fileSystemMetadata, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.True(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fileSystemMetadata, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent(type: typeof(Folder)))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void TestThemeSong() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.False(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeFileSystemMetadata("/Movies/Up/intro.mp3"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.True(_rule.ShouldIgnore( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeFileSystemMetadata("/Movies/Up/theme.mp3"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MakeParent())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |