Havunen / SystemTextJsonPatch

SystemTextJsonPatch is a JSON Patch (JsonPatchDocument) RFC 6902 implementation for .NET using System.Text.Json
MIT License
102 stars 12 forks source link

JSonObjectAdapter test operation for empty string works inconsistent with standard definition #31

Closed MateuszGert closed 2 months ago

MateuszGert commented 3 months ago

Hello, I've found some edge case:

[TestCase]
public void EmptyStringTest()
{
    var patchDocument = new JsonPatchDocument<JsonNode>();
    patchDocument.Operations.Add(new Operation<JsonNode>(op: "test", path: "/string", from: null, value: ""));
    var node = JsonNode.Parse("{\"string\": \"\"}")!;
    Assert.DoesNotThrow(() => patchDocument.ApplyTo(node));
}

[TestCase]
public void NullFieldTest()
{
    var patchDocument = new JsonPatchDocument<JsonNode>();
    patchDocument.Operations.Add(new Operation<JsonNode>(op: "test", path: "/string", from: null, value: null));
    var node = JsonNode.Parse("{\"string\": null}")!;
    Assert.DoesNotThrow(() => patchDocument.ApplyTo(node));
}

From https://datatracker.ietf.org/doc/html/rfc6902#section-4.6

The "test" operation tests that a value at the target location is equal to a specified value. The operation object MUST contain a "value" member that conveys the value to be compared to the target location's value. The target location MUST be equal to the "value" value for the operation to be considered successful. Here, "equal" means that the value at the target location and the value conveyed by "value" are of the same JSON type, and that they are considered equal by the following rules for that type: o strings: are considered equal if they contain the same number of Unicode characters and their code points are byte-by-byte equal. (...) o literals (false, true, and null): are considered equal if they are the same.

Havunen commented 2 months ago

This is fixed in v3.2.1