Summary

Class:WireMock.Matchers.JsonPathMatcher
Assembly:WireMock.Net
File(s):C:\Users\azureuser\Documents\Github\WireMock.Net\src\WireMock.Net\Matchers\JSONPathMatcher.cs
Covered lines:43
Uncovered lines:3
Coverable lines:46
Total lines:102
Line coverage:93.4%
Branch coverage:90%

Metrics

MethodCyclomatic complexity NPath complexity Sequence coverage Branch coverage
IsMatch(...)0011
IsMatch(...)000.7861
GetPatterns()0010
IsMatch(...)0010.5
.ctor(...)0010
.ctor(...)0010

File(s)

C:\Users\azureuser\Documents\Github\WireMock.Net\src\WireMock.Net\Matchers\JSONPathMatcher.cs

#LineLine coverage
 1using System.Linq;
 2using JetBrains.Annotations;
 3using Newtonsoft.Json;
 4using Newtonsoft.Json.Linq;
 5using WireMock.Validation;
 6
 7namespace WireMock.Matchers
 8{
 9    /// <summary>
 10    /// JsonPathMatcher
 11    /// </summary>
 12    /// <seealso cref="IMatcher" />
 13    /// <seealso cref="IObjectMatcher" />
 14    public class JsonPathMatcher : IStringMatcher, IObjectMatcher
 15    {
 16        private readonly string[] _patterns;
 17
 18        /// <inheritdoc cref="IMatcher.MatchBehaviour"/>
 1619        public MatchBehaviour MatchBehaviour { get; }
 20
 21        /// <summary>
 22        /// Initializes a new instance of the <see cref="JsonPathMatcher"/> class.
 23        /// </summary>
 24        /// <param name="patterns">The patterns.</param>
 1725        public JsonPathMatcher([NotNull] params string[] patterns) : this(MatchBehaviour.AcceptOnMatch, patterns)
 1726        {
 1727        }
 28
 29        /// <summary>
 30        /// Initializes a new instance of the <see cref="JsonPathMatcher"/> class.
 31        /// </summary>
 32        /// <param name="matchBehaviour">The match behaviour.</param>
 33        /// <param name="patterns">The patterns.</param>
 1834        public JsonPathMatcher(MatchBehaviour matchBehaviour, [NotNull] params string[] patterns)
 1835        {
 1836            Check.NotNull(patterns, nameof(patterns));
 37
 1838            MatchBehaviour = matchBehaviour;
 1839            _patterns = patterns;
 1840        }
 41
 42        /// <inheritdoc cref="IStringMatcher.IsMatch"/>
 43        public double IsMatch(string input)
 644        {
 645            double match = MatchScores.Mismatch;
 646            if (input != null)
 547            {
 48                try
 549                {
 550                    var jtoken = JToken.Parse(input);
 351                    match = IsMatch(jtoken);
 352                }
 253                catch (JsonException)
 254                {
 55                    // just ignore JsonException
 256                }
 557            }
 58
 659            return MatchBehaviourHelper.Convert(MatchBehaviour, match);
 660        }
 61
 62        /// <inheritdoc cref="IObjectMatcher.IsMatch"/>
 63        public double IsMatch(object input)
 1064        {
 1065            double match = MatchScores.Mismatch;
 66
 67            // When input is null or byte[], return Mismatch.
 1068            if (input != null && !(input is byte[]))
 869            {
 70                try
 871                {
 72                    // Check if JToken or object
 873                    JToken jtoken = input is JToken token ? token : JObject.FromObject(input);
 874                    match = IsMatch(jtoken);
 875                }
 076                catch (JsonException)
 077                {
 78                    // just ignore JsonException
 079                }
 880            }
 81
 1082            return MatchBehaviourHelper.Convert(MatchBehaviour, match);
 1083        }
 84
 85        /// <inheritdoc cref="IStringMatcher.GetPatterns"/>
 86        public string[] GetPatterns()
 187        {
 188            return _patterns;
 189        }
 90
 91        /// <inheritdoc cref="IMatcher.Name"/>
 192        public string Name => "JsonPathMatcher";
 93
 94        private double IsMatch(JToken jtoken)
 1195        {
 96            // Wrap in array if needed
 1197            JToken tokenOrArray = jtoken is JArray ? jtoken : new JArray(jtoken);
 98
 3399            return MatchScores.ToScore(_patterns.Select(pattern => tokenOrArray.SelectToken(pattern) != null));
 11100        }
 101    }
 102}