diff --git a/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs b/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs index f0300d75cc4f..d6943c8637a3 100644 --- a/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs +++ b/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Components.Endpoints.FormMapping; internal sealed class BrowserFileFromFormFile(IFormFile formFile) : IBrowserFile { - public string Name => formFile.Name; + public string Name => formFile.FileName; public DateTimeOffset LastModified => DateTimeOffset.Parse(formFile.Headers.LastModified.ToString(), CultureInfo.InvariantCulture); diff --git a/src/Components/Endpoints/test/Binding/FormDataMapperTests.cs b/src/Components/Endpoints/test/Binding/FormDataMapperTests.cs index 823c97143d9d..353ee3ce4da2 100644 --- a/src/Components/Endpoints/test/Binding/FormDataMapperTests.cs +++ b/src/Components/Endpoints/test/Binding/FormDataMapperTests.cs @@ -2024,7 +2024,7 @@ public void CanDeserialize_ComplexType_CanSerializerBrowserFile() // Assert var browserFile = Assert.IsAssignableFrom(result); - Assert.Equal("file", browserFile.Name); + Assert.Equal("file.txt", browserFile.Name); Assert.Equal(expectedString.Length, browserFile.Size); var buffer = new byte[browserFile.Size]; browserFile.OpenReadStream().Read(buffer); @@ -2059,18 +2059,18 @@ public void CanDeserialize_ComplexType_CanSerializerIReadOnlyListBrowserFile() var browserFiles = Assert.IsAssignableFrom>(result); // First file var browserFile1 = browserFiles[0]; - Assert.Equal("file", browserFile1.Name); + Assert.Equal("file1.txt", browserFile1.Name); Assert.Equal(expectedString1.Length, browserFile1.Size); var buffer1 = new byte[browserFile1.Size]; browserFile1.OpenReadStream().Read(buffer1); Assert.Equal(expectedString1, Encoding.UTF8.GetString(buffer1, 0, buffer1.Length)); // Second files - var browserFile2 = browserFiles[0]; - Assert.Equal("file", browserFile2.Name); - Assert.Equal(expectedString1.Length, browserFile2.Size); + var browserFile2 = browserFiles[1]; + Assert.Equal("file2.txt", browserFile2.Name); + Assert.Equal(expectedString2.Length, browserFile2.Size); var buffer2 = new byte[browserFile2.Size]; - browserFile1.OpenReadStream().Read(buffer2); - Assert.Equal(expectedString1, Encoding.UTF8.GetString(buffer2, 0, buffer2.Length)); + browserFile2.OpenReadStream().Read(buffer2); + Assert.Equal(expectedString2, Encoding.UTF8.GetString(buffer2, 0, buffer2.Length)); } [Fact] diff --git a/src/Components/Endpoints/test/FormMapping/BrowserFileFromFormFileTests.cs b/src/Components/Endpoints/test/FormMapping/BrowserFileFromFormFileTests.cs new file mode 100644 index 000000000000..26e84a170747 --- /dev/null +++ b/src/Components/Endpoints/test/FormMapping/BrowserFileFromFormFileTests.cs @@ -0,0 +1,105 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Globalization; +using Microsoft.AspNetCore.Components.Endpoints.FormMapping; +using Microsoft.AspNetCore.Components.Forms; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Primitives; +using Moq; + +namespace Microsoft.AspNetCore.Components.Endpoints.Tests.FormMapping; + +public class BrowserFileFromFormFileTests +{ + [Fact] + public void Name_ReturnsFormFileFileName_NotFormFileName() + { + // Arrange + const string expectedFileName = "document.pdf"; + const string formFieldName = "fileInput"; + + var mockFormFile = new Mock(); + mockFormFile.Setup(x => x.FileName).Returns(expectedFileName); + mockFormFile.Setup(x => x.Name).Returns(formFieldName); + + var browserFile = new BrowserFileFromFormFile(mockFormFile.Object); + + // Act + var actualName = browserFile.Name; + + // Assert + Assert.Equal(expectedFileName, actualName); + Assert.NotEqual(formFieldName, actualName); + } + + [Fact] + public void TryRead_IBrowserFile_ReturnsCorrectFileName() + { + // Arrange + const string prefixName = "fileInput"; + const string expectedFileName = "upload.txt"; + var culture = CultureInfo.GetCultureInfo("en-US"); + + var mockFormFile = new Mock(); + mockFormFile.Setup(x => x.FileName).Returns(expectedFileName); + mockFormFile.Setup(x => x.Name).Returns(prefixName); + + var formFileCollection = new Mock(); + formFileCollection.Setup(x => x.GetFile(prefixName)).Returns(mockFormFile.Object); + + var buffer = prefixName.ToCharArray().AsMemory(); + var reader = new FormDataReader(new Dictionary(), culture, buffer, formFileCollection.Object); + reader.PushPrefix(prefixName); + + var converter = new FileConverter(); + + // Act + var result = converter.TryRead(ref reader, typeof(IBrowserFile), default!, out var browserFile, out var found); + + // Assert + Assert.True(result); + Assert.True(found); + Assert.NotNull(browserFile); + Assert.Equal(expectedFileName, browserFile.Name); + } + + [Fact] + public void TryRead_IBrowserFileList_ReturnsCorrectFileNames() + { + // Arrange + const string prefixName = "fileInputs"; + const string expectedFileName1 = "file1.txt"; + const string expectedFileName2 = "file2.jpg"; + var culture = CultureInfo.GetCultureInfo("en-US"); + + var mockFormFile1 = new Mock(); + mockFormFile1.Setup(x => x.FileName).Returns(expectedFileName1); + mockFormFile1.Setup(x => x.Name).Returns(prefixName); + + var mockFormFile2 = new Mock(); + mockFormFile2.Setup(x => x.FileName).Returns(expectedFileName2); + mockFormFile2.Setup(x => x.Name).Returns(prefixName); + + var formFiles = new List { mockFormFile1.Object, mockFormFile2.Object }; + var formFileCollection = new Mock(); + formFileCollection.Setup(x => x.GetFiles(prefixName)).Returns(formFiles); + + var buffer = prefixName.ToCharArray().AsMemory(); + var reader = new FormDataReader(new Dictionary(), culture, buffer, formFileCollection.Object); + reader.PushPrefix(prefixName); + + var converter = new FileConverter>(); + + // Act + var result = converter.TryRead(ref reader, typeof(IReadOnlyList), default!, out var browserFiles, out var found); + + // Assert + Assert.True(result); + Assert.True(found); + Assert.NotNull(browserFiles); + Assert.Equal(2, browserFiles.Count); + Assert.Equal(expectedFileName1, browserFiles[0].Name); + Assert.Equal(expectedFileName2, browserFiles[1].Name); + } +} \ No newline at end of file diff --git a/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs b/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs index b6948f9b766c..d6dc438db468 100644 --- a/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs +++ b/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs @@ -1365,7 +1365,7 @@ public void CanBindToFormWithFiles() Assert.Equal($"Profile Picture: {profilePicture.Name}", Browser.Exists(By.Id("profile-picture")).Text); Assert.Equal("Documents: 2", Browser.Exists(By.Id("documents")).Text); Assert.Equal("Images: 3", Browser.Exists(By.Id("images")).Text); - Assert.Equal("Header Photo: Model.HeaderPhoto", Browser.Exists(By.Id("header-photo")).Text); + Assert.Equal($"Header Photo: {headerPhoto.Name}", Browser.Exists(By.Id("header-photo")).Text); Assert.Equal("Total: 7", Browser.Exists(By.Id("form-collection")).Text); }