mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-03-21 08:59:50 +01:00
* Update JSONPathMatcher.cs to cover the string path selection to a child The .SelectToken method accept string path selection and JSONPath queries. The current code works only for the queries because the result is JObject. When the string path is selected the result is JValue and event with a valid result the code the code doesn't return valued result. https://www.newtonsoft.com/json/help/html/SelectToken.htm * Added unit tests * Addressed the comments * Addressed the comments * Update JSONPathMatcher.cs
328 lines
8.0 KiB
C#
328 lines
8.0 KiB
C#
using System;
|
|
using Newtonsoft.Json.Linq;
|
|
using NFluent;
|
|
using WireMock.Matchers;
|
|
using Xunit;
|
|
|
|
namespace WireMock.Net.Tests.Matchers;
|
|
|
|
public class JsonPathMatcherTests
|
|
{
|
|
[Fact]
|
|
public void JsonPathMatcher_GetName()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("X");
|
|
|
|
// Act
|
|
string name = matcher.Name;
|
|
|
|
// Assert
|
|
Check.That(name).Equals("JsonPathMatcher");
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_GetPatterns()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("X");
|
|
|
|
// Act
|
|
var patterns = matcher.GetPatterns();
|
|
|
|
// Assert
|
|
Check.That(patterns).ContainsExactly("X");
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_ByteArray()
|
|
{
|
|
// Arrange
|
|
var bytes = EmptyArray<byte>.Value;
|
|
var matcher = new JsonPathMatcher("");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(bytes);
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_NullString()
|
|
{
|
|
// Arrange
|
|
string? s = null;
|
|
var matcher = new JsonPathMatcher("");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(s);
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_NullObject()
|
|
{
|
|
// Arrange
|
|
object? o = null;
|
|
var matcher = new JsonPathMatcher("");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(o);
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_String_Exception_Mismatch()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("xxx");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch("");
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_Object_Exception_Mismatch()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch("x");
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_AnonymousObject()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("$..[?(@.Id == 1)]");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(new { Id = 1, Name = "Test" });
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(1);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_AnonymousObject_WithNestedObject()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("$.things[?(@.name == 'x')]");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(new { things = new { name = "x" } });
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(1);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_String_WithNestedObject()
|
|
{
|
|
// Arrange
|
|
var json = "{ \"things\": { \"name\": \"x\" } }";
|
|
var matcher = new JsonPathMatcher("$.things[?(@.name == 'x')]");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(json);
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(1);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsNoMatch_String_WithNestedObject()
|
|
{
|
|
// Arrange
|
|
var json = "{ \"things\": { \"name\": \"y\" } }";
|
|
var matcher = new JsonPathMatcher("$.things[?(@.name == 'x')]");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(json);
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_JObject()
|
|
{
|
|
// Arrange
|
|
string[] patterns = { "$..[?(@.Id == 1)]" };
|
|
var matcher = new JsonPathMatcher(patterns);
|
|
|
|
// Act
|
|
var jobject = new JObject
|
|
{
|
|
{ "Id", new JValue(1) },
|
|
{ "Name", new JValue("Test") }
|
|
};
|
|
double match = matcher.IsMatch(jobject);
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(1);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_JObject_Parsed()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("$..[?(@.Id == 1)]");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(JObject.Parse("{\"Id\":1,\"Name\":\"Test\"}"));
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(1);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_RejectOnMatch()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher(MatchBehaviour.RejectOnMatch, false, MatchOperator.Or, "$..[?(@.Id == 1)]");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(JObject.Parse("{\"Id\":1,\"Name\":\"Test\"}"));
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0.0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_ArrayOneLevel()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("$.arr[0].line1");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(JObject.Parse(@"{
|
|
""name"": ""PathSelectorTest"",
|
|
""test"": ""test"",
|
|
""test2"": ""test2"",
|
|
""arr"": [{
|
|
""line1"": ""line1"",
|
|
}]
|
|
}"));
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(1.0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_ObjectMatch()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("$.test");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(JObject.Parse(@"{
|
|
""name"": ""PathSelectorTest"",
|
|
""test"": ""test"",
|
|
""test2"": ""test2"",
|
|
""arr"": [
|
|
{
|
|
""line1"": ""line1"",
|
|
}
|
|
]
|
|
}"));
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(1.0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_DoesntMatch()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("$.test3");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(JObject.Parse(@"{
|
|
""name"": ""PathSelectorTest"",
|
|
""test"": ""test"",
|
|
""test2"": ""test2"",
|
|
""arr"": [
|
|
{
|
|
""line1"": ""line1"",
|
|
}
|
|
]
|
|
}"));
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0.0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_DoesntMatchInArray()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("$arr[0].line1");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(JObject.Parse(@"{
|
|
""name"": ""PathSelectorTest"",
|
|
""test"": ""test"",
|
|
""test2"": ""test2"",
|
|
""arr"": []
|
|
}"));
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0.0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_DoesntMatchNoObjectsInArray()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("$arr[2].line1");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(JObject.Parse(@"{
|
|
""name"": ""PathSelectorTest"",
|
|
""test"": ""test"",
|
|
""test2"": ""test2"",
|
|
""arr"": []
|
|
}"));
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(0.0);
|
|
}
|
|
|
|
[Fact]
|
|
public void JsonPathMatcher_IsMatch_NestedArrays()
|
|
{
|
|
// Arrange
|
|
var matcher = new JsonPathMatcher("$.arr[0].sub[0].subline1");
|
|
|
|
// Act
|
|
double match = matcher.IsMatch(JObject.Parse(@"{
|
|
""name"": ""PathSelectorTest"",
|
|
""test"": ""test"",
|
|
""test2"": ""test2"",
|
|
""arr"": [{
|
|
""line1"": ""line1"",
|
|
""sub"":[
|
|
{
|
|
""subline1"":""subline1""
|
|
}]
|
|
}]
|
|
}"));
|
|
|
|
// Assert
|
|
Check.That(match).IsEqualTo(1.0);
|
|
}
|
|
}
|