public void apply_to_should_assign_model_with_declared_api_versions_from_mapped_convention_and_attributes()
        {
            // arrange
            var controllerBuilder    = new ControllerApiVersionConventionBuilder(typeof(DecoratedController));
            var actionBuilder        = new ActionApiVersionConventionBuilder(controllerBuilder);
            var controllerDescriptor = new HttpControllerDescriptor()
            {
                ControllerType = typeof(DecoratedController)
            };
            var method                = typeof(DecoratedController).GetMethod(nameof(DecoratedController.Get));
            var actionDescriptor      = new ReflectedHttpActionDescriptor(controllerDescriptor, method);
            var empty                 = Enumerable.Empty <ApiVersion>();
            var controllerVersionInfo = Tuple.Create(empty, empty, empty, empty);

            actionDescriptor.Properties[controllerVersionInfo.GetType()] = controllerVersionInfo;
            actionBuilder.MapToApiVersion(new ApiVersion(2, 0))
            .MapToApiVersion(new ApiVersion(3, 0));

            // act
            actionBuilder.ApplyTo(actionDescriptor);

            // assert
            actionDescriptor.GetApiVersionModel().Should().BeEquivalentTo(
                new
            {
                IsApiVersionNeutral    = false,
                DeclaredApiVersions    = new[] { new ApiVersion(2, 0), new ApiVersion(3, 0) },
                SupportedApiVersions   = new ApiVersion[0],
                DeprecatedApiVersions  = new ApiVersion[0],
                ImplementedApiVersions = new ApiVersion[0],
            });
        }
        public void apply_to_should_assign_model_with_declared_api_versions_from_mapped_convention()
        {
            // arrange
            var controllerBuilder = new ControllerApiVersionConventionBuilder <UndecoratedController>();
            var actionBuilder     = new ActionApiVersionConventionBuilder <UndecoratedController>(controllerBuilder);
            var actionDescriptor  = new Mock <HttpActionDescriptor>()
            {
                CallBase = true
            };

            actionDescriptor.Setup(ad => ad.GetCustomAttributes <IApiVersionProvider>()).Returns(new Collection <IApiVersionProvider>());
            actionBuilder.MapToApiVersion(new ApiVersion(2, 0));

            // act
            actionBuilder.ApplyTo(actionDescriptor.Object);

            // assert
            actionDescriptor.Object.GetApiVersionModel().ShouldBeEquivalentTo(
                new
            {
                IsApiVersionNeutral    = false,
                DeclaredApiVersions    = new[] { new ApiVersion(2, 0) },
                SupportedApiVersions   = new[] { new ApiVersion(2, 0) },
                DeprecatedApiVersions  = new ApiVersion[0],
                ImplementedApiVersions = new[] { new ApiVersion(2, 0) }
            });
        }
        public void apply_to_should_assign_model_with_declared_api_versions_from_mapped_convention()
        {
            // arrange
            var controllerBuilder = new ControllerApiVersionConventionBuilder(typeof(UndecoratedController));
            var actionBuilder     = new ActionApiVersionConventionBuilder(controllerBuilder);
            var actionDescriptor  = new Mock <HttpActionDescriptor>()
            {
                CallBase = true
            };
            var empty = Enumerable.Empty <ApiVersion>();
            var controllerVersionInfo = Tuple.Create(empty, empty, empty, empty);

            actionDescriptor.Setup(ad => ad.GetCustomAttributes <IApiVersionProvider>()).Returns(new Collection <IApiVersionProvider>());
            actionDescriptor.Object.Properties[controllerVersionInfo.GetType()] = controllerVersionInfo;
            actionBuilder.MapToApiVersion(new ApiVersion(2, 0));

            // act
            actionBuilder.ApplyTo(actionDescriptor.Object);

            // assert
            actionDescriptor.Object.GetApiVersionModel().Should().BeEquivalentTo(
                new
            {
                IsApiVersionNeutral    = false,
                DeclaredApiVersions    = new[] { new ApiVersion(2, 0) },
                SupportedApiVersions   = new ApiVersion[0],
                DeprecatedApiVersions  = new ApiVersion[0],
                ImplementedApiVersions = new ApiVersion[0],
            });
        }
        public void apply_to_should_assign_model_with_declared_api_versions_from_mapped_convention_and_attributes()
        {
            // arrange
            var controllerBuilder    = new ControllerApiVersionConventionBuilder <UndecoratedController>();
            var actionBuilder        = new ActionApiVersionConventionBuilder <UndecoratedController>(controllerBuilder);
            var controllerDescriptor = new HttpControllerDescriptor()
            {
                ControllerType = typeof(DecoratedController)
            };
            var method           = typeof(DecoratedController).GetMethod(nameof(DecoratedController.Get));
            var actionDescriptor = new ReflectedHttpActionDescriptor(controllerDescriptor, method);

            actionBuilder.MapToApiVersion(new ApiVersion(2, 0))
            .MapToApiVersion(new ApiVersion(3, 0));

            // act
            actionBuilder.ApplyTo(actionDescriptor);

            // assert
            actionDescriptor.GetApiVersionModel().ShouldBeEquivalentTo(
                new
            {
                IsApiVersionNeutral    = false,
                DeclaredApiVersions    = new[] { new ApiVersion(2, 0), new ApiVersion(3, 0) },
                SupportedApiVersions   = new[] { new ApiVersion(2, 0), new ApiVersion(3, 0) },
                DeprecatedApiVersions  = new ApiVersion[0],
                ImplementedApiVersions = new[] { new ApiVersion(2, 0), new ApiVersion(3, 0) }
            });
        }
Exemplo n.º 5
0
        public void action_should_throw_exception_when_func_delegate_expression_is_not_a_method()
        {
            // arrange
            var controllerBuilder = new ControllerApiVersionConventionBuilder <StubController>();
            var actionBuilder     = new Mock <ActionApiVersionConventionBuilder <StubController> >(controllerBuilder).Object;

            // act
            Action action = () => actionBuilder.Action(c => c.Timeout);

            // assert
            action.Should().Throw <InvalidOperationException>().And
            .Message.Should().Be("The expression 'c => c.Timeout' must refer to a controller action method.");
        }
Exemplo n.º 6
0
        public void action_should_map_method_from_func_delegate_expression()
        {
            // arrange
            var method            = typeof(StubController).GetMethod(nameof(StubController.Get));
            var controllerBuilder = new ControllerApiVersionConventionBuilder <StubController>();
            var actionBuilder     = new Mock <ActionApiVersionConventionBuilder <StubController> >(controllerBuilder);

            // act
            actionBuilder.Object.Action(c => c.Get());

            // assert
            actionBuilder.Verify(b => b.Action(method), Once());
        }
        /// <summary>
        /// Gets or creates the convention builder for the specified controller.
        /// </summary>
        /// <typeparam name="TController">The <see cref="Type">type</see> of controller to build conventions for.</typeparam>
        /// <returns>A new or existing <see cref="ControllerApiVersionConventionBuilder{T}"/>.</returns>
        public virtual ControllerApiVersionConventionBuilder <TController> Controller <TController>() where TController : IHttpController
        {
            Contract.Ensures(Contract.Result <ControllerApiVersionConventionBuilder <TController> >() != null);

            var key = typeof(TController);

            if (!ControllerConventions.TryGetValue(key, out var convention))
            {
                var typedConvention = new ControllerApiVersionConventionBuilder <TController>();
                ControllerConventions[key] = typedConvention;
                return(typedConvention);
            }

            return((ControllerApiVersionConventionBuilder <TController>)convention);
        }
Exemplo n.º 8
0
        void ApplyActionConventions(HttpControllerDescriptor controller)
        {
            Contract.Requires(controller != null);

            var actionSelector = controller.Configuration.Services.GetActionSelector();
            var actions        = actionSelector.GetActionMapping(controller).SelectMany(g => g).ToArray();

            if (VersionNeutral)
            {
                controller.SetApiVersionModel(ApiVersionModel.Neutral);

                for (var i = 0; i < actions.Length; i++)
                {
                    actions[i].SetProperty(ApiVersionModel.Neutral);
                }

                return;
            }

            controller.SetApiVersionModel(new ApiVersionModel(SupportedVersions, DeprecatedVersions, AdvertisedVersions, DeprecatedAdvertisedVersions));

            var anyController = new ControllerApiVersionConventionBuilder(typeof(IHttpController));

            for (var i = 0; i < actions.Length; i++)
            {
                if (!(actions[i] is ReflectedHttpActionDescriptor action))
                {
                    continue;
                }

                var key = action.MethodInfo;

                if (!TryGetConvention(key, out var actionConvention))
                {
                    actionConvention = new ActionApiVersionConventionBuilder(anyController);
                }

                actionConvention.ApplyTo(action);
            }

            ApplyInheritedActionConventions(actions);
        }
        /// <summary>
        /// Gets or creates the convention builder for the specified controller.
        /// </summary>
        /// <typeparam name="TController">The <see cref="Type">type</see> of controller to build conventions for.</typeparam>
        /// <returns>A new or existing <see cref="ControllerApiVersionConventionBuilder{T}"/>.</returns>
        public virtual ControllerApiVersionConventionBuilder <TController> Controller <TController>() where TController : IHttpController
        {
            Contract.Ensures(Contract.Result <ControllerApiVersionConventionBuilder <TController> >() != null);

            var key = typeof(TController);

            if (!ControllerConventions.TryGetValue(key, out var convention))
            {
                var typedConvention = new ControllerApiVersionConventionBuilder <TController>();
                ControllerConventions[key] = typedConvention;
                return(typedConvention);
            }

            if (convention is ControllerApiVersionConventionBuilder <TController> builder)
            {
                return(builder);
            }

            throw new InvalidOperationException(SR.ConventionStyleMismatch.FormatDefault(key.Name));
        }
        /// <summary>
        /// Gets or creates the convention builder for the specified controller.
        /// </summary>
        /// <param name="controllerType">The <see cref="Type">type</see> of controller to build conventions for.</param>
        /// <returns>A new or existing <see cref="ControllerApiVersionConventionBuilder"/>.</returns>
        public virtual ControllerApiVersionConventionBuilder Controller(Type controllerType)
        {
            Arg.NotNull(controllerType, nameof(controllerType));
            Contract.Ensures(Contract.Result <ControllerApiVersionConventionBuilder>() != null);

            var key = controllerType;

            if (!ControllerConventions.TryGetValue(key, out var convention))
            {
                var typedConvention = new ControllerApiVersionConventionBuilder(controllerType);
                ControllerConventions[key] = typedConvention;
                return(typedConvention);
            }

            if (convention is ControllerApiVersionConventionBuilder builder)
            {
                return(builder);
            }

            throw new InvalidOperationException(SR.ConventionStyleMismatch.FormatDefault(key.Name));
        }