From 184891a1610640d2417cb7b9a388f9181cafd954 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:27:03 +0000 Subject: [PATCH 1/5] Initial plan From 3a47882d7184350fa6adcd5cbf00ad50560143c1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:44:43 +0000 Subject: [PATCH 2/5] Fix IBrowserFile LastModified header parsing issue and add tests Co-authored-by: javiercn <6995051+javiercn@users.noreply.github.com> --- .../FormMapping/BrowserFileFromFormFile.cs | 7 +- .../Converters/FileConverterTests.cs | 140 ++++++++++++++++++ 2 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 src/Components/Endpoints/test/FormMapping/Converters/FileConverterTests.cs diff --git a/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs b/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs index f0300d75cc4f..36a2e644ecbe 100644 --- a/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs +++ b/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs @@ -1,9 +1,9 @@ // 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.Forms; using Microsoft.AspNetCore.Http; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Components.Endpoints.FormMapping; @@ -11,7 +11,10 @@ internal sealed class BrowserFileFromFormFile(IFormFile formFile) : IBrowserFile { public string Name => formFile.Name; - public DateTimeOffset LastModified => DateTimeOffset.Parse(formFile.Headers.LastModified.ToString(), CultureInfo.InvariantCulture); + public DateTimeOffset LastModified => + HeaderUtilities.TryParseDate(formFile.Headers.LastModified.ToString(), out var lastModified) + ? lastModified + : DateTimeOffset.MinValue; public long Size => formFile.Length; diff --git a/src/Components/Endpoints/test/FormMapping/Converters/FileConverterTests.cs b/src/Components/Endpoints/test/FormMapping/Converters/FileConverterTests.cs new file mode 100644 index 000000000000..cabe555643f9 --- /dev/null +++ b/src/Components/Endpoints/test/FormMapping/Converters/FileConverterTests.cs @@ -0,0 +1,140 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable enable + +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 FileConverterTests +{ + [Fact] + public void TryRead_IBrowserFile_WithMissingLastModifiedHeader_ReturnsMinValue() + { + // Arrange + const string prefixName = "file"; + var culture = CultureInfo.GetCultureInfo("en-US"); + + var mockFormFile = CreateMockFormFile(); + 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(DateTimeOffset.MinValue, browserFile.LastModified); + } + + [Fact] + public void TryRead_IBrowserFile_WithMalformedLastModifiedHeader_ReturnsMinValue() + { + // Arrange + const string prefixName = "file"; + var culture = CultureInfo.GetCultureInfo("en-US"); + + var mockFormFile = CreateMockFormFile(lastModified: "invalid-date"); + 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(DateTimeOffset.MinValue, browserFile.LastModified); + } + + [Fact] + public void TryRead_IBrowserFile_WithValidLastModifiedHeader_ReturnsCorrectValue() + { + // Arrange + const string prefixName = "file"; + var culture = CultureInfo.GetCultureInfo("en-US"); + var expectedDate = new DateTimeOffset(2023, 11, 30, 12, 0, 0, TimeSpan.Zero); + + var mockFormFile = CreateMockFormFile(lastModified: expectedDate.ToString("r")); + 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(expectedDate, browserFile.LastModified); + } + + [Fact] + public void TryRead_IBrowserFile_WithEmptyLastModifiedHeader_ReturnsMinValue() + { + // Arrange + const string prefixName = "file"; + var culture = CultureInfo.GetCultureInfo("en-US"); + + var mockFormFile = CreateMockFormFile(lastModified: string.Empty); + 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(DateTimeOffset.MinValue, browserFile.LastModified); + } + + private static Mock CreateMockFormFile(string? lastModified = null!) + { + var mockFormFile = new Mock(); + var mockHeaders = new Mock(); + + mockHeaders.Setup(x => x.LastModified).Returns(new StringValues(lastModified)); + mockFormFile.Setup(x => x.Headers).Returns(mockHeaders.Object); + mockFormFile.Setup(x => x.Name).Returns("testfile.txt"); + mockFormFile.Setup(x => x.ContentType).Returns("text/plain"); + mockFormFile.Setup(x => x.Length).Returns(1024); + mockFormFile.Setup(x => x.OpenReadStream()).Returns(new MemoryStream()); + + return mockFormFile; + } +} \ No newline at end of file From dc08c2e529b0ee12f49aa2941b6fbc863964bb02 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 13 Aug 2025 16:47:55 +0000 Subject: [PATCH 3/5] Fix IBrowserFile Name property to use FileName instead of Name and add tests Co-authored-by: javiercn <6995051+javiercn@users.noreply.github.com> --- .../FormMapping/BrowserFileFromFormFile.cs | 9 +- .../test/Binding/FormDataMapperTests.cs | 14 +- .../BrowserFileFromFormFileTests.cs | 105 +++++++++++++ .../Converters/FileConverterTests.cs | 140 ------------------ 4 files changed, 115 insertions(+), 153 deletions(-) create mode 100644 src/Components/Endpoints/test/FormMapping/BrowserFileFromFormFileTests.cs delete mode 100644 src/Components/Endpoints/test/FormMapping/Converters/FileConverterTests.cs diff --git a/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs b/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs index 36a2e644ecbe..d6943c8637a3 100644 --- a/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs +++ b/src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs @@ -1,20 +1,17 @@ // 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.Forms; using Microsoft.AspNetCore.Http; -using Microsoft.Net.Http.Headers; 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 => - HeaderUtilities.TryParseDate(formFile.Headers.LastModified.ToString(), out var lastModified) - ? lastModified - : DateTimeOffset.MinValue; + public DateTimeOffset LastModified => DateTimeOffset.Parse(formFile.Headers.LastModified.ToString(), CultureInfo.InvariantCulture); public long Size => formFile.Length; 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/Endpoints/test/FormMapping/Converters/FileConverterTests.cs b/src/Components/Endpoints/test/FormMapping/Converters/FileConverterTests.cs deleted file mode 100644 index cabe555643f9..000000000000 --- a/src/Components/Endpoints/test/FormMapping/Converters/FileConverterTests.cs +++ /dev/null @@ -1,140 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -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 FileConverterTests -{ - [Fact] - public void TryRead_IBrowserFile_WithMissingLastModifiedHeader_ReturnsMinValue() - { - // Arrange - const string prefixName = "file"; - var culture = CultureInfo.GetCultureInfo("en-US"); - - var mockFormFile = CreateMockFormFile(); - 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(DateTimeOffset.MinValue, browserFile.LastModified); - } - - [Fact] - public void TryRead_IBrowserFile_WithMalformedLastModifiedHeader_ReturnsMinValue() - { - // Arrange - const string prefixName = "file"; - var culture = CultureInfo.GetCultureInfo("en-US"); - - var mockFormFile = CreateMockFormFile(lastModified: "invalid-date"); - 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(DateTimeOffset.MinValue, browserFile.LastModified); - } - - [Fact] - public void TryRead_IBrowserFile_WithValidLastModifiedHeader_ReturnsCorrectValue() - { - // Arrange - const string prefixName = "file"; - var culture = CultureInfo.GetCultureInfo("en-US"); - var expectedDate = new DateTimeOffset(2023, 11, 30, 12, 0, 0, TimeSpan.Zero); - - var mockFormFile = CreateMockFormFile(lastModified: expectedDate.ToString("r")); - 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(expectedDate, browserFile.LastModified); - } - - [Fact] - public void TryRead_IBrowserFile_WithEmptyLastModifiedHeader_ReturnsMinValue() - { - // Arrange - const string prefixName = "file"; - var culture = CultureInfo.GetCultureInfo("en-US"); - - var mockFormFile = CreateMockFormFile(lastModified: string.Empty); - 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(DateTimeOffset.MinValue, browserFile.LastModified); - } - - private static Mock CreateMockFormFile(string? lastModified = null!) - { - var mockFormFile = new Mock(); - var mockHeaders = new Mock(); - - mockHeaders.Setup(x => x.LastModified).Returns(new StringValues(lastModified)); - mockFormFile.Setup(x => x.Headers).Returns(mockHeaders.Object); - mockFormFile.Setup(x => x.Name).Returns("testfile.txt"); - mockFormFile.Setup(x => x.ContentType).Returns("text/plain"); - mockFormFile.Setup(x => x.Length).Returns(1024); - mockFormFile.Setup(x => x.OpenReadStream()).Returns(new MemoryStream()); - - return mockFormFile; - } -} \ No newline at end of file From d2497e33bf211d84d09d22a66a5f1e14841893b6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 13 Aug 2025 17:23:26 +0000 Subject: [PATCH 4/5] Add E2E test for IBrowserFile.Name property mapping to verify file name vs form field name Co-authored-by: javiercn <6995051+javiercn@users.noreply.github.com> --- .../FormWithParentBindingContextTest.cs | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs b/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs index b6948f9b766c..32a880310a5f 100644 --- a/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs +++ b/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs @@ -1365,10 +1365,39 @@ 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); } + [Fact] + public void IBrowserFileNameReturnsFileNameNotFormFieldName() + { + // Create a file with a specific name to verify it's returned correctly + var testFile = TempFile.Create(_tempDirectory, "txt", "Test file content for name validation."); + + var dispatchToForm = new DispatchToForm(this) + { + Url = "forms/with-files", + FormCssSelector = "form", + FormIsEnhanced = false, + UpdateFormAction = () => + { + // Upload file to HeaderPhoto field (which is an IBrowserFile) + // Form field name is "Model.HeaderPhoto" but file name should be testFile.Name + Browser.Exists(By.CssSelector("input[name='Model.HeaderPhoto']")).SendKeys(testFile.Path); + } + }; + DispatchToFormCore(dispatchToForm); + + // Verify that IBrowserFile.Name returns the actual file name, not the form field name + // Before the fix: would show "Header Photo: Model.HeaderPhoto" (form field name) + // After the fix: should show "Header Photo: {testFile.Name}" (actual file name) + Assert.Equal($"Header Photo: {testFile.Name}", Browser.Exists(By.Id("header-photo")).Text); + + // Ensure the file name is actually different from the form field name to validate the test + Assert.NotEqual("Model.HeaderPhoto", testFile.Name); + } + [Theory] // [InlineData(true)] QuarantinedTest: https://github.com/dotnet/aspnetcore/issues/61882 [InlineData(false)] From 3ab79212b598b868fbf502aa43340d872d5ec397 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 13 Aug 2025 21:54:34 +0000 Subject: [PATCH 5/5] Remove IBrowserFileNameReturnsFileNameNotFormFieldName E2E test Co-authored-by: javiercn <6995051+javiercn@users.noreply.github.com> --- .../FormWithParentBindingContextTest.cs | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs b/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs index 32a880310a5f..d6dc438db468 100644 --- a/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs +++ b/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs @@ -1369,35 +1369,6 @@ public void CanBindToFormWithFiles() Assert.Equal("Total: 7", Browser.Exists(By.Id("form-collection")).Text); } - [Fact] - public void IBrowserFileNameReturnsFileNameNotFormFieldName() - { - // Create a file with a specific name to verify it's returned correctly - var testFile = TempFile.Create(_tempDirectory, "txt", "Test file content for name validation."); - - var dispatchToForm = new DispatchToForm(this) - { - Url = "forms/with-files", - FormCssSelector = "form", - FormIsEnhanced = false, - UpdateFormAction = () => - { - // Upload file to HeaderPhoto field (which is an IBrowserFile) - // Form field name is "Model.HeaderPhoto" but file name should be testFile.Name - Browser.Exists(By.CssSelector("input[name='Model.HeaderPhoto']")).SendKeys(testFile.Path); - } - }; - DispatchToFormCore(dispatchToForm); - - // Verify that IBrowserFile.Name returns the actual file name, not the form field name - // Before the fix: would show "Header Photo: Model.HeaderPhoto" (form field name) - // After the fix: should show "Header Photo: {testFile.Name}" (actual file name) - Assert.Equal($"Header Photo: {testFile.Name}", Browser.Exists(By.Id("header-photo")).Text); - - // Ensure the file name is actually different from the form field name to validate the test - Assert.NotEqual("Model.HeaderPhoto", testFile.Name); - } - [Theory] // [InlineData(true)] QuarantinedTest: https://github.com/dotnet/aspnetcore/issues/61882 [InlineData(false)]