using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Metadata; namespace ErsatzTV.Scanner.Tests.Core.Fakes; public class FakeLocalFileSystem : ILocalFileSystem { public static readonly byte[] TestBytes = { 1, 2, 3, 4, 5 }; private readonly List _files; private readonly List _folders; public FakeLocalFileSystem(List files) : this(files, new List()) { } public FakeLocalFileSystem(List files, List folders) { _files = files; var allFolders = new List(folders.Map(f => f.Path)); foreach (FakeFileEntry file in _files) { List moreFolders = Split(new DirectoryInfo(Path.GetDirectoryName(file.Path) ?? string.Empty)); allFolders.AddRange(moreFolders.Map(i => i.FullName)); } _folders = allFolders.Distinct().Map(f => new FakeFolderEntry(f)).ToList(); } public Unit EnsureFolderExists(string folder) => Unit.Default; public DateTime GetLastWriteTime(string path) => Optional(_files.SingleOrDefault(f => f.Path == path)) .Map(f => f.LastWriteTime) .IfNone(SystemTime.MinValueUtc); public bool IsLibraryPathAccessible(LibraryPath libraryPath) => _folders.Any(f => f.Path == libraryPath.Path); public IEnumerable ListSubdirectories(string folder) => _folders.Map(f => f.Path).Filter(f => f.StartsWith(folder) && Directory.GetParent(f)?.FullName == folder); public IEnumerable ListFiles(string folder) => _files.Map(f => f.Path).Filter(f => Path.GetDirectoryName(f) == folder); // TODO: this isn't accurate, need to use search pattern public IEnumerable ListFiles(string folder, string searchPattern) => _files.Map(f => f.Path).Filter(f => Path.GetDirectoryName(f) == folder); public bool FileExists(string path) => _files.Any(f => f.Path == path); public bool FolderExists(string folder) => false; public Task> CopyFile(string source, string destination) => Task.FromResult(Right(Unit.Default)); public Unit EmptyFolder(string folder) => Unit.Default; public Task ReadAllBytes(string path) => TestBytes.AsTask(); private static List Split(DirectoryInfo path) { var result = new List(); if (path == null || string.IsNullOrWhiteSpace(path.FullName)) { return result; } if (path.Parent != null) { result.AddRange(Split(path.Parent)); } result.Add(path); return result; } }