Skip to content

Commit 305395d

Browse files
author
Birnsen
committed
Add support for default values on stream creation
1 parent 4e6e3ac commit 305395d

File tree

7 files changed

+66
-2
lines changed

7 files changed

+66
-2
lines changed

src/System.IO.Abstractions.TestingHelpers/IMockFileDataAccessor.cs

+5
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ public interface IMockFileDataAccessor : IFileSystem
7777
/// </summary>
7878
PathVerifier PathVerifier { get; }
7979

80+
/// <summary>
81+
/// Get if attributes for a file created via stream should be set to default or not
82+
/// </summary>
83+
bool SetAttributesOnStreamCreation { get; }
84+
8085
/// <summary>
8186
/// Gets a reference to the underlying file system.
8287
/// </summary>

src/System.IO.Abstractions.TestingHelpers/MockFile.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,10 @@ private Stream CreateInternal(string path, FileAccess access, FileOptions option
150150
mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, nameof(path));
151151
VerifyDirectoryExists(path);
152152

153-
var mockFileData = new MockFileData(new byte[0]);
153+
var mockFileData = mockFileDataAccessor.SetAttributesOnStreamCreation
154+
? MockFileData.NewObject
155+
: new MockFileData(Array.Empty<byte>());
156+
154157
mockFileDataAccessor.AddFile(path, mockFileData);
155158
return OpenInternal(path, FileMode.Open, access, options);
156159
}

src/System.IO.Abstractions.TestingHelpers/MockFileData.cs

+8
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ public class MockFileData
2727
Attributes = (FileAttributes)(-1),
2828
};
2929

30+
internal static readonly MockFileData NewObject = new MockFileData(string.Empty)
31+
{
32+
CreationTime = DateTime.Now,
33+
LastWriteTime = DateTime.Now,
34+
LastAccessTime = DateTime.Now,
35+
Attributes = FileAttributes.Normal,
36+
};
37+
3038
/// <summary>
3139
/// Gets the default date time offset.
3240
/// E.g. for not existing files.

src/System.IO.Abstractions.TestingHelpers/MockFileStream.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ public MockFileStream(
5959
throw CommonExceptions.FileNotFound(path);
6060
}
6161

62-
mockFileDataAccessor.AddFile(path, new MockFileData(new byte[] { }));
62+
var mfd = mockFileDataAccessor.SetAttributesOnStreamCreation
63+
? MockFileData.NewObject
64+
: new MockFileData(Array.Empty<byte>());
65+
66+
mockFileDataAccessor.AddFile(path, mfd);
6367
}
6468

6569
this.access = access;

src/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs

+2
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ public MockFileSystem(IDictionary<string, MockFileData> files, string currentDir
8787
public IFileSystem FileSystem => this;
8888
/// <inheritdoc />
8989
public PathVerifier PathVerifier => pathVerifier;
90+
/// <inheritdoc/>
91+
public bool SetAttributesOnStreamCreation { get; set; }
9092

9193
private string FixPath(string path, bool checkCaps = false)
9294
{

tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileInfoTests.cs

+22
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,28 @@ public void MockFileInfo_CreateText_ShouldUpdateCachedDataAndReturnTrueForExists
853853
Assert.IsTrue(fileInfo.Exists);
854854
}
855855

856+
[Test]
857+
public void MockFileInfo_Create_ShouldSetProperDefaultAttributes()
858+
{
859+
// Arrange
860+
var fileSystem = new MockFileSystem();
861+
fileSystem.SetAttributesOnStreamCreation = true;
862+
var file = XFS.Path(@"C:\test\test.txt");
863+
var fi = fileSystem.FileInfo.FromFileName(file);
864+
if (!fi.Directory.Exists)
865+
{
866+
fi.Directory.Create();
867+
}
868+
869+
// Act
870+
using (var stream = fi.Create())
871+
{
872+
// Assert
873+
Assert.AreEqual(FileAttributes.Normal, fi.Attributes);
874+
Assert.LessOrEqual(DateTime.Now - fi.CreationTime, TimeSpan.FromSeconds(1));
875+
}
876+
}
877+
856878
[Test]
857879
public void MockFileInfo_Delete_ShouldUpdateCachedDataAndReturnFalseForExists()
858880
{

tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs

+20
Original file line numberDiff line numberDiff line change
@@ -184,5 +184,25 @@ public void MockFileStream_Flush_ShouldNotChangePosition()
184184
Assert.AreEqual(200, stream.Position);
185185
}
186186
}
187+
188+
[Test]
189+
public void MockFileStream_Create_ShouldSetProperDefaultAttributes()
190+
{
191+
// Arrange
192+
var fileSystem = new MockFileSystem();
193+
fileSystem.SetAttributesOnStreamCreation = true;
194+
var dir = XFS.Path(@"C:\test\");
195+
var file = XFS.Path(@"C:\test\test.txt");
196+
fileSystem.Directory.CreateDirectory(dir);
197+
198+
// Act
199+
using (var stream = fileSystem.FileStream.Create(file, FileMode.Create))
200+
{
201+
var fi = fileSystem.FileInfo.FromFileName(file);
202+
// Assert
203+
Assert.AreEqual(FileAttributes.Normal, fi.Attributes);
204+
Assert.LessOrEqual(DateTime.Now - fi.CreationTime, TimeSpan.FromSeconds(1));
205+
}
206+
}
187207
}
188208
}

0 commit comments

Comments
 (0)