// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Microsoft.TestCommon; namespace System.Web.Http.Results { public class InternalServerErrorResultTests { [Fact] public void Constructor_Throws_WhenRequestIsNull() { // Arrange HttpRequestMessage request = null; // Act & Assert Assert.ThrowsArgumentNull(() => { CreateProductUnderTest(request); }, "request"); } [Fact] public void Request_Returns_InstanceProvided() { // Arrange using (HttpRequestMessage expectedRequest = CreateRequest()) { InternalServerErrorResult result = CreateProductUnderTest(expectedRequest); // Act HttpRequestMessage request = result.Request; // Assert Assert.Same(expectedRequest, request); } } [Fact] public async Task ExecuteAsync_Returns_CorrectResponse() { // Arrange using (HttpRequestMessage expectedRequest = CreateRequest()) { IHttpActionResult result = CreateProductUnderTest(expectedRequest); // Act Task task = result.ExecuteAsync(CancellationToken.None); // Assert Assert.NotNull(task); using (HttpResponseMessage response = await task) { Assert.NotNull(response); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); Assert.Same(expectedRequest, response.RequestMessage); } } } [Fact] public void Constructor_ForApiController_Throws_WhenControllerIsNull() { // Arrange ApiController controller = null; // Act & Assert Assert.ThrowsArgumentNull(() => { CreateProductUnderTest(controller); }, "controller"); } [Fact] public async Task ExecuteAsync_ForApiController_ReturnsCorrectResponse() { // Arrange ApiController controller = CreateController(); using (HttpRequestMessage expectedRequest = CreateRequest()) { controller.Request = expectedRequest; IHttpActionResult result = CreateProductUnderTest(controller); // Act Task task = result.ExecuteAsync(CancellationToken.None); // Assert Assert.NotNull(task); using (HttpResponseMessage response = await task) { Assert.NotNull(response); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); Assert.Same(expectedRequest, response.RequestMessage); } } } [Fact] public void Request_ForApiController_EvaluatesLazily() { // Arrange ApiController controller = CreateController(); InternalServerErrorResult result = CreateProductUnderTest(controller); using (HttpRequestMessage expectedRequest = CreateRequest()) { controller.Request = expectedRequest; // Act HttpRequestMessage request = result.Request; // Assert Assert.Same(expectedRequest, request); } } [Fact] public void Request_ForApiController_EvaluatesOnce() { // Arrange ApiController controller = CreateController(); InternalServerErrorResult result = CreateProductUnderTest(controller); using (HttpRequestMessage expectedRequest = CreateRequest()) { controller.Request = expectedRequest; HttpRequestMessage ignore = result.Request; using (HttpRequestMessage otherRequest = CreateRequest()) { controller.Request = otherRequest; // Act HttpRequestMessage request = result.Request; // Assert Assert.Same(expectedRequest, request); } } } [Fact] public void Request_ForApiController_Throws_WhenControllerRequestIsNull() { // Arrange ApiController controller = CreateController(); Assert.Null(controller.Request); InternalServerErrorResult result = CreateProductUnderTest(controller); // Act & Assert InvalidOperationException exception = Assert.Throws(() => { HttpRequestMessage ignore = result.Request; }, "ApiController.Request must not be null."); } [Fact] public void ApiControllerInternalServerError_CreatesCorrectResult() { // Arrange ApiController controller = CreateController(); // Act InternalServerErrorResult result = controller.InternalServerError(); // Assert Assert.NotNull(result); using (HttpRequestMessage expectedRequest = CreateRequest()) { controller.Request = expectedRequest; Assert.Same(expectedRequest, result.Request); } } private static ApiController CreateController() { return new FakeController(); } private static InternalServerErrorResult CreateProductUnderTest(HttpRequestMessage request) { return new InternalServerErrorResult(request); } private static InternalServerErrorResult CreateProductUnderTest(ApiController controller) { return new InternalServerErrorResult(controller); } private static HttpRequestMessage CreateRequest() { return new HttpRequestMessage(); } private class FakeController : ApiController { } } }