Skip to content

Commit f7ccefb

Browse files
committed
Adding/Updating tests
1 parent 46f71aa commit f7ccefb

File tree

3 files changed

+170
-0
lines changed

3 files changed

+170
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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+
using System.Reflection;
4+
5+
namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
6+
7+
#nullable enable
8+
public class NullableEmptyBodyBindingMetadataProviderTest
9+
{
10+
[Fact]
11+
public void IsEmptyBodyAllowed_LeftAlone_WhenAlreadySet()
12+
{
13+
// Arrange
14+
var provider = new NullableEmptyBodyBindingMetadataProvider();
15+
16+
var context = new BindingMetadataProviderContext(
17+
ModelMetadataIdentity.ForParameter(ParameterInfos.NullableParameter),
18+
new ModelAttributes(Array.Empty<object>()));
19+
20+
context.BindingMetadata.IsEmptyBodyAllowed = false;
21+
22+
// Act
23+
provider.CreateBindingMetadata(context);
24+
25+
// Assert
26+
Assert.False(context.BindingMetadata.IsEmptyBodyAllowed);
27+
}
28+
29+
[Fact]
30+
public void IsEmptyBodyAllowed_LeftAlone_WhenNotOptional()
31+
{
32+
// Arrange
33+
var provider = new NullableEmptyBodyBindingMetadataProvider();
34+
35+
var context = new BindingMetadataProviderContext(
36+
ModelMetadataIdentity.ForParameter(ParameterInfos.NonNullableParameter),
37+
new ModelAttributes(Array.Empty<object>()));
38+
39+
// Act
40+
provider.CreateBindingMetadata(context);
41+
42+
// Assert
43+
Assert.Null(context.BindingMetadata.IsEmptyBodyAllowed);
44+
}
45+
46+
47+
[Fact]
48+
public void IsEmptyBodyAllowed_IsTrue_WhenDefaultValue()
49+
{
50+
// Arrange
51+
var provider = new NullableEmptyBodyBindingMetadataProvider();
52+
53+
var context = new BindingMetadataProviderContext(
54+
ModelMetadataIdentity.ForParameter(ParameterInfos.ParameterWithDefaultValue),
55+
new ModelAttributes(Array.Empty<object>()));
56+
57+
// Act
58+
provider.CreateBindingMetadata(context);
59+
60+
// Assert
61+
Assert.True(context.BindingMetadata.IsEmptyBodyAllowed);
62+
63+
}
64+
65+
[Fact]
66+
public void IsEmptyBodyAllowed_IsTrue_WhenNullable()
67+
{
68+
// Arrange
69+
var provider = new NullableEmptyBodyBindingMetadataProvider();
70+
71+
var context = new BindingMetadataProviderContext(
72+
ModelMetadataIdentity.ForParameter(ParameterInfos.NullableParameter),
73+
new ModelAttributes(Array.Empty<object>()));
74+
75+
// Act
76+
provider.CreateBindingMetadata(context);
77+
78+
// Assert
79+
Assert.True(context.BindingMetadata.IsEmptyBodyAllowed);
80+
81+
}
82+
83+
private class ParameterInfos
84+
{
85+
public void Method(object param1, object? param2)
86+
{
87+
}
88+
89+
#nullable disable
90+
public void Method2(object param1 = null)
91+
{
92+
}
93+
#nullable restore
94+
95+
public static ParameterInfo NonNullableParameter
96+
= typeof(ParameterInfos)!
97+
.GetMethod(nameof(ParameterInfos.Method))!
98+
.GetParameters()[0];
99+
100+
public static ParameterInfo NullableParameter
101+
= typeof(ParameterInfos)!
102+
.GetMethod(nameof(ParameterInfos.Method))!
103+
.GetParameters()[1];
104+
105+
public static ParameterInfo ParameterWithDefaultValue
106+
= typeof(ParameterInfos)!
107+
.GetMethod(nameof(ParameterInfos.Method2))!
108+
.GetParameters()[0];
109+
}
110+
}

src/Mvc/test/Mvc.FunctionalTests/InputFormatterTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,26 @@ public async Task OptionalFromBodyWorks()
209209
await response.AssertStatusCodeAsync(HttpStatusCode.OK);
210210
}
211211

212+
[Fact]
213+
public async Task OptionalFromBodyWorks_WithDefaultValue()
214+
{
215+
// Act
216+
var response = await Client.PostAsJsonAsync<object>($"Home/{nameof(HomeController.DefaultValueBody)}", value: null);
217+
218+
// Assert
219+
await response.AssertStatusCodeAsync(HttpStatusCode.OK);
220+
}
221+
222+
[Fact]
223+
public async Task OptionalFromBodyWorks_WithNullable()
224+
{
225+
// Act
226+
var response = await Client.PostAsJsonAsync<object>($"Home/{nameof(HomeController.NullableBody)}", value: null);
227+
228+
// Assert
229+
await response.AssertStatusCodeAsync(HttpStatusCode.OK);
230+
}
231+
212232
[Fact]
213233
public async Task OptionalFromBodyWorksWithEmptyRequest()
214234
{
@@ -223,4 +243,34 @@ public async Task OptionalFromBodyWorksWithEmptyRequest()
223243
// Assert
224244
await response.AssertStatusCodeAsync(HttpStatusCode.OK);
225245
}
246+
247+
[Fact]
248+
public async Task OptionalFromBodyWorksWithEmptyRequest_WithDefaultValue()
249+
{
250+
// Arrange
251+
var content = new ByteArrayContent(Array.Empty<byte>());
252+
Assert.Null(content.Headers.ContentType);
253+
Assert.Equal(0, content.Headers.ContentLength);
254+
255+
// Act
256+
var response = await Client.PostAsync($"Home/{nameof(HomeController.DefaultValueBody)}", content);
257+
258+
// Assert
259+
await response.AssertStatusCodeAsync(HttpStatusCode.OK);
260+
}
261+
262+
[Fact]
263+
public async Task OptionalFromBodyWorksWithEmptyRequest_WithNullable()
264+
{
265+
// Arrange
266+
var content = new ByteArrayContent(Array.Empty<byte>());
267+
Assert.Null(content.Headers.ContentType);
268+
Assert.Equal(0, content.Headers.ContentLength);
269+
270+
// Act
271+
var response = await Client.PostAsync($"Home/{nameof(HomeController.NullableBody)}", content);
272+
273+
// Assert
274+
await response.AssertStatusCodeAsync(HttpStatusCode.OK);
275+
}
226276
}

src/Mvc/test/WebSites/FormatterWebSite/Controllers/HomeController.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,14 @@ public IActionResult DefaultBody([FromBody] DummyClass dummy)
4444
[HttpPost]
4545
public IActionResult OptionalBody([FromBody(EmptyBodyBehavior = EmptyBodyBehavior.Allow)] DummyClass dummy)
4646
=> ModelState.IsValid ? Ok() : ValidationProblem();
47+
48+
[HttpPost]
49+
public IActionResult DefaultValueBody([FromBody] DummyClass dummy = null)
50+
=> ModelState.IsValid ? Ok() : ValidationProblem();
51+
52+
#nullable enable
53+
[HttpPost]
54+
public IActionResult NullableBody([FromBody] DummyClass? dummy)
55+
=> ModelState.IsValid ? Ok() : ValidationProblem();
56+
#nullable restore
4757
}

0 commit comments

Comments
 (0)