diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj index 80f4694e4..d37fa44fe 100644 --- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj @@ -209,6 +209,7 @@ + diff --git a/src/Orchard.Tests/Stubs/StubFileSystem.cs b/src/Orchard.Tests/Stubs/StubFileSystem.cs index 332cef01a..7234b24e0 100644 --- a/src/Orchard.Tests/Stubs/StubFileSystem.cs +++ b/src/Orchard.Tests/Stubs/StubFileSystem.cs @@ -22,6 +22,18 @@ namespace Orchard.Tests.Stubs { public IList Entries { get; private set; } + public IEnumerable Files { + get { + return Entries.OfType(); + } + } + + public IEnumerable Directories { + get { + return Entries.OfType(); + } + } + public Entry GetEntry(string name) { if (string.IsNullOrEmpty(name)) throw new ArgumentException(); diff --git a/src/Orchard.Tests/Stubs/StubVirtualPathProvider.cs b/src/Orchard.Tests/Stubs/StubVirtualPathProvider.cs new file mode 100644 index 000000000..89a70f94e --- /dev/null +++ b/src/Orchard.Tests/Stubs/StubVirtualPathProvider.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Orchard.FileSystems.VirtualPath; +using Orchard.Services; + +namespace Orchard.Tests.Stubs { + public class StubVirtualPathProvider : IVirtualPathProvider { + private readonly StubFileSystem _fileSystem; + + public StubVirtualPathProvider(StubFileSystem fileSystem) { + _fileSystem = fileSystem; + } + + public StubFileSystem FileSystem { + get { return _fileSystem; } + } + + private string ToFileSystemPath(string path) { + if (path.StartsWith("~/")) + return path.Substring(2); + if (path.StartsWith("/")) + return path.Substring(1); + return path; + } + + public string Combine(params string[] paths) { + return Path.Combine(paths).Replace(Path.DirectorySeparatorChar, '/'); + } + + public string MapPath(string virtualPath) { + throw new NotImplementedException("Mapping to a physical file is not supported in Unit Test with this stub."); + } + + public bool FileExists(string virtualPath) { + return _fileSystem.GetFileEntry(ToFileSystemPath(virtualPath)) != null; + } + + public Stream OpenFile(string virtualPath) { + return _fileSystem.OpenFile(ToFileSystemPath(virtualPath)); + } + + public StreamWriter CreateText(string virtualPath) { + return new StreamWriter(_fileSystem.CreateFile(ToFileSystemPath(virtualPath))); + } + + public Stream CreateFile(string virtualPath) { + return _fileSystem.CreateFile(ToFileSystemPath(virtualPath)); + } + + public DateTime GetFileLastWriteTimeUtc(string virtualPath) { + return _fileSystem.GetFileEntry(ToFileSystemPath(virtualPath)).LastWriteTimeUtc; + } + + public bool DirectoryExists(string virtualPath) { + return _fileSystem.GetDirectoryEntry(ToFileSystemPath(virtualPath)) != null; + } + + public void CreateDirectory(string virtualPath) { + _fileSystem.CreateDirectoryEntry(ToFileSystemPath(virtualPath)); + } + + public string GetDirectoryName(string virtualPath) { + return Path.GetDirectoryName(virtualPath); + } + + public IEnumerable ListFiles(string path) { + return _fileSystem.GetDirectoryEntry(ToFileSystemPath(path)) + .Files + .Select(f => Combine(path, f.Name)); + } + + public IEnumerable ListDirectories(string path) { + return _fileSystem.GetDirectoryEntry(ToFileSystemPath(path)) + .Directories + .Select(f => Combine(path, f.Name)); + } + } +} \ No newline at end of file diff --git a/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs b/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs index bf4c1d4f7..0af81fad4 100644 --- a/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs +++ b/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs @@ -107,7 +107,7 @@ namespace Orchard.Environment.Extensions.Loaders { return new ExtensionProbeEntry { Descriptor = descriptor, - LastModificationTimeUtc = File.GetLastWriteTimeUtc(_virtualPathProvider.MapPath(projectPath)), + LastModificationTimeUtc = _virtualPathProvider.GetFileLastWriteTimeUtc(projectPath), Loader = this, VirtualPath = projectPath }; diff --git a/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs b/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs index 0883058ea..3313a4ff0 100644 --- a/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs +++ b/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs @@ -30,6 +30,10 @@ namespace Orchard.FileSystems.VirtualPath { return File.CreateText(MapPath(virtualPath)); } + public Stream CreateFile(string virtualPath) { + return File.Create(MapPath(virtualPath)); + } + public DateTime GetFileLastWriteTimeUtc(string virtualPath) { return File.GetLastWriteTimeUtc(MapPath(virtualPath)); } diff --git a/src/Orchard/FileSystems/VirtualPath/IVirtualPathProvider.cs b/src/Orchard/FileSystems/VirtualPath/IVirtualPathProvider.cs index 2fa00229f..6b012cd75 100644 --- a/src/Orchard/FileSystems/VirtualPath/IVirtualPathProvider.cs +++ b/src/Orchard/FileSystems/VirtualPath/IVirtualPathProvider.cs @@ -11,6 +11,7 @@ namespace Orchard.FileSystems.VirtualPath { bool FileExists(string virtualPath); Stream OpenFile(string virtualPath); StreamWriter CreateText(string virtualPath); + Stream CreateFile(string virtualPath); DateTime GetFileLastWriteTimeUtc(string virtualPath); bool DirectoryExists(string virtualPath);