DirectoryServiceTests.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using System.Linq;
  2. using MediaBrowser.Controller.Providers;
  3. using MediaBrowser.Model.IO;
  4. using Moq;
  5. using Xunit;
  6. namespace Jellyfin.Controller.Tests
  7. {
  8. public class DirectoryServiceTests
  9. {
  10. private const string LowerCasePath = "/music/someartist";
  11. private const string UpperCasePath = "/music/SOMEARTIST";
  12. private static readonly FileSystemMetadata[] _lowerCaseFileSystemMetadata =
  13. {
  14. new()
  15. {
  16. FullName = LowerCasePath + "/Artwork",
  17. IsDirectory = true
  18. },
  19. new()
  20. {
  21. FullName = LowerCasePath + "/Some Other Folder",
  22. IsDirectory = true
  23. },
  24. new()
  25. {
  26. FullName = LowerCasePath + "/Song 2.mp3",
  27. IsDirectory = false
  28. },
  29. new()
  30. {
  31. FullName = LowerCasePath + "/Song 3.mp3",
  32. IsDirectory = false
  33. }
  34. };
  35. private static readonly FileSystemMetadata[] _upperCaseFileSystemMetadata =
  36. {
  37. new()
  38. {
  39. FullName = UpperCasePath + "/Lyrics",
  40. IsDirectory = true
  41. },
  42. new()
  43. {
  44. FullName = UpperCasePath + "/Song 1.mp3",
  45. IsDirectory = false
  46. }
  47. };
  48. [Fact]
  49. public void GetFileSystemEntries_GivenPathsWithDifferentCasing_CachesAll()
  50. {
  51. var fileSystemMock = new Mock<IFileSystem>();
  52. fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == UpperCasePath), false)).Returns(_upperCaseFileSystemMetadata);
  53. fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == LowerCasePath), false)).Returns(_lowerCaseFileSystemMetadata);
  54. var directoryService = new DirectoryService(fileSystemMock.Object);
  55. var upperCaseResult = directoryService.GetFileSystemEntries(UpperCasePath);
  56. var lowerCaseResult = directoryService.GetFileSystemEntries(LowerCasePath);
  57. Assert.Equal(_upperCaseFileSystemMetadata, upperCaseResult);
  58. Assert.Equal(_lowerCaseFileSystemMetadata, lowerCaseResult);
  59. }
  60. [Fact]
  61. public void GetFiles_GivenPathsWithDifferentCasing_ReturnsCorrectFiles()
  62. {
  63. var fileSystemMock = new Mock<IFileSystem>();
  64. fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == UpperCasePath), false)).Returns(_upperCaseFileSystemMetadata);
  65. fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == LowerCasePath), false)).Returns(_lowerCaseFileSystemMetadata);
  66. var directoryService = new DirectoryService(fileSystemMock.Object);
  67. var upperCaseResult = directoryService.GetFiles(UpperCasePath);
  68. var lowerCaseResult = directoryService.GetFiles(LowerCasePath);
  69. Assert.Equal(_upperCaseFileSystemMetadata.Where(f => !f.IsDirectory), upperCaseResult);
  70. Assert.Equal(_lowerCaseFileSystemMetadata.Where(f => !f.IsDirectory), lowerCaseResult);
  71. }
  72. [Fact]
  73. public void GetFile_GivenFilePathsWithDifferentCasing_ReturnsCorrectFile()
  74. {
  75. const string lowerCasePath = "/music/someartist/song 1.mp3";
  76. var lowerCaseFileSystemMetadata = new FileSystemMetadata
  77. {
  78. FullName = lowerCasePath,
  79. Exists = true
  80. };
  81. const string upperCasePath = "/music/SOMEARTIST/SONG 1.mp3";
  82. var upperCaseFileSystemMetadata = new FileSystemMetadata
  83. {
  84. FullName = upperCasePath,
  85. Exists = false
  86. };
  87. var fileSystemMock = new Mock<IFileSystem>();
  88. fileSystemMock.Setup(f => f.GetFileInfo(It.Is<string>(x => x == upperCasePath))).Returns(upperCaseFileSystemMetadata);
  89. fileSystemMock.Setup(f => f.GetFileInfo(It.Is<string>(x => x == lowerCasePath))).Returns(lowerCaseFileSystemMetadata);
  90. var directoryService = new DirectoryService(fileSystemMock.Object);
  91. var lowerCaseResult = directoryService.GetFile(lowerCasePath);
  92. var upperCaseResult = directoryService.GetFile(upperCasePath);
  93. Assert.Equal(lowerCaseFileSystemMetadata, lowerCaseResult);
  94. Assert.Null(upperCaseResult);
  95. }
  96. [Fact]
  97. public void GetFile_GivenCachedPath_ReturnsCachedFile()
  98. {
  99. const string path = "/music/someartist/song 1.mp3";
  100. var cachedFileSystemMetadata = new FileSystemMetadata
  101. {
  102. FullName = path,
  103. Exists = true
  104. };
  105. var newFileSystemMetadata = new FileSystemMetadata
  106. {
  107. FullName = "/music/SOMEARTIST/song 1.mp3",
  108. Exists = true
  109. };
  110. var fileSystemMock = new Mock<IFileSystem>();
  111. fileSystemMock.Setup(f => f.GetFileInfo(It.Is<string>(x => x == path))).Returns(cachedFileSystemMetadata);
  112. var directoryService = new DirectoryService(fileSystemMock.Object);
  113. var result = directoryService.GetFile(path);
  114. fileSystemMock.Setup(f => f.GetFileInfo(It.Is<string>(x => x == path))).Returns(newFileSystemMetadata);
  115. var secondResult = directoryService.GetFile(path);
  116. Assert.Equal(cachedFileSystemMetadata, result);
  117. Assert.Equal(cachedFileSystemMetadata, secondResult);
  118. }
  119. [Fact]
  120. public void GetFilePaths_GivenCachedFilePathWithoutClear_ReturnsOnlyCachedPaths()
  121. {
  122. const string path = "/music/someartist";
  123. var cachedPaths = new[]
  124. {
  125. "/music/someartist/song 1.mp3",
  126. "/music/someartist/song 2.mp3",
  127. "/music/someartist/song 3.mp3",
  128. "/music/someartist/song 4.mp3",
  129. };
  130. var newPaths = new[]
  131. {
  132. "/music/someartist/song 5.mp3",
  133. "/music/someartist/song 6.mp3",
  134. "/music/someartist/song 7.mp3",
  135. "/music/someartist/song 8.mp3",
  136. };
  137. var fileSystemMock = new Mock<IFileSystem>();
  138. fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(cachedPaths);
  139. var directoryService = new DirectoryService(fileSystemMock.Object);
  140. var result = directoryService.GetFilePaths(path);
  141. fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(newPaths);
  142. var secondResult = directoryService.GetFilePaths(path);
  143. Assert.Equal(cachedPaths, result);
  144. Assert.Equal(cachedPaths, secondResult);
  145. }
  146. [Fact]
  147. public void GetFilePaths_GivenCachedFilePathWithClear_ReturnsNewPaths()
  148. {
  149. const string path = "/music/someartist";
  150. var cachedPaths = new[]
  151. {
  152. "/music/someartist/song 1.mp3",
  153. "/music/someartist/song 2.mp3",
  154. "/music/someartist/song 3.mp3",
  155. "/music/someartist/song 4.mp3",
  156. };
  157. var newPaths = new[]
  158. {
  159. "/music/someartist/song 5.mp3",
  160. "/music/someartist/song 6.mp3",
  161. "/music/someartist/song 7.mp3",
  162. "/music/someartist/song 8.mp3",
  163. };
  164. var fileSystemMock = new Mock<IFileSystem>();
  165. fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(cachedPaths);
  166. var directoryService = new DirectoryService(fileSystemMock.Object);
  167. var result = directoryService.GetFilePaths(path);
  168. fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(newPaths);
  169. var secondResult = directoryService.GetFilePaths(path, true);
  170. Assert.Equal(cachedPaths, result);
  171. Assert.Equal(newPaths, secondResult);
  172. }
  173. }
  174. }