Fix 2224: [Jsonpatch]Added tests for custom converters on properties
This commit is contained in:
parent
39642761b1
commit
8b5223518f
|
|
@ -11,6 +11,7 @@ using JsonPatchWebSite.Models;
|
||||||
using Microsoft.AspNet.Builder;
|
using Microsoft.AspNet.Builder;
|
||||||
using Microsoft.Framework.DependencyInjection;
|
using Microsoft.Framework.DependencyInjection;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Mvc.FunctionalTests
|
namespace Microsoft.AspNet.Mvc.FunctionalTests
|
||||||
|
|
@ -303,5 +304,58 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
|
||||||
var body = await response.Content.ReadAsStringAsync();
|
var body = await response.Content.ReadAsStringAsync();
|
||||||
Assert.Equal("{\"\":[\"The input was not valid.\"]}", body);
|
Assert.Equal("{\"\":[\"The input was not valid.\"]}", body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task JsonPatch_JsonConverterOnProperty_Success()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var server = TestHelper.CreateServer(_app, SiteName, _configureServices);
|
||||||
|
var client = server.CreateClient();
|
||||||
|
|
||||||
|
var input = "[{ \"op\": \"add\", " +
|
||||||
|
"\"path\": \"Customer/Orders/2\", " +
|
||||||
|
"\"value\": { \"OrderType\": \"Type2\" }}]";
|
||||||
|
var request = new HttpRequestMessage
|
||||||
|
{
|
||||||
|
Content = new StringContent(input, Encoding.UTF8, "application/json-patch+json"),
|
||||||
|
Method = new HttpMethod("PATCH"),
|
||||||
|
RequestUri = new Uri("http://localhost/jsonpatch/JsonPatchWithoutModelState")
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var response = await client.SendAsync(request);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var body = await response.Content.ReadAsStringAsync();
|
||||||
|
dynamic d = JObject.Parse(body);
|
||||||
|
Assert.Equal("OrderTypeSetInConverter", (string)d.Orders[2].OrderType);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task JsonPatch_JsonConverterOnClass_Success()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var server = TestHelper.CreateServer(_app, SiteName, _configureServices);
|
||||||
|
var client = server.CreateClient();
|
||||||
|
|
||||||
|
var input = "[{ \"op\": \"add\", " +
|
||||||
|
"\"path\": \"Product/ProductCategory\", " +
|
||||||
|
"\"value\": { \"CategoryName\": \"Name2\" }}]";
|
||||||
|
var request = new HttpRequestMessage
|
||||||
|
{
|
||||||
|
Content = new StringContent(input, Encoding.UTF8, "application/json-patch+json"),
|
||||||
|
Method = new HttpMethod("PATCH"),
|
||||||
|
RequestUri = new Uri("http://localhost/jsonpatch/JsonPatchForProduct")
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var response = await client.SendAsync(request);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var body = await response.Content.ReadAsStringAsync();
|
||||||
|
dynamic d = JObject.Parse(body);
|
||||||
|
Assert.Equal("CategorySetInConverter", (string)d.ProductCategory.CategoryName);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -60,6 +60,16 @@ namespace JsonPatchWebSite.Controllers
|
||||||
return new ObjectResult(customer);
|
return new ObjectResult(customer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpPatch]
|
||||||
|
public IActionResult JsonPatchForProduct([FromBody] JsonPatchDocument<Product> patchDoc)
|
||||||
|
{
|
||||||
|
var product = new Product();
|
||||||
|
|
||||||
|
patchDoc.ApplyTo(product);
|
||||||
|
|
||||||
|
return new ObjectResult(product);
|
||||||
|
}
|
||||||
|
|
||||||
private Customer CreateCustomer()
|
private Customer CreateCustomer()
|
||||||
{
|
{
|
||||||
return new Customer
|
return new Customer
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,15 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace JsonPatchWebSite.Models
|
namespace JsonPatchWebSite.Models
|
||||||
{
|
{
|
||||||
public class Order
|
public class Order
|
||||||
{
|
{
|
||||||
public string OrderName { get; set; }
|
public string OrderName { get; set; }
|
||||||
|
|
||||||
|
[JsonConverter(typeof(ReplaceOrderTypeConverter))]
|
||||||
|
public string OrderType { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
// 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 Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace JsonPatchWebSite.Models
|
||||||
|
{
|
||||||
|
public class Product
|
||||||
|
{
|
||||||
|
public string ProductName { get; set; }
|
||||||
|
|
||||||
|
public Category ProductCategory { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonConverter(typeof(ProductCategoryConverter))]
|
||||||
|
public class Category
|
||||||
|
{
|
||||||
|
public string CategoryName { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
// 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;
|
||||||
|
using System.Reflection;
|
||||||
|
using JsonPatchWebSite.Models;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace JsonPatchWebSite
|
||||||
|
{
|
||||||
|
public class ProductCategoryConverter : JsonConverter
|
||||||
|
{
|
||||||
|
public override bool CanConvert(Type objectType)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
// Load has to happen even if we are not using it. If removed, deserialization will throw an error -
|
||||||
|
//"Additional text found in JSON string after finishing deserializing object."
|
||||||
|
var obj = JObject.Load(reader);
|
||||||
|
|
||||||
|
var category = new Category();
|
||||||
|
category.CategoryName = "CategorySetInConverter";
|
||||||
|
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
var jo = new JObject();
|
||||||
|
|
||||||
|
foreach (var property in value.GetType().GetProperties())
|
||||||
|
{
|
||||||
|
if (property.CanRead)
|
||||||
|
{
|
||||||
|
var propertyValue = property.GetValue(value);
|
||||||
|
if (propertyValue != null)
|
||||||
|
{
|
||||||
|
jo.Add(property.Name, JToken.FromObject(propertyValue, serializer));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jo.WriteTo(writer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
// 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;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace JsonPatchWebSite
|
||||||
|
{
|
||||||
|
public class ReplaceOrderTypeConverter : JsonConverter
|
||||||
|
{
|
||||||
|
public override bool CanConvert(Type objectType)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object ReadJson(
|
||||||
|
JsonReader reader,
|
||||||
|
Type objectType,
|
||||||
|
object existingValue, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
return "OrderTypeSetInConverter";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
serializer.Serialize(writer, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue