Skip to content

Commit 690d782

Browse files
authored
Verify response json body (#48534)
1 parent c1f7320 commit 690d782

File tree

3 files changed

+103
-77
lines changed

3 files changed

+103
-77
lines changed

src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs

Lines changed: 0 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,79 +1314,6 @@ void TestAction(HttpResponse httpResponse)
13141314
Assert.Equal(httpContext.Response, httpResponseArgument);
13151315
}
13161316

1317-
public static IEnumerable<object[]> ComplexResult
1318-
{
1319-
get
1320-
{
1321-
Todo originalTodo = new()
1322-
{
1323-
Name = "Write even more tests!"
1324-
};
1325-
1326-
Todo TestAction() => originalTodo;
1327-
Task<Todo> TaskTestAction() => Task.FromResult(originalTodo);
1328-
ValueTask<Todo> ValueTaskTestAction() => ValueTask.FromResult(originalTodo);
1329-
1330-
static Todo StaticTestAction() => new Todo { Name = "Write even more tests!" };
1331-
static Task<Todo> StaticTaskTestAction() => Task.FromResult(new Todo { Name = "Write even more tests!" });
1332-
static ValueTask<Todo> StaticValueTaskTestAction() => ValueTask.FromResult(new Todo { Name = "Write even more tests!" });
1333-
1334-
return new List<object[]>
1335-
{
1336-
new object[] { (Func<Todo>)TestAction },
1337-
new object[] { (Func<Task<Todo>>)TaskTestAction},
1338-
new object[] { (Func<ValueTask<Todo>>)ValueTaskTestAction},
1339-
new object[] { (Func<Todo>)StaticTestAction},
1340-
new object[] { (Func<Task<Todo>>)StaticTaskTestAction},
1341-
new object[] { (Func<ValueTask<Todo>>)StaticValueTaskTestAction},
1342-
};
1343-
}
1344-
}
1345-
1346-
[Theory]
1347-
[MemberData(nameof(ComplexResult))]
1348-
public async Task RequestDelegateWritesComplexReturnValueAsJsonResponseBody(Delegate @delegate)
1349-
{
1350-
var httpContext = CreateHttpContext();
1351-
var responseBodyStream = new MemoryStream();
1352-
httpContext.Response.Body = responseBodyStream;
1353-
1354-
var factoryResult = RequestDelegateFactory.Create(@delegate);
1355-
var requestDelegate = factoryResult.RequestDelegate;
1356-
1357-
await requestDelegate(httpContext);
1358-
1359-
var deserializedResponseBody = JsonSerializer.Deserialize<Todo>(responseBodyStream.ToArray(), new JsonSerializerOptions
1360-
{
1361-
PropertyNameCaseInsensitive = true
1362-
});
1363-
1364-
Assert.NotNull(deserializedResponseBody);
1365-
Assert.Equal("Write even more tests!", deserializedResponseBody!.Name);
1366-
}
1367-
1368-
[Fact]
1369-
public async Task RequestDelegateWritesComplexStructReturnValueAsJsonResponseBody()
1370-
{
1371-
var httpContext = CreateHttpContext();
1372-
var responseBodyStream = new MemoryStream();
1373-
httpContext.Response.Body = responseBodyStream;
1374-
1375-
var factoryResult = RequestDelegateFactory.Create(() => new TodoStruct(42, "Bob", true));
1376-
var requestDelegate = factoryResult.RequestDelegate;
1377-
1378-
await requestDelegate(httpContext);
1379-
1380-
var deserializedResponseBody = JsonSerializer.Deserialize<TodoStruct>(responseBodyStream.ToArray(), new JsonSerializerOptions
1381-
{
1382-
PropertyNameCaseInsensitive = true
1383-
});
1384-
1385-
Assert.Equal(42, deserializedResponseBody.Id);
1386-
Assert.Equal("Bob", deserializedResponseBody.Name);
1387-
Assert.True(deserializedResponseBody.IsComplete);
1388-
}
1389-
13901317
public static IEnumerable<object[]> ChildResult
13911318
{
13921319
get

src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
using System.Text.Json;
1111
using Microsoft.AspNetCore.Builder;
1212
using Microsoft.AspNetCore.Http.Features;
13-
using Microsoft.AspNetCore.Http.Json;
1413
using Microsoft.AspNetCore.Http.RequestDelegateGenerator;
1514
using Microsoft.AspNetCore.Routing;
1615
using Microsoft.AspNetCore.Testing;
@@ -21,7 +20,6 @@
2120
using Microsoft.Extensions.DependencyInjection;
2221
using Microsoft.Extensions.DependencyModel;
2322
using Microsoft.Extensions.DependencyModel.Resolution;
24-
using Microsoft.Extensions.Options;
2523

2624
namespace Microsoft.AspNetCore.Http.Generators.Tests;
2725

@@ -218,12 +216,29 @@ internal HttpContext CreateHttpContextWithBody(Todo requestData, IServiceProvide
218216
return httpContext;
219217
}
220218

221-
internal static async Task VerifyResponseBodyAsync(HttpContext httpContext, string expectedBody, int expectedStatusCode = 200)
219+
internal static async Task<string> GetResponseBodyAsync(HttpContext httpContext)
222220
{
223221
var httpResponse = httpContext.Response;
224222
httpResponse.Body.Seek(0, SeekOrigin.Begin);
225223
var streamReader = new StreamReader(httpResponse.Body);
226-
var body = await streamReader.ReadToEndAsync();
224+
return await streamReader.ReadToEndAsync();
225+
}
226+
227+
internal static async Task VerifyResponseJsonBodyAsync<T>(HttpContext httpContext, Action<T> check, int expectedStatusCode = 200)
228+
{
229+
var body = await GetResponseBodyAsync(httpContext);
230+
var deserializedObject = JsonSerializer.Deserialize<T>(body, new JsonSerializerOptions()
231+
{
232+
PropertyNameCaseInsensitive = true
233+
});
234+
235+
Assert.Equal(expectedStatusCode, httpContext.Response.StatusCode);
236+
check(deserializedObject);
237+
}
238+
239+
internal static async Task VerifyResponseBodyAsync(HttpContext httpContext, string expectedBody, int expectedStatusCode = 200)
240+
{
241+
var body = await GetResponseBodyAsync(httpContext);
227242
Assert.Equal(expectedStatusCode, httpContext.Response.StatusCode);
228243
Assert.Equal(expectedBody, body);
229244
}

src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Responses.cs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,4 +357,88 @@ public async Task SupportsIResultWithExplicitInterfaceImplementation()
357357

358358
await VerifyResponseBodyAsync(httpContext, "Already gone!", StatusCodes.Status410Gone);
359359
}
360+
361+
public static IEnumerable<object[]> ComplexResult
362+
{
363+
get
364+
{
365+
var testAction = """
366+
app.MapPost("/", () => new Todo() { Name = "Write even more tests!" });
367+
""";
368+
369+
var taskTestAction = """
370+
app.MapPost("/", () => Task.FromResult(new Todo() { Name = "Write even more tests!" }));
371+
""";
372+
373+
var valueTaskTestAction = """
374+
app.MapPost("/", () => ValueTask.FromResult(new Todo() { Name = "Write even more tests!" }));
375+
""";
376+
377+
var staticTestAction = """
378+
app.MapPost("/", StaticTestAction);
379+
static Todo StaticTestAction() => new Todo() { Name = "Write even more tests!" };
380+
""";
381+
382+
var staticTaskTestAction = """
383+
app.MapPost("/", StaticTaskTestAction);
384+
static Task<Todo> StaticTaskTestAction() => Task.FromResult(new Todo() { Name = "Write even more tests!" });
385+
""";
386+
387+
var staticValueTaskTestAction = """
388+
app.MapPost("/", StaticValueTaskTestAction);
389+
static ValueTask<Todo> StaticValueTaskTestAction() => ValueTask.FromResult(new Todo() { Name = "Write even more tests!" });
390+
""";
391+
392+
return new List<object[]>
393+
{
394+
new object[] { testAction },
395+
new object[] { taskTestAction },
396+
new object[] { valueTaskTestAction },
397+
new object[] { staticTestAction },
398+
new object[] { staticTaskTestAction },
399+
new object[] { staticValueTaskTestAction }
400+
};
401+
}
402+
}
403+
404+
[Theory]
405+
[MemberData(nameof(ComplexResult))]
406+
public async Task RequestDelegateWritesComplexReturnValueAsJsonResponseBody(string source)
407+
{
408+
var (_, compilation) = await RunGeneratorAsync(source);
409+
var endpoint = GetEndpointFromCompilation(compilation);
410+
411+
var httpContext = CreateHttpContext();
412+
413+
await endpoint.RequestDelegate(httpContext);
414+
415+
await VerifyResponseJsonBodyAsync<Todo>(httpContext, (todo) =>
416+
{
417+
Assert.NotNull(todo);
418+
Assert.Equal("Write even more tests!", todo!.Name);
419+
});
420+
}
421+
422+
[Fact]
423+
public async Task RequestDelegateWritesComplexStructReturnValueAsJsonResponseBody()
424+
{
425+
var source = """
426+
app.MapPost("/", () => new TodoStruct(42, "Bob", true, TodoStatus.Done));
427+
""";
428+
429+
var (_, compilation) = await RunGeneratorAsync(source);
430+
var endpoint = GetEndpointFromCompilation(compilation);
431+
432+
var httpContext = CreateHttpContext();
433+
434+
await endpoint.RequestDelegate(httpContext);
435+
436+
await VerifyResponseJsonBodyAsync<TodoStruct>(httpContext, (todo) =>
437+
{
438+
Assert.Equal(42, todo.Id);
439+
Assert.Equal("Bob", todo.Name);
440+
Assert.True(todo.IsComplete);
441+
Assert.Equal(TodoStatus.Done, todo.Status);
442+
});
443+
}
360444
}

0 commit comments

Comments
 (0)