Skip to content

Commit dc08c2e

Browse files
Copilotjaviercn
andcommitted
Fix IBrowserFile Name property to use FileName instead of Name and add tests
Co-authored-by: javiercn <[email protected]>
1 parent 3a47882 commit dc08c2e

File tree

4 files changed

+115
-153
lines changed

4 files changed

+115
-153
lines changed

src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Globalization;
45
using Microsoft.AspNetCore.Components.Forms;
56
using Microsoft.AspNetCore.Http;
6-
using Microsoft.Net.Http.Headers;
77

88
namespace Microsoft.AspNetCore.Components.Endpoints.FormMapping;
99

1010
internal sealed class BrowserFileFromFormFile(IFormFile formFile) : IBrowserFile
1111
{
12-
public string Name => formFile.Name;
12+
public string Name => formFile.FileName;
1313

14-
public DateTimeOffset LastModified =>
15-
HeaderUtilities.TryParseDate(formFile.Headers.LastModified.ToString(), out var lastModified)
16-
? lastModified
17-
: DateTimeOffset.MinValue;
14+
public DateTimeOffset LastModified => DateTimeOffset.Parse(formFile.Headers.LastModified.ToString(), CultureInfo.InvariantCulture);
1815

1916
public long Size => formFile.Length;
2017

src/Components/Endpoints/test/Binding/FormDataMapperTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2024,7 +2024,7 @@ public void CanDeserialize_ComplexType_CanSerializerBrowserFile()
20242024

20252025
// Assert
20262026
var browserFile = Assert.IsAssignableFrom<IBrowserFile>(result);
2027-
Assert.Equal("file", browserFile.Name);
2027+
Assert.Equal("file.txt", browserFile.Name);
20282028
Assert.Equal(expectedString.Length, browserFile.Size);
20292029
var buffer = new byte[browserFile.Size];
20302030
browserFile.OpenReadStream().Read(buffer);
@@ -2059,18 +2059,18 @@ public void CanDeserialize_ComplexType_CanSerializerIReadOnlyListBrowserFile()
20592059
var browserFiles = Assert.IsAssignableFrom<IReadOnlyList<IBrowserFile>>(result);
20602060
// First file
20612061
var browserFile1 = browserFiles[0];
2062-
Assert.Equal("file", browserFile1.Name);
2062+
Assert.Equal("file1.txt", browserFile1.Name);
20632063
Assert.Equal(expectedString1.Length, browserFile1.Size);
20642064
var buffer1 = new byte[browserFile1.Size];
20652065
browserFile1.OpenReadStream().Read(buffer1);
20662066
Assert.Equal(expectedString1, Encoding.UTF8.GetString(buffer1, 0, buffer1.Length));
20672067
// Second files
2068-
var browserFile2 = browserFiles[0];
2069-
Assert.Equal("file", browserFile2.Name);
2070-
Assert.Equal(expectedString1.Length, browserFile2.Size);
2068+
var browserFile2 = browserFiles[1];
2069+
Assert.Equal("file2.txt", browserFile2.Name);
2070+
Assert.Equal(expectedString2.Length, browserFile2.Size);
20712071
var buffer2 = new byte[browserFile2.Size];
2072-
browserFile1.OpenReadStream().Read(buffer2);
2073-
Assert.Equal(expectedString1, Encoding.UTF8.GetString(buffer2, 0, buffer2.Length));
2072+
browserFile2.OpenReadStream().Read(buffer2);
2073+
Assert.Equal(expectedString2, Encoding.UTF8.GetString(buffer2, 0, buffer2.Length));
20742074
}
20752075

20762076
[Fact]
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Globalization;
5+
using Microsoft.AspNetCore.Components.Endpoints.FormMapping;
6+
using Microsoft.AspNetCore.Components.Forms;
7+
using Microsoft.AspNetCore.Http;
8+
using Microsoft.Extensions.Primitives;
9+
using Moq;
10+
11+
namespace Microsoft.AspNetCore.Components.Endpoints.Tests.FormMapping;
12+
13+
public class BrowserFileFromFormFileTests
14+
{
15+
[Fact]
16+
public void Name_ReturnsFormFileFileName_NotFormFileName()
17+
{
18+
// Arrange
19+
const string expectedFileName = "document.pdf";
20+
const string formFieldName = "fileInput";
21+
22+
var mockFormFile = new Mock<IFormFile>();
23+
mockFormFile.Setup(x => x.FileName).Returns(expectedFileName);
24+
mockFormFile.Setup(x => x.Name).Returns(formFieldName);
25+
26+
var browserFile = new BrowserFileFromFormFile(mockFormFile.Object);
27+
28+
// Act
29+
var actualName = browserFile.Name;
30+
31+
// Assert
32+
Assert.Equal(expectedFileName, actualName);
33+
Assert.NotEqual(formFieldName, actualName);
34+
}
35+
36+
[Fact]
37+
public void TryRead_IBrowserFile_ReturnsCorrectFileName()
38+
{
39+
// Arrange
40+
const string prefixName = "fileInput";
41+
const string expectedFileName = "upload.txt";
42+
var culture = CultureInfo.GetCultureInfo("en-US");
43+
44+
var mockFormFile = new Mock<IFormFile>();
45+
mockFormFile.Setup(x => x.FileName).Returns(expectedFileName);
46+
mockFormFile.Setup(x => x.Name).Returns(prefixName);
47+
48+
var formFileCollection = new Mock<IFormFileCollection>();
49+
formFileCollection.Setup(x => x.GetFile(prefixName)).Returns(mockFormFile.Object);
50+
51+
var buffer = prefixName.ToCharArray().AsMemory();
52+
var reader = new FormDataReader(new Dictionary<FormKey, StringValues>(), culture, buffer, formFileCollection.Object);
53+
reader.PushPrefix(prefixName);
54+
55+
var converter = new FileConverter<IBrowserFile>();
56+
57+
// Act
58+
var result = converter.TryRead(ref reader, typeof(IBrowserFile), default!, out var browserFile, out var found);
59+
60+
// Assert
61+
Assert.True(result);
62+
Assert.True(found);
63+
Assert.NotNull(browserFile);
64+
Assert.Equal(expectedFileName, browserFile.Name);
65+
}
66+
67+
[Fact]
68+
public void TryRead_IBrowserFileList_ReturnsCorrectFileNames()
69+
{
70+
// Arrange
71+
const string prefixName = "fileInputs";
72+
const string expectedFileName1 = "file1.txt";
73+
const string expectedFileName2 = "file2.jpg";
74+
var culture = CultureInfo.GetCultureInfo("en-US");
75+
76+
var mockFormFile1 = new Mock<IFormFile>();
77+
mockFormFile1.Setup(x => x.FileName).Returns(expectedFileName1);
78+
mockFormFile1.Setup(x => x.Name).Returns(prefixName);
79+
80+
var mockFormFile2 = new Mock<IFormFile>();
81+
mockFormFile2.Setup(x => x.FileName).Returns(expectedFileName2);
82+
mockFormFile2.Setup(x => x.Name).Returns(prefixName);
83+
84+
var formFiles = new List<IFormFile> { mockFormFile1.Object, mockFormFile2.Object };
85+
var formFileCollection = new Mock<IFormFileCollection>();
86+
formFileCollection.Setup(x => x.GetFiles(prefixName)).Returns(formFiles);
87+
88+
var buffer = prefixName.ToCharArray().AsMemory();
89+
var reader = new FormDataReader(new Dictionary<FormKey, StringValues>(), culture, buffer, formFileCollection.Object);
90+
reader.PushPrefix(prefixName);
91+
92+
var converter = new FileConverter<IReadOnlyList<IBrowserFile>>();
93+
94+
// Act
95+
var result = converter.TryRead(ref reader, typeof(IReadOnlyList<IBrowserFile>), default!, out var browserFiles, out var found);
96+
97+
// Assert
98+
Assert.True(result);
99+
Assert.True(found);
100+
Assert.NotNull(browserFiles);
101+
Assert.Equal(2, browserFiles.Count);
102+
Assert.Equal(expectedFileName1, browserFiles[0].Name);
103+
Assert.Equal(expectedFileName2, browserFiles[1].Name);
104+
}
105+
}

src/Components/Endpoints/test/FormMapping/Converters/FileConverterTests.cs

Lines changed: 0 additions & 140 deletions
This file was deleted.

0 commit comments

Comments
 (0)