2
0

PathExtensionsTests.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.IO;
  3. using Emby.Server.Implementations.Library;
  4. using Xunit;
  5. namespace Jellyfin.Server.Implementations.Tests.Library
  6. {
  7. public class PathExtensionsTests
  8. {
  9. [Theory]
  10. [InlineData("Superman: Red Son [imdbid=tt10985510]", "imdbid", "tt10985510")]
  11. [InlineData("Superman: Red Son [imdbid-tt10985510]", "imdbid", "tt10985510")]
  12. [InlineData("Superman: Red Son - tt10985510", "imdbid", "tt10985510")]
  13. [InlineData("Superman: Red Son", "imdbid", null)]
  14. [InlineData("Superman: Red Son", "something", null)]
  15. [InlineData("Superman: Red Son [imdbid1=tt11111111][imdbid=tt10985510]", "imdbid", "tt10985510")]
  16. [InlineData("Superman: Red Son [imdbid1-tt11111111][imdbid=tt10985510]", "imdbid", "tt10985510")]
  17. [InlineData("Superman: Red Son [tmdbid=618355][imdbid=tt10985510]", "imdbid", "tt10985510")]
  18. [InlineData("Superman: Red Son [tmdbid-618355][imdbid-tt10985510]", "imdbid", "tt10985510")]
  19. [InlineData("Superman: Red Son [tmdbid-618355][imdbid-tt10985510]", "tmdbid", "618355")]
  20. [InlineData("Superman: Red Son [providera-id=1]", "providera-id", "1")]
  21. [InlineData("Superman: Red Son [providerb-id=2]", "providerb-id", "2")]
  22. [InlineData("Superman: Red Son [providera id=4]", "providera id", "4")]
  23. [InlineData("Superman: Red Son [providerb id=5]", "providerb id", "5")]
  24. [InlineData("Superman: Red Son [tmdbid=3]", "tmdbid", "3")]
  25. [InlineData("Superman: Red Son [tvdbid-6]", "tvdbid", "6")]
  26. [InlineData("[tmdbid=618355]", "tmdbid", "618355")]
  27. [InlineData("[tmdbid-618355]", "tmdbid", "618355")]
  28. [InlineData("tmdbid=111111][tmdbid=618355]", "tmdbid", "618355")]
  29. [InlineData("[tmdbid=618355]tmdbid=111111]", "tmdbid", "618355")]
  30. [InlineData("tmdbid=618355]", "tmdbid", null)]
  31. [InlineData("[tmdbid=618355", "tmdbid", null)]
  32. [InlineData("tmdbid=618355", "tmdbid", null)]
  33. [InlineData("tmdbid=", "tmdbid", null)]
  34. [InlineData("tmdbid", "tmdbid", null)]
  35. [InlineData("[tmdbid=][imdbid=tt10985510]", "tmdbid", null)]
  36. [InlineData("[tmdbid-][imdbid-tt10985510]", "tmdbid", null)]
  37. [InlineData("Superman: Red Son [tmdbid-618355][tmdbid=1234567]", "tmdbid", "618355")]
  38. public void GetAttributeValue_ValidArgs_Correct(string input, string attribute, string? expectedResult)
  39. {
  40. Assert.Equal(expectedResult, PathExtensions.GetAttributeValue(input, attribute));
  41. }
  42. [Theory]
  43. [InlineData("", "")]
  44. [InlineData("Superman: Red Son [imdbid=tt10985510]", "")]
  45. [InlineData("", "imdbid")]
  46. public void GetAttributeValue_EmptyString_ThrowsArgumentException(string input, string attribute)
  47. {
  48. Assert.Throws<ArgumentException>(() => PathExtensions.GetAttributeValue(input, attribute));
  49. }
  50. [Theory]
  51. [InlineData("C:/Users/jeff/myfile.mkv", "C:/Users/jeff", "/home/jeff", "/home/jeff/myfile.mkv")]
  52. [InlineData("C:/Users/jeff/myfile.mkv", "C:/Users/jeff/", "/home/jeff", "/home/jeff/myfile.mkv")]
  53. [InlineData("/home/jeff/music/jeff's band/consistently inconsistent.mp3", "/home/jeff/music/jeff's band", "/home/not jeff", "/home/not jeff/consistently inconsistent.mp3")]
  54. [InlineData(@"C:\Users\jeff\myfile.mkv", "C:\\Users/jeff", "/home/jeff", "/home/jeff/myfile.mkv")]
  55. [InlineData(@"C:\Users\jeff\myfile.mkv", "C:\\Users/jeff", "/home/jeff/", "/home/jeff/myfile.mkv")]
  56. [InlineData(@"C:\Users\jeff\myfile.mkv", "C:\\Users/jeff/", "/home/jeff/", "/home/jeff/myfile.mkv")]
  57. [InlineData(@"C:\Users\jeff\myfile.mkv", "C:\\Users/jeff/", "/", "/myfile.mkv")]
  58. [InlineData("/o", "/o", "/s", "/s")] // regression test for #5977
  59. public void TryReplaceSubPath_ValidArgs_Correct(string path, string subPath, string newSubPath, string? expectedResult)
  60. {
  61. Assert.True(PathExtensions.TryReplaceSubPath(path, subPath, newSubPath, out var result));
  62. Assert.Equal(expectedResult, result);
  63. }
  64. [Theory]
  65. [InlineData(null, null, null)]
  66. [InlineData(null, "/my/path", "/another/path")]
  67. [InlineData("/my/path", null, "/another/path")]
  68. [InlineData("/my/path", "/another/path", null)]
  69. [InlineData("", "", "")]
  70. [InlineData("/my/path", "", "")]
  71. [InlineData("", "/another/path", "")]
  72. [InlineData("", "", "/new/subpath")]
  73. [InlineData("/home/jeff/music/jeff's band/consistently inconsistent.mp3", "/home/jeff/music/not jeff's band", "/home/not jeff")]
  74. public void TryReplaceSubPath_InvalidInput_ReturnsFalseAndNull(string? path, string? subPath, string? newSubPath)
  75. {
  76. Assert.False(PathExtensions.TryReplaceSubPath(path, subPath, newSubPath, out var result));
  77. Assert.Null(result);
  78. }
  79. [Theory]
  80. [InlineData(null, '/', null)]
  81. [InlineData(null, '\\', null)]
  82. [InlineData("/home/jeff/myfile.mkv", '\\', @"\home\jeff\myfile.mkv")]
  83. [InlineData(@"C:\Users\Jeff\myfile.mkv", '/', "C:/Users/Jeff/myfile.mkv")]
  84. [InlineData(@"\home/jeff\myfile.mkv", '\\', @"\home\jeff\myfile.mkv")]
  85. [InlineData(@"\home/jeff\myfile.mkv", '/', "/home/jeff/myfile.mkv")]
  86. [InlineData("", '/', "")]
  87. public void NormalizePath_SpecifyingSeparator_Normalizes(string? path, char separator, string? expectedPath)
  88. {
  89. Assert.Equal(expectedPath, path.NormalizePath(separator));
  90. }
  91. [Theory]
  92. [InlineData("/home/jeff/myfile.mkv")]
  93. [InlineData(@"C:\Users\Jeff\myfile.mkv")]
  94. [InlineData(@"\home/jeff\myfile.mkv")]
  95. public void NormalizePath_NoArgs_UsesDirectorySeparatorChar(string path)
  96. {
  97. var separator = Path.DirectorySeparatorChar;
  98. Assert.Equal(path.Replace('\\', separator).Replace('/', separator), path.NormalizePath());
  99. }
  100. [Theory]
  101. [InlineData("/home/jeff/myfile.mkv", '/')]
  102. [InlineData(@"C:\Users\Jeff\myfile.mkv", '\\')]
  103. [InlineData(@"\home/jeff\myfile.mkv", '/')]
  104. public void NormalizePath_OutVar_Correct(string path, char expectedSeparator)
  105. {
  106. var result = path.NormalizePath(out var separator);
  107. Assert.Equal(expectedSeparator, separator);
  108. Assert.Equal(path.Replace('\\', separator).Replace('/', separator), result);
  109. }
  110. [Fact]
  111. public void NormalizePath_SpecifyInvalidSeparator_ThrowsException()
  112. {
  113. Assert.Throws<ArgumentException>(() => string.Empty.NormalizePath('a'));
  114. }
  115. }
  116. }