DirectoryServiceTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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 GetDirectories_GivenPathsWithDifferentCasing_ReturnsCorrectDirectories()
  74. {
  75. var fileSystemMock = new Mock<IFileSystem>();
  76. fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == UpperCasePath), false)).Returns(_upperCaseFileSystemMetadata);
  77. fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == LowerCasePath), false)).Returns(_lowerCaseFileSystemMetadata);
  78. var directoryService = new DirectoryService(fileSystemMock.Object);
  79. var upperCaseResult = directoryService.GetDirectories(UpperCasePath);
  80. var lowerCaseResult = directoryService.GetDirectories(LowerCasePath);
  81. Assert.Equal(_upperCaseFileSystemMetadata.Where(f => f.IsDirectory), upperCaseResult);
  82. Assert.Equal(_lowerCaseFileSystemMetadata.Where(f => f.IsDirectory), lowerCaseResult);
  83. }
  84. [Fact]
  85. public void GetFile_GivenFilePathsWithDifferentCasing_ReturnsCorrectFile()
  86. {
  87. const string lowerCasePath = "/music/someartist/song 1.mp3";
  88. var lowerCaseFileSystemMetadata = new FileSystemMetadata
  89. {
  90. FullName = lowerCasePath,
  91. Exists = true
  92. };
  93. const string upperCasePath = "/music/SOMEARTIST/SONG 1.mp3";
  94. var upperCaseFileSystemMetadata = new FileSystemMetadata
  95. {
  96. FullName = upperCasePath,
  97. Exists = false
  98. };
  99. var fileSystemMock = new Mock<IFileSystem>();
  100. fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == upperCasePath))).Returns(upperCaseFileSystemMetadata);
  101. fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == lowerCasePath))).Returns(lowerCaseFileSystemMetadata);
  102. var directoryService = new DirectoryService(fileSystemMock.Object);
  103. var lowerCaseDirResult = directoryService.GetDirectory(lowerCasePath);
  104. var lowerCaseFileResult = directoryService.GetFile(lowerCasePath);
  105. var upperCaseDirResult = directoryService.GetDirectory(upperCasePath);
  106. var upperCaseFileResult = directoryService.GetFile(upperCasePath);
  107. Assert.Null(lowerCaseDirResult);
  108. Assert.Equal(lowerCaseFileSystemMetadata, lowerCaseFileResult);
  109. Assert.Null(upperCaseDirResult);
  110. Assert.Null(upperCaseFileResult);
  111. }
  112. [Fact]
  113. public void GetDirectory_GivenFilePathsWithDifferentCasing_ReturnsCorrectDirectory()
  114. {
  115. const string lowerCasePath = "/music/someartist/Lyrics";
  116. var lowerCaseFileSystemMetadata = new FileSystemMetadata
  117. {
  118. FullName = lowerCasePath,
  119. IsDirectory = true,
  120. Exists = true
  121. };
  122. const string upperCasePath = "/music/SOMEARTIST/LYRICS";
  123. var upperCaseFileSystemMetadata = new FileSystemMetadata
  124. {
  125. FullName = upperCasePath,
  126. IsDirectory = true,
  127. Exists = false
  128. };
  129. var fileSystemMock = new Mock<IFileSystem>();
  130. fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == upperCasePath))).Returns(upperCaseFileSystemMetadata);
  131. fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == lowerCasePath))).Returns(lowerCaseFileSystemMetadata);
  132. var directoryService = new DirectoryService(fileSystemMock.Object);
  133. var lowerCaseDirResult = directoryService.GetDirectory(lowerCasePath);
  134. var lowerCaseFileResult = directoryService.GetFile(lowerCasePath);
  135. var upperCaseDirResult = directoryService.GetDirectory(upperCasePath);
  136. var upperCaseFileResult = directoryService.GetFile(upperCasePath);
  137. Assert.Equal(lowerCaseFileSystemMetadata, lowerCaseDirResult);
  138. Assert.Null(lowerCaseFileResult);
  139. Assert.Null(upperCaseDirResult);
  140. Assert.Null(upperCaseFileResult);
  141. }
  142. [Fact]
  143. public void GetFile_GivenCachedPath_ReturnsCachedFile()
  144. {
  145. const string path = "/music/someartist/song 1.mp3";
  146. var cachedFileSystemMetadata = new FileSystemMetadata
  147. {
  148. FullName = path,
  149. Exists = true
  150. };
  151. var newFileSystemMetadata = new FileSystemMetadata
  152. {
  153. FullName = "/music/SOMEARTIST/song 1.mp3",
  154. Exists = true
  155. };
  156. var fileSystemMock = new Mock<IFileSystem>();
  157. fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == path))).Returns(cachedFileSystemMetadata);
  158. var directoryService = new DirectoryService(fileSystemMock.Object);
  159. var result = directoryService.GetFile(path);
  160. fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == path))).Returns(newFileSystemMetadata);
  161. var secondResult = directoryService.GetFile(path);
  162. Assert.Equivalent(cachedFileSystemMetadata, result);
  163. Assert.Equivalent(cachedFileSystemMetadata, secondResult);
  164. }
  165. [Fact]
  166. public void GetFilePaths_GivenCachedFilePathWithoutClear_ReturnsOnlyCachedPaths()
  167. {
  168. const string path = "/music/someartist";
  169. var cachedPaths = new[]
  170. {
  171. "/music/someartist/song 1.mp3",
  172. "/music/someartist/song 2.mp3",
  173. "/music/someartist/song 3.mp3",
  174. "/music/someartist/song 4.mp3",
  175. };
  176. var newPaths = new[]
  177. {
  178. "/music/someartist/song 5.mp3",
  179. "/music/someartist/song 6.mp3",
  180. "/music/someartist/song 7.mp3",
  181. "/music/someartist/song 8.mp3",
  182. };
  183. var fileSystemMock = new Mock<IFileSystem>();
  184. fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(cachedPaths);
  185. var directoryService = new DirectoryService(fileSystemMock.Object);
  186. var result = directoryService.GetFilePaths(path);
  187. fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(newPaths);
  188. var secondResult = directoryService.GetFilePaths(path);
  189. Assert.Equal(cachedPaths, result);
  190. Assert.Equal(cachedPaths, secondResult);
  191. }
  192. [Fact]
  193. public void GetFilePaths_GivenCachedFilePathWithClear_ReturnsNewPaths()
  194. {
  195. const string path = "/music/someartist";
  196. var cachedPaths = new[]
  197. {
  198. "/music/someartist/song 1.mp3",
  199. "/music/someartist/song 2.mp3",
  200. "/music/someartist/song 3.mp3",
  201. "/music/someartist/song 4.mp3",
  202. };
  203. var newPaths = new[]
  204. {
  205. "/music/someartist/song 5.mp3",
  206. "/music/someartist/song 6.mp3",
  207. "/music/someartist/song 7.mp3",
  208. "/music/someartist/song 8.mp3",
  209. };
  210. var fileSystemMock = new Mock<IFileSystem>();
  211. fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(cachedPaths);
  212. var directoryService = new DirectoryService(fileSystemMock.Object);
  213. var result = directoryService.GetFilePaths(path);
  214. fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(newPaths);
  215. var secondResult = directoryService.GetFilePaths(path, true);
  216. Assert.Equal(cachedPaths, result);
  217. Assert.Equal(newPaths, secondResult);
  218. }
  219. }
  220. }