Skip to content

Commit b8be11c

Browse files
vbreussvbtig
andcommitted
feat: add initializer options to create the temporary directory. (#305)
Add options to the FileSystemInitializer with the option to automatically create the temporary directory. If this is not set (or the file system is not initialized) `Path.GetTempPath()` will not exist. This fixes the issue in System.IO.Abstractions: TestableIO/System.IO.Abstractions#983 --------- Co-authored-by: Valentin Breuß <[email protected]>
1 parent 38b4f7c commit b8be11c

File tree

3 files changed

+39
-5
lines changed

3 files changed

+39
-5
lines changed

Source/Testably.Abstractions.Testing/FileSystemInitializerExtensions.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,18 @@ public static class FileSystemInitializerExtensions
1515
/// Initializes the <see cref="IFileSystem" /> in the working directory with test data.
1616
/// </summary>
1717
public static IFileSystemInitializer<TFileSystem> Initialize<TFileSystem>(
18-
this TFileSystem fileSystem)
18+
this TFileSystem fileSystem,
19+
Action<FileSystemInitializerOptions>? options = null)
1920
where TFileSystem : IFileSystem
20-
=> fileSystem.InitializeIn(".");
21+
=> fileSystem.InitializeIn(".", options);
2122

2223
/// <summary>
2324
/// Initializes the <see cref="IFileSystem" /> in the <paramref name="basePath" /> with test data.
2425
/// </summary>
2526
public static IFileSystemInitializer<TFileSystem> InitializeIn<TFileSystem>(
2627
this TFileSystem fileSystem,
27-
string basePath)
28+
string basePath,
29+
Action<FileSystemInitializerOptions>? options = null)
2830
where TFileSystem : IFileSystem
2931
{
3032
if (Path.IsPathRooted(basePath) &&
@@ -36,6 +38,13 @@ public static IFileSystemInitializer<TFileSystem> InitializeIn<TFileSystem>(
3638

3739
fileSystem.Directory.CreateDirectory(basePath);
3840
fileSystem.Directory.SetCurrentDirectory(basePath);
41+
FileSystemInitializerOptions optionsValue = new();
42+
options?.Invoke(optionsValue);
43+
if (optionsValue.InitializeTempDirectory)
44+
{
45+
fileSystem.Directory.CreateDirectory(Path.GetTempPath());
46+
}
47+
3948
return new FileSystemInitializer<TFileSystem>(fileSystem, ".");
4049
}
4150

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace Testably.Abstractions.Testing;
2+
3+
/// <summary>
4+
/// Options for the file system initializer.
5+
/// </summary>
6+
public class FileSystemInitializerOptions
7+
{
8+
/// <summary>
9+
/// If set to <see langword="true" /> create the directory at <see cref="System.IO.Path.GetTempPath()" />.
10+
/// </summary>
11+
public bool InitializeTempDirectory { get; set; } = true;
12+
}

Tests/Testably.Abstractions.Testing.Tests/FileSystemInitializerExtensionsTests.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void Initialize_WithAFile_WithExtension_ShouldCreateFileWithExtension(
3333
public void Initialize_WithASubdirectory_ShouldCreateDirectory()
3434
{
3535
MockFileSystem sut = new();
36-
sut.Initialize().WithASubdirectory();
36+
sut.InitializeIn("base-directory").WithASubdirectory();
3737

3838
sut.Directory.EnumerateDirectories(".").Should().ContainSingle();
3939
}
@@ -97,7 +97,7 @@ public void Initialize_WithFile_ShouldCreateFileWithGivenFileName(string fileNam
9797
public void Initialize_WithNestedSubdirectories_ShouldCreateAllNestedDirectories()
9898
{
9999
MockFileSystem sut = new();
100-
sut.Initialize()
100+
sut.InitializeIn("base-directory")
101101
.WithSubdirectory("foo").Initialized(d => d
102102
.WithSubdirectory("bar").Initialized(s => s
103103
.WithSubdirectory("xyz")));
@@ -111,6 +111,19 @@ public void Initialize_WithNestedSubdirectories_ShouldCreateAllNestedDirectories
111111
result.Should().Contain(sut.Path.Combine(".", "foo", "bar", "xyz"));
112112
}
113113

114+
[Theory]
115+
[InlineData(false)]
116+
[InlineData(true)]
117+
public void Initialize_WithOptions_ShouldConsiderValueOfInitializeTempDirectory(
118+
bool initializeTempDirectory)
119+
{
120+
MockFileSystem sut = new();
121+
122+
sut.Initialize(options => options.InitializeTempDirectory = initializeTempDirectory);
123+
124+
sut.Directory.Exists(sut.Path.GetTempPath()).Should().Be(initializeTempDirectory);
125+
}
126+
114127
[Theory]
115128
[AutoData]
116129
public void Initialize_WithSubdirectory_Existing_ShouldThrowTestingException(

0 commit comments

Comments
 (0)