| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 | using System.Linq;using MediaBrowser.Controller.Providers;using MediaBrowser.Model.IO;using Moq;using Xunit;namespace Jellyfin.Controller.Tests{    public class DirectoryServiceTests    {        private const string LowerCasePath = "/music/someartist";        private const string UpperCasePath = "/music/SOMEARTIST";        private static readonly FileSystemMetadata[] _lowerCaseFileSystemMetadata =        {            new()            {                FullName = LowerCasePath + "/Artwork",                IsDirectory = true            },            new()            {                FullName = LowerCasePath + "/Some Other Folder",                IsDirectory = true            },            new()            {                FullName = LowerCasePath + "/Song 2.mp3",                IsDirectory = false            },            new()            {                FullName = LowerCasePath + "/Song 3.mp3",                IsDirectory = false            }        };        private static readonly FileSystemMetadata[] _upperCaseFileSystemMetadata =        {            new()            {                FullName = UpperCasePath + "/Lyrics",                IsDirectory = true            },            new()            {                FullName = UpperCasePath + "/Song 1.mp3",                IsDirectory = false            }        };        [Fact]        public void GetFileSystemEntries_GivenPathsWithDifferentCasing_CachesAll()        {            var fileSystemMock = new Mock<IFileSystem>();            fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == UpperCasePath), false)).Returns(_upperCaseFileSystemMetadata);            fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == LowerCasePath), false)).Returns(_lowerCaseFileSystemMetadata);            var directoryService = new DirectoryService(fileSystemMock.Object);            var upperCaseResult = directoryService.GetFileSystemEntries(UpperCasePath);            var lowerCaseResult = directoryService.GetFileSystemEntries(LowerCasePath);            Assert.Equal(_upperCaseFileSystemMetadata, upperCaseResult);            Assert.Equal(_lowerCaseFileSystemMetadata, lowerCaseResult);        }        [Fact]        public void GetFiles_GivenPathsWithDifferentCasing_ReturnsCorrectFiles()        {            var fileSystemMock = new Mock<IFileSystem>();            fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == UpperCasePath), false)).Returns(_upperCaseFileSystemMetadata);            fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == LowerCasePath), false)).Returns(_lowerCaseFileSystemMetadata);            var directoryService = new DirectoryService(fileSystemMock.Object);            var upperCaseResult = directoryService.GetFiles(UpperCasePath);            var lowerCaseResult = directoryService.GetFiles(LowerCasePath);            Assert.Equal(_upperCaseFileSystemMetadata.Where(f => !f.IsDirectory), upperCaseResult);            Assert.Equal(_lowerCaseFileSystemMetadata.Where(f => !f.IsDirectory), lowerCaseResult);        }        [Fact]        public void GetDirectories_GivenPathsWithDifferentCasing_ReturnsCorrectDirectories()        {            var fileSystemMock = new Mock<IFileSystem>();            fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == UpperCasePath), false)).Returns(_upperCaseFileSystemMetadata);            fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == LowerCasePath), false)).Returns(_lowerCaseFileSystemMetadata);            var directoryService = new DirectoryService(fileSystemMock.Object);            var upperCaseResult = directoryService.GetDirectories(UpperCasePath);            var lowerCaseResult = directoryService.GetDirectories(LowerCasePath);            Assert.Equal(_upperCaseFileSystemMetadata.Where(f => f.IsDirectory), upperCaseResult);            Assert.Equal(_lowerCaseFileSystemMetadata.Where(f => f.IsDirectory), lowerCaseResult);        }        [Fact]        public void GetFile_GivenFilePathsWithDifferentCasing_ReturnsCorrectFile()        {            const string lowerCasePath = "/music/someartist/song 1.mp3";            var lowerCaseFileSystemMetadata = new FileSystemMetadata            {                FullName = lowerCasePath,                Exists = true            };            const string upperCasePath = "/music/SOMEARTIST/SONG 1.mp3";            var upperCaseFileSystemMetadata = new FileSystemMetadata            {                FullName = upperCasePath,                Exists = false            };            var fileSystemMock = new Mock<IFileSystem>();            fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == upperCasePath))).Returns(upperCaseFileSystemMetadata);            fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == lowerCasePath))).Returns(lowerCaseFileSystemMetadata);            var directoryService = new DirectoryService(fileSystemMock.Object);            var lowerCaseDirResult = directoryService.GetDirectory(lowerCasePath);            var lowerCaseFileResult = directoryService.GetFile(lowerCasePath);            var upperCaseDirResult = directoryService.GetDirectory(upperCasePath);            var upperCaseFileResult = directoryService.GetFile(upperCasePath);            Assert.Null(lowerCaseDirResult);            Assert.Equal(lowerCaseFileSystemMetadata, lowerCaseFileResult);            Assert.Null(upperCaseDirResult);            Assert.Null(upperCaseFileResult);        }        [Fact]        public void GetDirectory_GivenFilePathsWithDifferentCasing_ReturnsCorrectDirectory()        {            const string lowerCasePath = "/music/someartist/Lyrics";            var lowerCaseFileSystemMetadata = new FileSystemMetadata            {                FullName = lowerCasePath,                IsDirectory = true,                Exists = true            };            const string upperCasePath = "/music/SOMEARTIST/LYRICS";            var upperCaseFileSystemMetadata = new FileSystemMetadata            {                FullName = upperCasePath,                IsDirectory = true,                Exists = false            };            var fileSystemMock = new Mock<IFileSystem>();            fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == upperCasePath))).Returns(upperCaseFileSystemMetadata);            fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == lowerCasePath))).Returns(lowerCaseFileSystemMetadata);            var directoryService = new DirectoryService(fileSystemMock.Object);            var lowerCaseDirResult = directoryService.GetDirectory(lowerCasePath);            var lowerCaseFileResult = directoryService.GetFile(lowerCasePath);            var upperCaseDirResult = directoryService.GetDirectory(upperCasePath);            var upperCaseFileResult = directoryService.GetFile(upperCasePath);            Assert.Equal(lowerCaseFileSystemMetadata, lowerCaseDirResult);            Assert.Null(lowerCaseFileResult);            Assert.Null(upperCaseDirResult);            Assert.Null(upperCaseFileResult);        }        [Fact]        public void GetFile_GivenCachedPath_ReturnsCachedFile()        {            const string path = "/music/someartist/song 1.mp3";            var cachedFileSystemMetadata = new FileSystemMetadata            {                FullName = path,                Exists = true            };            var newFileSystemMetadata = new FileSystemMetadata            {                FullName = "/music/SOMEARTIST/song 1.mp3",                Exists = true            };            var fileSystemMock = new Mock<IFileSystem>();            fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == path))).Returns(cachedFileSystemMetadata);            var directoryService = new DirectoryService(fileSystemMock.Object);            var result = directoryService.GetFile(path);            fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == path))).Returns(newFileSystemMetadata);            var secondResult = directoryService.GetFile(path);            Assert.Equivalent(cachedFileSystemMetadata, result);            Assert.Equivalent(cachedFileSystemMetadata, secondResult);        }        [Fact]        public void GetFilePaths_GivenCachedFilePathWithoutClear_ReturnsOnlyCachedPaths()        {            const string path = "/music/someartist";            var cachedPaths = new[]            {                "/music/someartist/song 1.mp3",                "/music/someartist/song 2.mp3",                "/music/someartist/song 3.mp3",                "/music/someartist/song 4.mp3",            };            var newPaths = new[]            {                "/music/someartist/song 5.mp3",                "/music/someartist/song 6.mp3",                "/music/someartist/song 7.mp3",                "/music/someartist/song 8.mp3",            };            var fileSystemMock = new Mock<IFileSystem>();            fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(cachedPaths);            var directoryService = new DirectoryService(fileSystemMock.Object);            var result = directoryService.GetFilePaths(path);            fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(newPaths);            var secondResult = directoryService.GetFilePaths(path);            Assert.Equal(cachedPaths, result);            Assert.Equal(cachedPaths, secondResult);        }        [Fact]        public void GetFilePaths_GivenCachedFilePathWithClear_ReturnsNewPaths()        {            const string path = "/music/someartist";            var cachedPaths = new[]            {                "/music/someartist/song 1.mp3",                "/music/someartist/song 2.mp3",                "/music/someartist/song 3.mp3",                "/music/someartist/song 4.mp3",            };            var newPaths = new[]            {                "/music/someartist/song 5.mp3",                "/music/someartist/song 6.mp3",                "/music/someartist/song 7.mp3",                "/music/someartist/song 8.mp3",            };            var fileSystemMock = new Mock<IFileSystem>();            fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(cachedPaths);            var directoryService = new DirectoryService(fileSystemMock.Object);            var result = directoryService.GetFilePaths(path);            fileSystemMock.Setup(f => f.GetFilePaths(It.Is<string>(x => x == path), false)).Returns(newPaths);            var secondResult = directoryService.GetFilePaths(path, true);            Assert.Equal(cachedPaths, result);            Assert.Equal(newPaths, secondResult);        }    }}
 |