Skip to content

Commit

Permalink
[FromBody] attribute support for routeless integration testing
Browse files Browse the repository at this point in the history
fixes #645
  • Loading branch information
KateyBee committed Mar 19, 2024
1 parent 015ede8 commit 1af7400
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 15 deletions.
2 changes: 1 addition & 1 deletion Src/Directory.Build.props
@@ -1,7 +1,7 @@
<Project>
<PropertyGroup>

<Version>5.23.0.9-beta</Version>
<Version>5.23.0.10-beta</Version>

<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
<LangVersion>latest</LangVersion>
Expand Down
12 changes: 6 additions & 6 deletions Src/Library/Binder/RequestBinder.cs
@@ -1,13 +1,13 @@
using FluentValidation.Results;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Primitives;
using System.Linq.Expressions;
using System.Linq.Expressions;
using System.Reflection;
using System.Security.Claims;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
using FluentValidation.Results;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Primitives;
using static FastEndpoints.Config;

namespace FastEndpoints;
Expand Down Expand Up @@ -204,7 +204,7 @@ public virtual async ValueTask<TRequest> BindAsync(BinderContext ctx, Cancellati

static async ValueTask<TRequest> BindJsonBody(HttpRequest httpRequest, JsonSerializerContext? serializerCtx, CancellationToken cancellation)
{
if (_fromBodyProp is null)
if (_fromBodyProp is null || httpRequest.Headers.ContainsKey(Constants.RoutelessTest))
return (TRequest)(await SerOpts.RequestDeserializer(httpRequest, _tRequest, serializerCtx, cancellation) ?? InitDto());

var req = InitDto();
Expand Down
2 changes: 2 additions & 0 deletions Src/Library/Constants.cs
Expand Up @@ -9,4 +9,6 @@ static class Constants
internal const string AcceptsMetaData = "AcceptsMetadata";

internal const string QueryJsonNodeName = "QueryNode";

internal const string RoutelessTest = "_RoutelessTest_";
}
1 change: 1 addition & 0 deletions Src/Library/Testing/HttpClientExtensions.cs
Expand Up @@ -292,6 +292,7 @@ public static class HttpClientExtensions
var rsp = await client.SendAsync(
new()
{
Headers = { { Constants.RoutelessTest, "true" } },
Method = method,
RequestUri = new($"{client.BaseAddress}{requestUri.TrimStart('/')}"),
Content = sendAsFormData is true
Expand Down
1 change: 1 addition & 0 deletions Src/Library/changelog.md
Expand Up @@ -20,6 +20,7 @@ FastEndpoints needs sponsorship to [sustain the project](https://github.com/Fast
- `PreSetupAsync()` for `AppFixture` to allow async work that contributes to WAF creation. (https://discord.com/channels/933662816458645504/1214837140983123979/1215538377521365053)
- automatically rewind request body with `IPlainTextRequest` if `EnableBuffering()` is used. (https://github.com/FastEndpoints/FastEndpoints/issues/631)
- filter out illegal header names from being created as request parameters in swagger. (https://github.com/FastEndpoints/FastEndpoints/issues/615)
- implement `[FromBody]` attribute support for routeless integration testing. (https://github.com/FastEndpoints/FastEndpoints/issues/645)
- upgrade dependencies to latest

## Fixes 🪲
Expand Down
22 changes: 14 additions & 8 deletions Tests/IntegrationTests/FastEndpoints/BindingTests/BindingTests.cs
Expand Up @@ -737,13 +737,16 @@ public async Task FromBodyJsonBinding()
{
var (rsp, res) = await App.CustomerClient.POSTAsync<
TestCases.FromBodyJsonBinding.Endpoint,
Product,
TestCases.FromBodyJsonBinding.Request,
TestCases.FromBodyJsonBinding.Response>(
new()
{
Id = 202,
Name = "test product",
Price = 200.10m
Product = new()
{
Id = 202,
Name = "test product",
Price = 200.10m
}
});

rsp.StatusCode.Should().Be(HttpStatusCode.OK);
Expand All @@ -759,13 +762,16 @@ public async Task FromBodyJsonBindingValidationError()
{
var (rsp, res) = await App.CustomerClient.POSTAsync<
TestCases.FromBodyJsonBinding.Endpoint,
Product,
TestCases.FromBodyJsonBinding.Request,
ErrorResponse>(
new()
{
Id = 202,
Name = "test product",
Price = 10.10m
Product = new()
{
Id = 202,
Name = "test product",
Price = 10.10m
}
});

rsp.StatusCode.Should().Be(HttpStatusCode.BadRequest);
Expand Down

0 comments on commit 1af7400

Please sign in to comment.