Summary

Class:WireMock.Transformers.ResponseMessageTransformer
Assembly:WireMock.Net
File(s):C:\Users\StefHeyenrath\Documents\GitHub\WireMock.Net\src\WireMock.Net\Transformers\ResponseMessageTransformer.cs
Covered lines:78
Uncovered lines:4
Coverable lines:82
Total lines:135
Line coverage:95.1%
Branch coverage:92.8%

Metrics

MethodCyclomatic complexity NPath complexity Sequence coverage Branch coverage
Transform(...)0011
TransformBodyAsJson(...)000.8180.833
WalkNode(...)000.9440.929
TransformBodyAsString(...)0010
.cctor()0010

File(s)

C:\Users\StefHeyenrath\Documents\GitHub\WireMock.Net\src\WireMock.Net\Transformers\ResponseMessageTransformer.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using HandlebarsDotNet;
 5using Newtonsoft.Json;
 6using Newtonsoft.Json.Linq;
 7using WireMock.Util;
 8
 9namespace WireMock.Transformers
 10{
 11    internal static class ResponseMessageTransformer
 12    {
 13        static ResponseMessageTransformer()
 114        {
 115            HandlebarsHelpers.Register();
 116        }
 17
 18        public static ResponseMessage Transform(RequestMessage requestMessage, ResponseMessage original)
 3219        {
 3220            bool bodyIsJson = original.BodyAsJson != null;
 3221            var responseMessage = new ResponseMessage { StatusCode = original.StatusCode };
 22
 3223            if (!bodyIsJson)
 1924            {
 1925                responseMessage.BodyOriginal = original.Body;
 1926            }
 27
 3228            var template = new { request = requestMessage };
 29
 3230            if (!bodyIsJson)
 1931            {
 1932                TransformBodyAsString(template, original, responseMessage);
 1733            }
 34            else
 1335            {
 1336                TransformBodyAsJson(template, original, responseMessage);
 1037            }
 38
 39            // Headers
 2740            var newHeaders = new Dictionary<string, WireMockList<string>>();
 10541            foreach (var header in original.Headers)
 1242            {
 1243                var templateHeaderKey = Handlebars.Compile(header.Key);
 1244                var templateHeaderValues = header.Value
 1245                    .Select(Handlebars.Compile)
 2546                    .Select(func => func(template))
 1247                    .ToArray();
 48
 1249                newHeaders.Add(templateHeaderKey(template), new WireMockList<string>(templateHeaderValues));
 1250            }
 51
 2752            responseMessage.Headers = newHeaders;
 53
 2754            return responseMessage;
 2755        }
 56
 57        private static void TransformBodyAsJson(object template, ResponseMessage original, ResponseMessage responseMessa
 1358        {
 59            JToken jToken;
 1360            switch (original.BodyAsJson)
 61            {
 62                case JObject bodyAsJObject:
 063                    jToken = bodyAsJObject;
 064                    break;
 65
 66                case Array bodyAsArray:
 167                    jToken = JArray.FromObject(bodyAsArray);
 168                    break;
 69
 70                default:
 1271                    jToken = JObject.FromObject(original.BodyAsJson);
 1272                    break;
 73            }
 74
 1375            WalkNode(jToken, template);
 76
 1077            responseMessage.BodyAsJson = jToken;
 1078        }
 79
 80        private static void WalkNode(JToken node, object template)
 3081        {
 3082            if (node.Type == JTokenType.Object)
 1283            {
 84                // In case of Object, loop all children. Do a ToArray() to avoid `Collection was modified` exceptions.
 5785                foreach (JProperty child in node.Children<JProperty>().ToArray())
 1286                {
 1287                    WalkNode(child.Value, template);
 988                }
 989            }
 1890            else if (node.Type == JTokenType.Array)
 191            {
 92                // In case of Array, loop all items. Do a ToArray() to avoid `Collection was modified` exceptions.
 1393                foreach (JToken child in node.Children().ToArray())
 594                {
 595                    WalkNode(child, template);
 596                }
 197            }
 1798            else if (node.Type == JTokenType.String)
 1799            {
 100                // In case of string, try to transform the value.
 17101                string stringValue = node.Value<string>();
 17102                if (string.IsNullOrEmpty(stringValue))
 0103                {
 0104                    return;
 105                }
 106
 17107                var templateForStringValue = Handlebars.Compile(stringValue);
 17108                string transformedString = templateForStringValue(template);
 14109                if (!string.Equals(stringValue, transformedString))
 12110                {
 111                    JToken value;
 112                    try
 12113                    {
 114                        // Try to convert this string into a real JsonObject
 12115                        value = JToken.Parse(transformedString);
 2116                    }
 10117                    catch (JsonException)
 10118                    {
 119                        // Ignore JsonException and just convert to JToken
 10120                        value = transformedString;
 10121                    }
 122
 12123                    node.Replace(value);
 12124                }
 14125            }
 24126        }
 127
 128        private static void TransformBodyAsString(object template, ResponseMessage original, ResponseMessage responseMes
 19129        {
 19130            var templateBody = Handlebars.Compile(original.Body);
 131
 19132            responseMessage.Body = templateBody(template);
 17133        }
 134    }
 135}