File: IntegrationTests\SimpleObjectIntegrationTest.cs
Web Access
Project: src\src\Features\JsonPatch\test\Microsoft.AspNetCore.JsonPatch.Tests.csproj (Microsoft.AspNetCore.JsonPatch.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Dynamic;
using Microsoft.AspNetCore.JsonPatch.Exceptions;
using Xunit;
 
namespace Microsoft.AspNetCore.JsonPatch.IntegrationTests;
 
public class SimpleObjectIntegrationTest
{
    [Fact]
    public void TestDoubleValueProperty()
    {
        // Arrange
        var targetObject = new SimpleObject()
        {
            DoubleValue = 9.8
        };
 
        var patchDocument = new JsonPatchDocument();
        patchDocument.Test("DoubleValue", 9.8);
 
        // Act & Assert
        patchDocument.ApplyTo(targetObject);
    }
 
    [Fact]
    public void CopyStringProperty_ToAnotherStringProperty()
    {
        // Arrange
        var targetObject = new SimpleObject()
        {
            StringProperty = "A",
            AnotherStringProperty = "B"
        };
 
        var patchDocument = new JsonPatchDocument();
        patchDocument.Copy("StringProperty", "AnotherStringProperty");
 
        // Act
        patchDocument.ApplyTo(targetObject);
 
        // Assert
        Assert.Equal("A", targetObject.AnotherStringProperty);
    }
 
    [Fact]
    public void CopyNullStringProperty_ToAnotherStringProperty()
    {
        // Arrange
        var targetObject = new SimpleObject()
        {
            StringProperty = null,
            AnotherStringProperty = "B"
        };
 
        var patchDocument = new JsonPatchDocument();
        patchDocument.Copy("StringProperty", "AnotherStringProperty");
 
        // Act
        patchDocument.ApplyTo(targetObject);
 
        // Assert
        Assert.Null(targetObject.AnotherStringProperty);
    }
 
    [Fact]
    public void MoveIntegerProperty_ToAnotherIntegerProperty()
    {
        // Arrange
        var targetObject = new SimpleObject()
        {
            IntegerValue = 2,
            AnotherIntegerValue = 3
        };
 
        var patchDocument = new JsonPatchDocument();
        patchDocument.Move("IntegerValue", "AnotherIntegerValue");
 
        // Act
        patchDocument.ApplyTo(targetObject);
 
        // Assert
        Assert.Equal(2, targetObject.AnotherIntegerValue);
        Assert.Equal(0, targetObject.IntegerValue);
    }
 
    [Fact]
    public void RemoveDecimalPropertyValue()
    {
        // Arrange
        var targetObject = new SimpleObject()
        {
            DecimalValue = 9.8M
        };
 
        var patchDocument = new JsonPatchDocument();
        patchDocument.Remove("DecimalValue");
 
        // Act
        patchDocument.ApplyTo(targetObject);
 
        // Assert
        Assert.Equal(0, targetObject.DecimalValue);
    }
 
    [Fact]
    public void ReplaceGuid()
    {
        // Arrange
        var targetObject = new SimpleObject()
        {
            GuidValue = Guid.NewGuid()
        };
 
        var newGuid = Guid.NewGuid();
        var patchDocument = new JsonPatchDocument();
        patchDocument.Replace("GuidValue", newGuid);
 
        // Act
        patchDocument.ApplyTo(targetObject);
 
        // Assert
        Assert.Equal(newGuid, targetObject.GuidValue);
    }
 
    [Fact]
    public void AddReplacesGuid()
    {
        // Arrange
        var targetObject = new SimpleObject()
        {
            GuidValue = Guid.NewGuid()
        };
 
        var newGuid = Guid.NewGuid();
        var patchDocument = new JsonPatchDocument();
        patchDocument.Add("GuidValue", newGuid);
 
        // Act
        patchDocument.ApplyTo(targetObject);
 
        // Assert
        Assert.Equal(newGuid, targetObject.GuidValue);
    }
 
    // https://github.com/dotnet/aspnetcore/issues/3634
    [Fact]
    public void Regression_AspNetCore3634()
    {
        // Assert
        var document = new JsonPatchDocument();
        document.Move("/Object", "/Object/goodbye");
 
        dynamic @object = new ExpandoObject();
        @object.hello = "world";
 
        var target = new Regression_AspNetCore3634_Object();
        target.Object = @object;
 
        // Act
        var ex = Assert.Throws<JsonPatchException>(() => document.ApplyTo(target));
 
        // Assert
        Assert.Equal("For operation 'move', the target location specified by path '/Object/goodbye' was not found.", ex.Message);
    }
 
    private class Regression_AspNetCore3634_Object
    {
        public dynamic Object { get; set; }
    }
}