154 lines
4.8 KiB
C#
154 lines
4.8 KiB
C#
// 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.Collections.Generic;
|
|
using System.Dynamic;
|
|
using Newtonsoft.Json.Serialization;
|
|
using Xunit;
|
|
|
|
namespace Microsoft.AspNetCore.JsonPatch
|
|
{
|
|
public class CustomNamingStrategyTests
|
|
{
|
|
[Fact]
|
|
public void AddProperty_ToDynamicTestObject_WithCustomNamingStrategy()
|
|
{
|
|
// Arrange
|
|
var contractResolver = new DefaultContractResolver
|
|
{
|
|
NamingStrategy = new TestNamingStrategy()
|
|
};
|
|
|
|
dynamic targetObject = new DynamicTestObject();
|
|
targetObject.Test = 1;
|
|
|
|
var patchDocument = new JsonPatchDocument();
|
|
patchDocument.Add("NewInt", 1);
|
|
patchDocument.ContractResolver = contractResolver;
|
|
|
|
// Act
|
|
patchDocument.ApplyTo(targetObject);
|
|
|
|
// Assert
|
|
Assert.Equal(1, targetObject.customNewInt);
|
|
Assert.Equal(1, targetObject.Test);
|
|
}
|
|
|
|
[Fact]
|
|
public void CopyPropertyValue_ToDynamicTestObject_WithCustomNamingStrategy()
|
|
{
|
|
// Arrange
|
|
var contractResolver = new DefaultContractResolver
|
|
{
|
|
NamingStrategy = new TestNamingStrategy()
|
|
};
|
|
|
|
dynamic targetObject = new DynamicTestObject();
|
|
targetObject.customStringProperty = "A";
|
|
targetObject.customAnotherStringProperty = "B";
|
|
|
|
var patchDocument = new JsonPatchDocument();
|
|
patchDocument.Copy("StringProperty", "AnotherStringProperty");
|
|
patchDocument.ContractResolver = contractResolver;
|
|
|
|
// Act
|
|
patchDocument.ApplyTo(targetObject);
|
|
|
|
// Assert
|
|
Assert.Equal("A", targetObject.customAnotherStringProperty);
|
|
}
|
|
|
|
[Fact]
|
|
public void MovePropertyValue_ForExpandoObject_WithCustomNamingStrategy()
|
|
{
|
|
// Arrange
|
|
var contractResolver = new DefaultContractResolver
|
|
{
|
|
NamingStrategy = new TestNamingStrategy()
|
|
};
|
|
|
|
dynamic targetObject = new ExpandoObject();
|
|
targetObject.customStringProperty = "A";
|
|
targetObject.customAnotherStringProperty = "B";
|
|
|
|
var patchDocument = new JsonPatchDocument();
|
|
patchDocument.Move("StringProperty", "AnotherStringProperty");
|
|
patchDocument.ContractResolver = contractResolver;
|
|
|
|
// Act
|
|
patchDocument.ApplyTo(targetObject);
|
|
var cont = targetObject as IDictionary<string, object>;
|
|
cont.TryGetValue("customStringProperty", out var valueFromDictionary);
|
|
|
|
// Assert
|
|
Assert.Equal("A", targetObject.customAnotherStringProperty);
|
|
Assert.Null(valueFromDictionary);
|
|
}
|
|
|
|
[Fact]
|
|
public void RemoveProperty_FromDictionaryObject_WithCustomNamingStrategy()
|
|
{
|
|
// Arrange
|
|
var contractResolver = new DefaultContractResolver
|
|
{
|
|
NamingStrategy = new TestNamingStrategy()
|
|
};
|
|
|
|
var targetObject = new Dictionary<string, int>()
|
|
{
|
|
{ "customTest", 1},
|
|
};
|
|
|
|
var patchDocument = new JsonPatchDocument();
|
|
patchDocument.Remove("Test");
|
|
patchDocument.ContractResolver = contractResolver;
|
|
|
|
// Act
|
|
patchDocument.ApplyTo(targetObject);
|
|
var cont = targetObject as IDictionary<string, int>;
|
|
cont.TryGetValue("customTest", out var valueFromDictionary);
|
|
|
|
// Assert
|
|
Assert.Equal(0, valueFromDictionary);
|
|
}
|
|
|
|
[Fact]
|
|
public void ReplacePropertyValue_ForExpandoObject_WithCustomNamingStrategy()
|
|
{
|
|
// Arrange
|
|
var contractResolver = new DefaultContractResolver
|
|
{
|
|
NamingStrategy = new TestNamingStrategy()
|
|
};
|
|
|
|
dynamic targetObject = new ExpandoObject();
|
|
targetObject.customTest = 1;
|
|
|
|
var patchDocument = new JsonPatchDocument();
|
|
patchDocument.Replace("Test", 2);
|
|
patchDocument.ContractResolver = contractResolver;
|
|
|
|
// Act
|
|
patchDocument.ApplyTo(targetObject);
|
|
|
|
// Assert
|
|
Assert.Equal(2, targetObject.customTest);
|
|
}
|
|
|
|
private class TestNamingStrategy : NamingStrategy
|
|
{
|
|
public new bool ProcessDictionaryKeys => true;
|
|
|
|
public override string GetDictionaryKey(string key)
|
|
{
|
|
return "custom" + key;
|
|
}
|
|
|
|
protected override string ResolvePropertyName(string name)
|
|
{
|
|
return name;
|
|
}
|
|
}
|
|
}
|
|
}
|