2025-12-13 16:39:49 +01:00
|
|
|
using Emby.Server.Implementations.Library;
|
2025-04-26 17:35:57 +02:00
|
|
|
using Xunit;
|
|
|
|
|
|
|
|
|
|
namespace Jellyfin.Server.Implementations.Tests.Library;
|
|
|
|
|
|
|
|
|
|
public class DotIgnoreIgnoreRuleTest
|
|
|
|
|
{
|
2025-12-13 16:39:49 +01:00
|
|
|
private static readonly string[] _rule1 = ["SPs"];
|
|
|
|
|
private static readonly string[] _rule2 = ["SPs", "!thebestshot.mkv"];
|
|
|
|
|
private static readonly string[] _rule3 = ["*.txt", @"{\colortbl;\red255\green255\blue255;}", "videos/", @"\invalid\escape\sequence", "*.mkv"];
|
|
|
|
|
private static readonly string[] _rule4 = [@"{\colortbl;\red255\green255\blue255;}", @"\invalid\escape\sequence"];
|
|
|
|
|
|
|
|
|
|
public static TheoryData<string[], string, bool, bool> CheckIgnoreRulesTestData =>
|
|
|
|
|
new()
|
|
|
|
|
{
|
|
|
|
|
// Basic pattern matching
|
|
|
|
|
{ _rule1, "f:/cd/sps/ffffff.mkv", false, true },
|
|
|
|
|
{ _rule1, "cd/sps/ffffff.mkv", false, true },
|
|
|
|
|
{ _rule1, "/cd/sps/ffffff.mkv", false, true },
|
|
|
|
|
|
|
|
|
|
// Negate pattern
|
|
|
|
|
{ _rule2, "f:/cd/sps/ffffff.mkv", false, true },
|
|
|
|
|
{ _rule2, "cd/sps/ffffff.mkv", false, true },
|
|
|
|
|
{ _rule2, "/cd/sps/ffffff.mkv", false, true },
|
|
|
|
|
{ _rule2, "f:/cd/sps/thebestshot.mkv", false, false },
|
|
|
|
|
{ _rule2, "cd/sps/thebestshot.mkv", false, false },
|
|
|
|
|
{ _rule2, "/cd/sps/thebestshot.mkv", false, false },
|
|
|
|
|
|
|
|
|
|
// Mixed valid and invalid patterns - skips invalid, applies valid
|
|
|
|
|
{ _rule3, "test.txt", false, true },
|
|
|
|
|
{ _rule3, "videos/movie.mp4", false, true },
|
|
|
|
|
{ _rule3, "movie.mkv", false, true },
|
|
|
|
|
{ _rule3, "test.mp3", false, false },
|
|
|
|
|
|
|
|
|
|
// Only invalid patterns - falls back to ignore all
|
|
|
|
|
{ _rule4, "any-file.txt", false, true },
|
|
|
|
|
{ _rule4, "any/path/to/file.mkv", false, true },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public static TheoryData<string[], string, bool, bool> WindowsPathNormalizationTestData =>
|
|
|
|
|
new()
|
|
|
|
|
{
|
|
|
|
|
// Windows paths with backslashes - should match when normalizePath is true
|
|
|
|
|
{ _rule1, @"C:\cd\sps\ffffff.mkv", false, true },
|
|
|
|
|
{ _rule1, @"D:\media\sps\movie.mkv", false, true },
|
|
|
|
|
{ _rule1, @"\\server\share\sps\file.mkv", false, true },
|
|
|
|
|
|
|
|
|
|
// Negate pattern with Windows paths
|
|
|
|
|
{ _rule2, @"C:\cd\sps\ffffff.mkv", false, true },
|
|
|
|
|
{ _rule2, @"C:\cd\sps\thebestshot.mkv", false, false },
|
|
|
|
|
|
|
|
|
|
// Directory matching with Windows paths
|
|
|
|
|
{ _rule3, @"C:\videos\movie.mp4", false, true },
|
|
|
|
|
{ _rule3, @"D:\documents\test.txt", false, true },
|
|
|
|
|
{ _rule3, @"E:\music\song.mp3", false, false },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
[Theory]
|
|
|
|
|
[MemberData(nameof(CheckIgnoreRulesTestData))]
|
|
|
|
|
public void CheckIgnoreRules_ReturnsExpectedResult(string[] rules, string path, bool isDirectory, bool expectedIgnored)
|
|
|
|
|
{
|
|
|
|
|
Assert.Equal(expectedIgnored, DotIgnoreIgnoreRule.CheckIgnoreRules(path, rules, isDirectory));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Theory]
|
|
|
|
|
[MemberData(nameof(WindowsPathNormalizationTestData))]
|
|
|
|
|
public void CheckIgnoreRules_WithWindowsPaths_NormalizesBackslashes(string[] rules, string path, bool isDirectory, bool expectedIgnored)
|
2025-04-26 17:35:57 +02:00
|
|
|
{
|
2025-12-13 16:39:49 +01:00
|
|
|
// With normalizePath=true, backslashes should be converted to forward slashes
|
|
|
|
|
Assert.Equal(expectedIgnored, DotIgnoreIgnoreRule.CheckIgnoreRules(path, rules, isDirectory, normalizePath: true));
|
2025-04-26 17:35:57 +02:00
|
|
|
}
|
|
|
|
|
|
2025-12-13 16:39:49 +01:00
|
|
|
[Theory]
|
|
|
|
|
[InlineData(@"C:\cd\sps\ffffff.mkv")]
|
|
|
|
|
[InlineData(@"D:\media\sps\movie.mkv")]
|
|
|
|
|
public void CheckIgnoreRules_WithWindowsPaths_WithoutNormalization_DoesNotMatch(string path)
|
2025-04-26 17:35:57 +02:00
|
|
|
{
|
2025-12-13 16:39:49 +01:00
|
|
|
// Without normalization, Windows paths with backslashes won't match patterns expecting forward slashes
|
|
|
|
|
Assert.False(DotIgnoreIgnoreRule.CheckIgnoreRules(path, _rule1, isDirectory: false, normalizePath: false));
|
2025-04-26 17:35:57 +02:00
|
|
|
}
|
|
|
|
|
}
|