From 570b0d467876e19357e8b5ba424ddef92c7f0b42 Mon Sep 17 00:00:00 2001 From: "lucas.hipolito" Date: Wed, 3 Dec 2025 11:48:53 +0100 Subject: [PATCH] Removed unnecessary tests, small refactors for readability +organization --- .../HttpEndpointSecurityAndEdgeCasesTests.cs | 111 ++++-------------- .../Activities/Http/HttpEndpointTests.cs | 45 +------ .../Extensions/StringExtensionsTests.cs | 20 ++++ 3 files changed, 45 insertions(+), 131 deletions(-) create mode 100644 test/component/Elsa.Workflows.ComponentTests/Scenarios/Extensions/StringExtensionsTests.cs diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointSecurityAndEdgeCasesTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointSecurityAndEdgeCasesTests.cs index 272ec6817..7be5d85a6 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointSecurityAndEdgeCasesTests.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointSecurityAndEdgeCasesTests.cs @@ -42,107 +42,44 @@ public class HttpEndpointSecurityAndEdgeCasesTests(App app) : AppComponentTest(a Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal("File upload successful", responseContent); } - - [Fact] - public async Task HttpEndpoint_MalformedMultipartData_HandlesGracefully() + + [Theory] + [InlineData("test/basic")] + [InlineData("TEST/BASIC")] + [InlineData("Test/Basic")] + [InlineData("test/BASIC")] + [InlineData("TEST/basic")] + public async Task HttpEndpoint_CaseSensitiveRoutes_RespectsRouteCase(string route) { // Arrange var client = WorkflowServer.CreateHttpWorkflowClient(); - - // Create properly malformed multipart content by using StringContent with manually crafted headers - using var malformedContent = new StringContent( - "--boundary\r\nContent-Disposition: form-data; name=\"test\"\r\n\r\nvalue\r\n--boundary--", - Encoding.UTF8); - - // Set multipart/form-data content-type but with plain text content - malformedContent.Headers.ContentType = new("multipart/form-data") - { - Parameters = { new System.Net.Http.Headers.NameValueHeaderValue("boundary", "test-boundary") } - }; // Act - var response = await client.PostAsync("test/file-upload", malformedContent); - - // Assert - Should reject malformed multipart data with InternalServerError - // The system detects malformed multipart structure and throws IOException during parsing - Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); - } - - [Fact] - public async Task HttpEndpoint_ExtremelyLargeHeaders_HandlesGracefully() - { - // Arrange - var client = WorkflowServer.CreateHttpWorkflowClient(); - var request = new HttpRequestMessage(HttpMethod.Get, "test/query-headers"); - - // Test with a large but reasonable header (16KB) - var largeHeaderValue = new string('x', 16384); - request.Headers.Add("X-Large-Header", largeHeaderValue); - - // Act - var response = await client.SendAsync(request); - - // Assert - System should handle large headers successfully - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - } - - [Fact] - public async Task HttpEndpoint_CaseSensitiveRoutes_RespectsRouteCase() - { - // Arrange - var client = WorkflowServer.CreateHttpWorkflowClient(); - - // Act - Test the original route first to establish baseline - var originalResponse = await client.GetAsync("test/basic"); - - // Only proceed with case testing if the original route works - if (originalResponse.StatusCode != HttpStatusCode.OK) - { - Assert.Fail("Original route 'test/basic' should work before testing case variations"); - } - - // Test case variations - var uppercaseResponse = await client.GetAsync("TEST/BASIC"); - var mixedCaseResponse = await client.GetAsync("Test/Basic"); + var response = await client.GetAsync(route); + var content = await response.Content.ReadAsStringAsync(); // Assert - ASP.NET Core routing is case-insensitive by default - // Both case variations should work the same as the original - Assert.Equal(HttpStatusCode.OK, uppercaseResponse.StatusCode); - Assert.Equal(HttpStatusCode.OK, mixedCaseResponse.StatusCode); - - // Verify all responses return the same content - var originalContent = await originalResponse.Content.ReadAsStringAsync(); - var uppercaseContent = await uppercaseResponse.Content.ReadAsStringAsync(); - var mixedCaseContent = await mixedCaseResponse.Content.ReadAsStringAsync(); - - Assert.Equal(originalContent, uppercaseContent); - Assert.Equal(originalContent, mixedCaseContent); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(content); } - [Fact] - public async Task HttpEndpoint_NullAndEmptyQueryParameters_HandlesCorrectly() + [Theory] + [InlineData("test/query-headers?name=")] + [InlineData("test/query-headers?name")] + [InlineData("test/query-headers?=value")] + [InlineData("test/query-headers?&&&")] + public async Task HttpEndpoint_NullAndEmptyQueryParameters_HandlesCorrectly(string url) { // Arrange var client = WorkflowServer.CreateHttpWorkflowClient(); - // Act - Test various edge cases with query parameters - var response1 = await client.GetAsync("test/query-headers?name="); - var response2 = await client.GetAsync("test/query-headers?name"); - var response3 = await client.GetAsync("test/query-headers?=value"); - var response4 = await client.GetAsync("test/query-headers?&&&"); + // Act + var response = await client.GetAsync(url); + var content = await response.Content.ReadAsStringAsync(); - // Assert - All should complete without crashing - Assert.Equal(HttpStatusCode.OK, response1.StatusCode); - Assert.Equal(HttpStatusCode.OK, response2.StatusCode); - Assert.Equal(HttpStatusCode.OK, response3.StatusCode); - Assert.Equal(HttpStatusCode.OK, response4.StatusCode); - - var content1 = await response1.Content.ReadAsStringAsync(); - var content2 = await response2.Content.ReadAsStringAsync(); - - // Empty parameter value vs missing value should be handled gracefully - Assert.NotNull(content1); - Assert.NotNull(content2); + // Assert - Should handle edge cases with query parameters gracefully + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(content); } [Fact] diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointTests.cs index 8d34522a9..e0ae794d1 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointTests.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointTests.cs @@ -1,6 +1,5 @@ using System.Net; using System.Text; -using System.Text.Json; using Elsa.Workflows.ComponentTests.Abstractions; using Elsa.Workflows.ComponentTests.Fixtures; @@ -116,49 +115,6 @@ public class HttpEndpointTests(App app) : AppComponentTest(app) } } - [Fact] - public async Task HttpEndpoint_LargeJsonPayload_ProcessesCorrectly() - { - // Arrange - var client = WorkflowServer.CreateHttpWorkflowClient(); - var largeObject = new - { - Users = Enumerable.Range(1, 100).Select(i => new - { - Id = i, - Name = $"User {i}", - Email = $"user{i}@example.com", - Data = new string('x', 100) // 100 characters per user - }).ToArray() - }; - - var jsonContent = JsonSerializer.Serialize(largeObject); - using (var content = new StringContent(jsonContent, Encoding.UTF8, "application/json")) - { - // Act - var response = await client.PostAsync("test/json-content", content); - var responseContent = await response.Content.ReadAsStringAsync(); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - - // Verify response can be parsed back to JSON - var parsedResponse = JsonSerializer.Deserialize(responseContent); - Assert.True(parsedResponse.TryGetProperty("Users", out var usersProperty)); - Assert.Equal(JsonValueKind.Array, usersProperty.ValueKind); - Assert.Equal(100, usersProperty.GetArrayLength()); - } - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - - // Verify response can be parsed back to JSON - var parsedResponse = JsonSerializer.Deserialize(responseContent); - Assert.True(parsedResponse.TryGetProperty("Users", out var usersProperty)); - Assert.Equal(JsonValueKind.Array, usersProperty.ValueKind); - Assert.Equal(100, usersProperty.GetArrayLength()); - } - - [Fact] public async Task HttpEndpoint_SpecialCharactersInRoute_HandlesCorrectly() { @@ -174,4 +130,5 @@ public class HttpEndpointTests(App app) : AppComponentTest(app) Assert.Contains("user@domain.com", response); Assert.Contains("order-with-special-chars!@#$%", response); } + } diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/Extensions/StringExtensionsTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/Extensions/StringExtensionsTests.cs new file mode 100644 index 000000000..6c8198a86 --- /dev/null +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/Extensions/StringExtensionsTests.cs @@ -0,0 +1,20 @@ +using Elsa.Extensions; + +namespace Elsa.Workflows.ComponentTests.Scenarios.Extensions; + +public class StringExtensionsTests +{ + [Theory] + [InlineData("/api/users", "/api/users")] + [InlineData("api/users", "/api/users")] + [InlineData("/api/users/", "/api/users")] + [InlineData("api/users/", "/api/users")] + public void NormalizeRoute_VariousInputs_ReturnsNormalizedPath(string inputPath, string expectedPath) + { + // Act + var normalizedPath = inputPath.NormalizeRoute(); + + // Assert + Assert.Equal(expectedPath, normalizedPath); + } +}