Summary

Class:WireMock.Matchers.JsonPathMatcher
Assembly:WireMock.Net
File(s):C:\Users\StefHeyenrath\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\StefHeyenrath\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"/>
 1419        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>
 1525        public JsonPathMatcher([NotNull] params string[] patterns) : this(MatchBehaviour.AcceptOnMatch, patterns)
 1526        {
 1527        }
 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>
 1634        public JsonPathMatcher(MatchBehaviour matchBehaviour, [NotNull] params string[] patterns)
 1635        {
 1636            Check.NotNull(patterns, nameof(patterns));
 37
 1638            MatchBehaviour = matchBehaviour;
 1639            _patterns = patterns;
 1640        }
 41
 42        /// <inheritdoc cref="IStringMatcher.IsMatch"/>
 43        public double IsMatch(string input)
 544        {
 545            double match = MatchScores.Mismatch;
 546            if (input != null)
 447            {
 48                try
 449                {
 450                    var jtoken = JToken.Parse(input);
 251                    match = IsMatch(jtoken);
 252                }
 253                catch (JsonException)
 254                {
 55                    // just ignore JsonException
 256                }
 457            }
 58
 559            return MatchBehaviourHelper.Convert(MatchBehaviour, match);
 560        }
 61
 62        /// <inheritdoc cref="IObjectMatcher.IsMatch"/>
 63        public double IsMatch(object input)
 964        {
 965            double match = MatchScores.Mismatch;
 66
 67            // When input is null or byte[], return Mismatch.
 968            if (input != null && !(input is byte[]))
 769            {
 70                try
 771                {
 72                    // Check if JToken or object
 773                    JToken jtoken = input is JToken token ? token : JObject.FromObject(input);
 774                    match = IsMatch(jtoken);
 775                }
 076                catch (JsonException)
 077                {
 78                    // just ignore JsonException
 079                }
 780            }
 81
 982            return MatchBehaviourHelper.Convert(MatchBehaviour, match);
 983        }
 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)
 995        {
 96            // Wrap in array if needed
 997            JToken tokenOrArray = jtoken is JArray ? jtoken : new JArray(jtoken);
 98
 2799            return MatchScores.ToScore(_patterns.Select(pattern => tokenOrArray.SelectToken(pattern) != null));
 9100        }
 101    }
 102}