public void OnProvidersExecuting_AddsModelStateInvalidFilter_IfActionIsAnnotatedWithAttribute()
        {
            // Arrange
            var context = GetContext(typeof(SimpleController));
            var options = new TestOptionsManager <ApiBehaviorOptions>(new ApiBehaviorOptions
            {
                InvalidModelStateResponseFactory = _ => null,
            });

            var provider = new ApiBehaviorApplicationModelProvider(options, NullLoggerFactory.Instance);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                Assert.Single(context.Result.Controllers).Actions.OrderBy(a => a.ActionName),
                action =>
            {
                Assert.Contains(typeof(ModelStateInvalidFilter), action.Filters.Select(f => f.GetType()));
            },
                action =>
            {
                Assert.DoesNotContain(typeof(ModelStateInvalidFilter), action.Filters.Select(f => f.GetType()));
            });
        }
        public void OnProvidersExecuting_SkipsAddingFilterToActionIfFeatureIsDisabledUsingOptions()
        {
            // Arrange
            var context = GetContext(typeof(SimpleController));
            var options = new TestOptionsManager <ApiBehaviorOptions>(new ApiBehaviorOptions
            {
                EnableModelStateInvalidFilter = false,
            });

            var provider = new ApiBehaviorApplicationModelProvider(options, NullLoggerFactory.Instance);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                Assert.Single(context.Result.Controllers).Actions.OrderBy(a => a.ActionName),
                action =>
            {
                Assert.DoesNotContain(typeof(ModelStateInvalidFilter), action.Filters.Select(f => f.GetType()));
            },
                action =>
            {
                Assert.DoesNotContain(typeof(ModelStateInvalidFilter), action.Filters.Select(f => f.GetType()));
            });
        }
        public void ApiConventionAttributeIsAdded_IfAttributeExistsInAssembly()
        {
            // Arrange
            var controllerType = CreateTestControllerType();
            var model          = new ControllerModel(controllerType.GetTypeInfo(), Array.Empty <object>());

            // Act
            ApiBehaviorApplicationModelProvider.AddGloballyConfiguredApiConventions(model);

            // Assert
            Assert.Collection(
                model.Filters,
                filter => Assert.IsType <ApiConventionAttribute>(filter));
        }
        public void OnProvidersExecuting_ThrowsIfControllerWithAttribute_HasActionsWithoutAttributeRouting()
        {
            // Arrange
            var context = GetContext(typeof(ActionsWithoutAttributeRouting));
            var options = new TestOptionsManager <ApiBehaviorOptions>(new ApiBehaviorOptions
            {
                InvalidModelStateResponseFactory = _ => null,
            });

            var provider = new ApiBehaviorApplicationModelProvider(options, NullLoggerFactory.Instance);

            // Act & Assert
            var ex = Assert.Throws <InvalidOperationException>(() => provider.OnProvidersExecuting(context));

            Assert.Equal(
                "Action methods on controllers annotated with ApiControllerAttribute must have an attribute route.",
                ex.Message);
        }
        public void OnProvidersExecuting_DoesNotAddModelStateInvalidFilterToController_IfFeatureIsDisabledViaOptions()
        {
            // Arrange
            var context = GetContext(typeof(TestApiController));
            var options = new TestOptionsManager <ApiBehaviorOptions>(new ApiBehaviorOptions
            {
                EnableModelStateInvalidFilter = false,
            });

            var provider = new ApiBehaviorApplicationModelProvider(options, NullLoggerFactory.Instance);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            var controllerModel = Assert.Single(context.Result.Controllers);

            Assert.DoesNotContain(typeof(ModelStateInvalidFilter), controllerModel.Filters.Select(f => f.GetType()));
        }
        public void OnProvidersExecuting_AddsModelStateInvalidFilter_IfTypeIsAnnotatedWithAttribute()
        {
            // Arrange
            var context = GetContext(typeof(TestApiController));
            var options = new TestOptionsManager <ApiBehaviorOptions>(new ApiBehaviorOptions
            {
                InvalidModelStateResponseFactory = _ => null,
            });

            var provider = new ApiBehaviorApplicationModelProvider(options, NullLoggerFactory.Instance);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            var actionModel = Assert.Single(Assert.Single(context.Result.Controllers).Actions);

            Assert.IsType <ModelStateInvalidFilter>(actionModel.Filters.Last());
        }
        public void ApiConventionAttributeIsNotAdded_IfModelAlreadyHasAttribute()
        {
            // Arrange
            var attribute      = new ApiConventionAttribute(typeof(DefaultApiConventions));
            var controllerType = CreateTestControllerType();

            var model = new ControllerModel(controllerType.GetTypeInfo(), new[] { attribute })
            {
                Filters = { attribute, },
            };

            // Act
            ApiBehaviorApplicationModelProvider.AddGloballyConfiguredApiConventions(model);

            // Assert
            Assert.Collection(
                model.Filters,
                filter => Assert.Same(attribute, filter));
        }