public void ApiControllerCreatedAtRoute_WithStringAndObject_CreatesCorrectResult()
        {
            // Arrange
            string        expectedRouteName = CreateRouteName();
            object        routeValues       = new { id = 1 };
            object        expectedContent   = CreateContent();
            ApiController controller        = CreateController();

            // Act
            CreatedAtRouteNegotiatedContentResult <object> result = controller.CreatedAtRoute(expectedRouteName,
                                                                                              routeValues, expectedContent);

            // Assert
            Assert.NotNull(result);
            Assert.Same(expectedRouteName, result.RouteName);
            Assert.IsType <HttpRouteValueDictionary>(result.RouteValues);
            Assert.True(result.RouteValues.ContainsKey("id"));
            Assert.Equal(1, result.RouteValues["id"]);
            Assert.Same(expectedContent, result.Content);

            using (HttpConfiguration configuration = CreateConfiguration(CreateFormatter(),
                                                                         CreateDummyContentNegotiator()))
                using (HttpRequestMessage expectedRequest = CreateRequest())
                {
                    controller.Configuration = configuration;
                    controller.Request       = expectedRequest;
                    Assert.Same(expectedRequest, result.Request);
                }
        }
        public void Formatters_ForApiController_EvaluatesOnce()
        {
            // Arrange
            string routeName = CreateRouteName();
            IDictionary <string, object> routeValues = CreateRouteValues();
            object             content           = CreateContent();
            ApiController      controller        = CreateController();
            MediaTypeFormatter expectedFormatter = CreateFormatter();
            IContentNegotiator contentNegotiator = CreateDummyContentNegotiator();

            using (HttpConfiguration earlyConfiguration = CreateConfiguration(expectedFormatter, contentNegotiator))
                using (HttpRequestMessage request = CreateRequest())
                {
                    controller.Configuration = earlyConfiguration;
                    controller.Request       = request;

                    CreatedAtRouteNegotiatedContentResult <object> result = CreateProductUnderTest(routeName, routeValues,
                                                                                                   content, controller);

                    IEnumerable <MediaTypeFormatter> ignore = result.Formatters;

                    using (HttpConfiguration lateConfiguration = CreateConfiguration(CreateFormatter(), contentNegotiator))
                    {
                        controller.Configuration = lateConfiguration;

                        // Act
                        IEnumerable <MediaTypeFormatter> formatters = result.Formatters;

                        // Assert
                        Assert.NotNull(formatters);
                        Assert.Equal(1, formatters.Count());
                        Assert.Same(expectedFormatter, formatters.Single());
                    }
                }
        }
        public void ApiControllerCreatedAtRoute_WithStringAndDictionary_CreatesCorrectResult()
        {
            // Arrange
            string expectedRouteName = CreateRouteName();
            IDictionary <string, object> expectedRouteValues = CreateRouteValues();
            object        expectedContent = CreateContent();
            ApiController controller      = CreateController();

            // Act
            CreatedAtRouteNegotiatedContentResult <object> result = controller.CreatedAtRoute(expectedRouteName,
                                                                                              expectedRouteValues, expectedContent);

            // Assert
            Assert.NotNull(result);
            Assert.Same(expectedRouteName, result.RouteName);
            Assert.Same(expectedRouteValues, result.RouteValues);
            Assert.Same(expectedContent, result.Content);

            using (HttpConfiguration configuration = CreateConfiguration(CreateFormatter(),
                                                                         CreateDummyContentNegotiator()))
                using (HttpRequestMessage expectedRequest = CreateRequest())
                {
                    controller.Configuration = configuration;
                    controller.Request       = expectedRequest;
                    Assert.Same(expectedRequest, result.Request);
                }
        }
        public void ContentNegotiator_ForApiController_EvaluatesOnce()
        {
            // Arrange
            string routeName = CreateRouteName();
            IDictionary <string, object> routeValues = CreateRouteValues();
            object             content = CreateContent();
            IContentNegotiator expectedContentNegotiator = CreateDummyContentNegotiator();
            ApiController      controller = CreateController();

            using (HttpConfiguration configuration = CreateConfiguration(CreateFormatter(), expectedContentNegotiator))
                using (HttpRequestMessage request = CreateRequest())
                {
                    controller.Configuration = configuration;
                    controller.Request       = request;

                    CreatedAtRouteNegotiatedContentResult <object> result = CreateProductUnderTest(routeName, routeValues,
                                                                                                   content, controller);

                    IContentNegotiator ignore = result.ContentNegotiator;

                    configuration.Services.Replace(typeof(IContentNegotiator), CreateDummyContentNegotiator());

                    // Act
                    IContentNegotiator contentNegotiator = result.ContentNegotiator;

                    // Assert
                    Assert.Same(expectedContentNegotiator, contentNegotiator);
                }
        }
        public void Request_ForApiController_EvaluatesOnce()
        {
            // Arrange
            string routeName = CreateRouteName();
            IDictionary <string, object> routeValues = CreateRouteValues();
            object        content    = CreateContent();
            ApiController controller = CreateController();

            using (HttpConfiguration configuration = CreateConfiguration(CreateFormatter(),
                                                                         CreateDummyContentNegotiator()))
            {
                controller.Configuration = configuration;

                CreatedAtRouteNegotiatedContentResult <object> result = CreateProductUnderTest(routeName, routeValues,
                                                                                               content, 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);
                    }
                }
            }
        }
        public void UrlFactory_ForApiController_EvaluatesOnce()
        {
            // Arrange
            string routeName = CreateRouteName();
            IDictionary <string, object> routeValues = CreateRouteValues();
            object        content    = CreateContent();
            ApiController controller = CreateController();

            using (HttpConfiguration configuration = CreateConfiguration(CreateFormatter(),
                                                                         CreateDummyContentNegotiator()))
                using (HttpRequestMessage request = CreateRequest())
                {
                    controller.Configuration = configuration;
                    controller.Request       = request;
                    UrlHelper expectedUrlFactory = CreateDummyUrlFactory();
                    controller.Url = expectedUrlFactory;

                    CreatedAtRouteNegotiatedContentResult <object> result = CreateProductUnderTest(routeName, routeValues,
                                                                                                   content, controller);

                    UrlHelper ignore = result.UrlFactory;

                    controller.Url = CreateDummyUrlFactory();

                    // Act
                    UrlHelper urlFactory = result.UrlFactory;

                    // Assert
                    Assert.Same(expectedUrlFactory, urlFactory);
                }
        }
        public void Formatters_Returns_InstanceProvided()
        {
            // Arrange
            string routeName = CreateRouteName();
            IDictionary <string, object> routeValues = CreateRouteValues();
            object             content           = CreateContent();
            UrlHelper          urlFactory        = CreateDummyUrlFactory();
            IContentNegotiator contentNegotiator = CreateDummyContentNegotiator();

            using (HttpRequestMessage request = CreateRequest())
            {
                IEnumerable <MediaTypeFormatter> expectedFormatters = CreateFormatters();

                CreatedAtRouteNegotiatedContentResult <object> result = CreateProductUnderTest(
                    routeName,
                    routeValues,
                    content,
                    urlFactory,
                    contentNegotiator,
                    request,
                    expectedFormatters
                    );

                // Act
                IEnumerable <MediaTypeFormatter> formatters = result.Formatters;

                // Assert
                Assert.Same(expectedFormatters, formatters);
            }
        }
        public void Request_ForApiController_Throws_WhenControllerRequestIsNull()
        {
            // Arrange
            string routeName = CreateRouteName();
            IDictionary <string, object> routeValues = CreateRouteValues();
            object        content    = CreateContent();
            ApiController controller = CreateController();

            using (
                HttpConfiguration configuration = CreateConfiguration(
                    CreateFormatter(),
                    CreateDummyContentNegotiator()
                    )
                )
            {
                controller.Configuration = configuration;
                Assert.Null(controller.Request);

                CreatedAtRouteNegotiatedContentResult <object> result = CreateProductUnderTest(
                    routeName,
                    routeValues,
                    content,
                    controller
                    );

                // Act & Assert
                InvalidOperationException exception = Assert.Throws <InvalidOperationException>(
                    () =>
                {
                    HttpRequestMessage ignore = result.Request;
                },
                    "ApiController.Request must not be null."
                    );
            }
        }
        public void ContentNegotiator_ForApiController_Throws_WhenServiceIsNull()
        {
            // Arrange
            string routeName = CreateRouteName();
            IDictionary <string, object> routeValues = CreateRouteValues();
            object        content    = CreateContent();
            ApiController controller = CreateController();

            using (HttpConfiguration configuration = CreateConfiguration(CreateFormatter(), null))
                using (HttpRequestMessage request = CreateRequest())
                {
                    controller.Configuration = configuration;
                    controller.Request       = request;

                    CreatedAtRouteNegotiatedContentResult <object> result = CreateProductUnderTest(
                        routeName,
                        routeValues,
                        content,
                        controller
                        );

                    // Act & Assert
                    Assert.Throws <InvalidOperationException>(
                        () =>
                    {
                        IContentNegotiator ignore = result.ContentNegotiator;
                    },
                        "The provided configuration does not have an instance of the "
                        + "'System.Net.Http.Formatting.IContentNegotiator' service registered."
                        );
                }
        }
        public void ContentNegotiator_ForApiController_Throws_WhenConfigurationIsNull()
        {
            // Arrange
            string routeName = CreateRouteName();
            IDictionary <string, object> routeValues = CreateRouteValues();
            object                content            = CreateContent();
            ApiController         controller         = CreateController();
            HttpControllerContext context            = new HttpControllerContext();

            using (HttpRequestMessage request = CreateRequest())
            {
                controller.ControllerContext = context;
                controller.Request           = request;

                CreatedAtRouteNegotiatedContentResult <object> result = CreateProductUnderTest(
                    routeName,
                    routeValues,
                    content,
                    controller
                    );

                // Act & Assert
                Assert.Throws <InvalidOperationException>(
                    () =>
                {
                    IContentNegotiator ignore = result.ContentNegotiator;
                },
                    "HttpControllerContext.Configuration must not be null."
                    );
            }
        }