From 9d138affa226849f17cde8601c7f7459384fca50 Mon Sep 17 00:00:00 2001 From: Jass Bagga Date: Thu, 22 Jun 2017 14:14:11 -0700 Subject: [PATCH] Suppress JsonPatchDocument validation (#6429) Addresses aspnet/JsonPatch#80 --- .../Internal/MvcJsonMvcOptionsSetup.cs | 2 ++ .../JsonPatchInputFormatterTest.cs | 14 ++++++++++++++ .../MvcOptionsSetupTest.cs | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/src/Microsoft.AspNetCore.Mvc.Formatters.Json/Internal/MvcJsonMvcOptionsSetup.cs b/src/Microsoft.AspNetCore.Mvc.Formatters.Json/Internal/MvcJsonMvcOptionsSetup.cs index 31f20bd107..91fcd8ea75 100644 --- a/src/Microsoft.AspNetCore.Mvc.Formatters.Json/Internal/MvcJsonMvcOptionsSetup.cs +++ b/src/Microsoft.AspNetCore.Mvc.Formatters.Json/Internal/MvcJsonMvcOptionsSetup.cs @@ -3,6 +3,7 @@ using System; using System.Buffers; +using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.Extensions.Logging; using Microsoft.Extensions.ObjectPool; @@ -80,6 +81,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters.Json.Internal options.FormatterMappings.SetMediaTypeMappingForFormat("json", MediaTypeHeaderValue.Parse("application/json")); + options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(IJsonPatchDocument))); options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(JToken))); } } diff --git a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/JsonPatchInputFormatterTest.cs b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/JsonPatchInputFormatterTest.cs index 73d1ca3a21..b70029aa61 100644 --- a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/JsonPatchInputFormatterTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/JsonPatchInputFormatterTest.cs @@ -137,6 +137,20 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } + [Fact] + public async Task InvalidOperation_AddsErrorToModelState() + { + // Arrange + var input = "[{ 'op': 'invalid', 'path': 'Reviews/1/Rating', 'from': 'Reviews/0/Rating'}]".Replace("'", "\""); + var request = GetPatchRequest(input); + + // Act + var response = await Client.SendAsync(request); + + // Assert + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + private HttpRequestMessage GetPatchRequest(string body) { return new HttpRequestMessage diff --git a/test/Microsoft.AspNetCore.Mvc.Test/MvcOptionsSetupTest.cs b/test/Microsoft.AspNetCore.Mvc.Test/MvcOptionsSetupTest.cs index 011955e270..a985e1a0ac 100644 --- a/test/Microsoft.AspNetCore.Mvc.Test/MvcOptionsSetupTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Test/MvcOptionsSetupTest.cs @@ -11,6 +11,7 @@ using System.Xml; using System.Xml.Linq; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.DataAnnotations.Internal; using Microsoft.AspNetCore.Mvc.Formatters; @@ -211,6 +212,11 @@ namespace Microsoft.AspNetCore.Mvc }, provider => Assert.IsType(provider), provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(IJsonPatchDocument), excludeFilter.Type); + }, + provider => { var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(JToken), excludeFilter.Type);