From 5b2800ecd38a7bba71a7b412e4a2a78cb518f6a2 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 14:48:29 +0100 Subject: [PATCH 01/37] - support JetBrains Rider --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index dfcfd56..4db1e69 100644 --- a/.gitignore +++ b/.gitignore @@ -348,3 +348,7 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ + +# JetBrains Rider +.idea/ +*.sln.iml From db340154f55f6ff4dbc9cb0f9f3be5ce8932e0c0 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 14:49:05 +0100 Subject: [PATCH 02/37] - update to Framework 4.8 - update binding redirects --- .Net Framework/src/AutoMapper/JsonToJsonMapper.csproj | 2 +- .../JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj | 2 +- .Net Framework/test/JsonToJsonMapper.Tests/app.config | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj b/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj index 1f98459..8866b74 100644 --- a/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj +++ b/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj @@ -38,7 +38,7 @@ prompt 4 true - v4.6 + v4.8 1.0.0-preview diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj b/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj index ab3ae25..0c6779c 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj +++ b/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj @@ -8,7 +8,7 @@ Properties JsonToJsonMapper.Tests JsonToJsonMapper.Tests - v4.6 + v4.8 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/app.config b/.Net Framework/test/JsonToJsonMapper.Tests/app.config index bfe422d..ca2802a 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/app.config +++ b/.Net Framework/test/JsonToJsonMapper.Tests/app.config @@ -12,15 +12,15 @@ - + - + - + From 68b3aba67e06a4e74ebe80798dc0b5d611b7cd9f Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 14:55:52 +0100 Subject: [PATCH 03/37] - reSharper move to one class per file - reSharper formatting + code cleanup --- .Net Framework/src/AutoMapper/AutoMapper.cs | 709 ++--- .../src/AutoMapper/AutoMapperConfig.cs | 10 + .Net Framework/src/AutoMapper/ConvertValue.cs | 14 + .../src/AutoMapper/ExtensionMethods.cs | 25 +- .../AutoMapper/Handlers/FunctionHandler.cs | 481 +-- .../Handlers/ITransformationHandler.cs | 8 +- .../Handlers/RoslynScriptHandler.cs | 84 +- .../Handlers/TransformationFactory.cs | 31 + .../Handlers/TransformationHandlersFactory.cs | 35 - .../AutoMapper/Handlers/TransposeHandler.cs | 76 +- .../Handlers/TypeConverterHandler.cs | 363 ++- .../Handlers/ValueMappingHandler.cs | 56 +- .../src/AutoMapper/JsonToJsonMapper.csproj | 11 +- .../src/AutoMapper/JsonTransform.cs | 16 + .Net Framework/src/AutoMapper/MappingRule.cs | 20 + .Net Framework/src/AutoMapper/Reference.cs | 8 + .Net Framework/src/AutoMapper/Rule.cs | 68 + .../src/AutoMapper/ScriptDefinitions.cs | 12 + .Net Framework/src/AutoMapper/ScriptHost.cs | 7 + .Net Framework/src/AutoMapper/Transform.cs | 22 + .../JsonToJsonMapper.Tests/AutoMapperTest.cs | 2710 ++++++++--------- .../JsonToJsonMapper.Tests.csproj | 1 + .../OneToOneMapping/Transformation_Input.json | 3 +- .../Jsons/RangeMapping/RangeMappingRules.json | 9 - .../RangeMapping/Transformation_Input.json | 5 +- .../Jsons/ToUpper/Upper_Mapping.json | 4 +- .../test/JsonToJsonMapper.Tests/LeadRecord.cs | 12 + 27 files changed, 2410 insertions(+), 2390 deletions(-) create mode 100644 .Net Framework/src/AutoMapper/AutoMapperConfig.cs create mode 100644 .Net Framework/src/AutoMapper/ConvertValue.cs create mode 100644 .Net Framework/src/AutoMapper/Handlers/TransformationFactory.cs delete mode 100644 .Net Framework/src/AutoMapper/Handlers/TransformationHandlersFactory.cs create mode 100644 .Net Framework/src/AutoMapper/JsonTransform.cs create mode 100644 .Net Framework/src/AutoMapper/MappingRule.cs create mode 100644 .Net Framework/src/AutoMapper/Reference.cs create mode 100644 .Net Framework/src/AutoMapper/Rule.cs create mode 100644 .Net Framework/src/AutoMapper/ScriptDefinitions.cs create mode 100644 .Net Framework/src/AutoMapper/ScriptHost.cs create mode 100644 .Net Framework/src/AutoMapper/Transform.cs create mode 100644 .Net Framework/test/JsonToJsonMapper.Tests/LeadRecord.cs diff --git a/.Net Framework/src/AutoMapper/AutoMapper.cs b/.Net Framework/src/AutoMapper/AutoMapper.cs index 762e466..d2ad749 100644 --- a/.Net Framework/src/AutoMapper/AutoMapper.cs +++ b/.Net Framework/src/AutoMapper/AutoMapper.cs @@ -1,481 +1,346 @@ -using Microsoft.CodeAnalysis.CSharp.Scripting; +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.CodeAnalysis.CSharp.Scripting; using Microsoft.CodeAnalysis.Scripting; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; namespace JsonToJsonMapper { - public class AutoMapper : IDisposable + public class AutoMapper : IDisposable + { + public MappingRule Mapping { get; set; } + private JsonSerializerSettings JsonConvertSettings { get; set; } + private readonly TransformationFactory handler; + + public AutoMapper(string autoMapperConfig) { - public MappingRule Mapping { get; set; } - JsonSerializerSettings JsonConvertSettings { get; set; } - readonly TransformationFactory handler; - public AutoMapper(string autoMapperConfig) + JsonConvertSettings = new JsonSerializerSettings(); + JsonConvertSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; + JsonConvertSettings.DateParseHandling = DateParseHandling.None; + handler = new TransformationFactory(); + var config = JsonConvert.DeserializeObject(autoMapperConfig); + Mapping = config.MappingRuleConfig; + + if (Mapping == null || !Mapping.TruthTable.Any()) + throw new Exception("Invalid mapping json"); + + var scripts = new Dictionary(); + + // Compile and Load all the scripts in memory + if (config.Scripts != null) + { + foreach (var script in config.Scripts) { - JsonConvertSettings = new JsonSerializerSettings(); - JsonConvertSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; - JsonConvertSettings.DateParseHandling = DateParseHandling.None; - handler = new TransformationFactory(); - var config = JsonConvert.DeserializeObject(autoMapperConfig); - Mapping = config.MappingRuleConfig; - - if (Mapping == null || !Mapping.TruthTable.Any()) - throw new Exception("Invalid mapping json"); - - var scripts = new Dictionary(); - - // Compile and Load all the scripts in memory - if (config.Scripts != null) - { - foreach (var script in config.Scripts) - { - if (script.Reference != null) - { - // With assembly import - ScriptOptions options = ScriptOptions.Default.AddReferences(script.Reference.Assembly).WithImports(script.Reference.NameSpace); - scripts.Add(script.Name, CSharpScript.Create(script.Code, options, globalsType: typeof(ScriptHost))); - } - else - scripts.Add(script.Name, CSharpScript.Create(script.Code, globalsType: typeof(ScriptHost))); - } - } + if (script.Reference != null) + { + // With assembly import + ScriptOptions options = ScriptOptions.Default.AddReferences(script.Reference.Assembly).WithImports(script.Reference.NameSpace); + scripts.Add(script.Name, CSharpScript.Create(script.Code, options, globalsType: typeof(ScriptHost))); + } + else + scripts.Add(script.Name, CSharpScript.Create(script.Code, globalsType: typeof(ScriptHost))); + } + } - // Load all the handlers + // Load all the handlers - handler.AddHandlers(new TransposeHandler()); - handler.AddHandlers(new TypeConverterHandler()); - handler.AddHandlers(new ValueMappingHandler()); - handler.AddHandlers(new RoslynScriptHandler(scripts)); - handler.AddHandlers(new FunctionHandler()); + handler.AddHandlers(new TransposeHandler()); + handler.AddHandlers(new TypeConverterHandler()); + handler.AddHandlers(new ValueMappingHandler()); + handler.AddHandlers(new RoslynScriptHandler(scripts)); + handler.AddHandlers(new FunctionHandler()); + } - } + /// + /// Transforms into a type + /// + /// + /// + public object Transform(string inputJson) + { + if (Mapping.DestinationType == null) + throw new Exception("Invalid mapping json"); - /// - /// Transforms into a type - /// - /// - /// - public object Transform(string inputJson) - { - if (Mapping.DestinationType == null) - throw new Exception("Invalid mapping json"); + return Execute((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping); + } - return Execute((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping); - } - public object Transform(JObject jObj) - { - if (Mapping.DestinationType == null) - throw new Exception("Invalid mapping json"); + public object Transform(JObject jObj) + { + if (Mapping.DestinationType == null) + throw new Exception("Invalid mapping json"); - return Execute(jObj, Mapping); - } + return Execute(jObj, Mapping); + } - /// - /// Creates an intance of destination type and sets the properties - /// - /// - /// - /// - private object Execute(JObject jsonObject, MappingRule mapping) + /// + /// Creates an intance of destination type and sets the properties + /// + /// + /// + /// + private object Execute(JObject jsonObject, MappingRule mapping) + { + Type type = Type.GetType(mapping.DestinationType, true); + var entity = Activator.CreateInstance(type); + + // Set the value for each item in destinationType + foreach (var rule in mapping.TruthTable) + { + var propertyInfo = entity.GetType().GetProperty(rule.DestinationColumn); + if (propertyInfo != null) { - Type type = Type.GetType(mapping.DestinationType, true); - var entity = Activator.CreateInstance(type); + if (rule.ComplexType == null) + { + string valueType; + var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); - // Set the value for each item in destinationType - foreach (var rule in mapping.TruthTable) + if (value != null) { - var propertyInfo = entity.GetType().GetProperty(rule.DestinationColumn); - if (propertyInfo != null) - { - if (rule.ComplexType == null) - { - string valueType; - var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); - - if (value != null) - { - if (rule.DataType == null) - rule.DataType = valueType; - var finalValue = handler.GetHandler() - .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); - propertyInfo.SetValue(entity, finalValue, null); - } - else - propertyInfo.SetValue(entity, value, null); - - } - else - { - propertyInfo.SetValue(entity, Execute(jsonObject, rule.ComplexType), null); - } - } + if (rule.DataType == null) + rule.DataType = valueType; + var finalValue = handler.GetHandler() + .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); + propertyInfo.SetValue(entity, finalValue, null); } - return entity; + else + propertyInfo.SetValue(entity, value, null); + } + else + { + propertyInfo.SetValue(entity, Execute(jsonObject, rule.ComplexType), null); + } } + } - /// - /// Transforms into Json - /// - /// - /// - /// - public string TransformIntoJson(string inputJson, bool ignoreNullValue) - { - Mapping.IgnoreNullValue = ignoreNullValue; - return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); - } + return entity; + } - public JObject TransformIntoJson(JObject jObj, bool ignoreNullValue) - { - Mapping.IgnoreNullValue = ignoreNullValue; - return ExecuteToJson(jObj, Mapping); - } + /// + /// Transforms into Json + /// + /// + /// + /// + public string TransformIntoJson(string inputJson, bool ignoreNullValue) + { + Mapping.IgnoreNullValue = ignoreNullValue; + return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); + } - /// - /// Transforms into json. Uses the IgnoreNullValue from the config, default is true. - /// - /// - /// + public JObject TransformIntoJson(JObject jObj, bool ignoreNullValue) + { + Mapping.IgnoreNullValue = ignoreNullValue; + return ExecuteToJson(jObj, Mapping); + } - public string TransformIntoJson(string inputJson) - { - return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); - } + /// + /// Transforms into json. Uses the IgnoreNullValue from the config, default is true. + /// + /// + /// + public string TransformIntoJson(string inputJson) + { + return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); + } - public string TransformIntoJson(JObject jObj) + public string TransformIntoJson(JObject jObj) + { + return JsonConvert.SerializeObject(ExecuteToJson(jObj, Mapping)); + } + + protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) + { + var jsonString = new JsonTransform(); + foreach (var rule in mapping.TruthTable) + { + // handle transpose + if (rule.TransformValue != null && rule.TransformValue.Type != null && string.Equals(rule.TransformValue.Type, "promoteArrayToProperty", StringComparison.OrdinalIgnoreCase)) { - return JsonConvert.SerializeObject(ExecuteToJson(jObj, Mapping)); + Dictionary transposeResponse = handler.GetHandler() + .Run(JObject.FromObject(rule), jsonObject); + if (transposeResponse != null) + jsonString.Json.AddRange(transposeResponse); } - protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) + else if (!string.IsNullOrEmpty(rule.DestinationColumn)) { - var jsonString = new JsonTransform(); - foreach (var rule in mapping.TruthTable) + if (rule.ComplexType == null) + { + // Handle Jvalue + string valueType; + string destinationValue = rule.DestinationColumn.StartsWith("$") ? jsonObject.SelectToken(rule.DestinationColumn).ToString() : rule.DestinationColumn; + + var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); + if (rule.DataType == null) + rule.DataType = valueType; + var finalValue = handler.GetHandler() + .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); + if (finalValue != null || finalValue.Type != JTokenType.Null || (finalValue == null && !mapping.IgnoreNullValue) || (finalValue.Type == JTokenType.Null && !mapping.IgnoreNullValue)) + jsonString.Json.Add(destinationValue, finalValue); + } + else if (rule.ComplexType.DataType != null && rule.ComplexType.DataType.ToUpperInvariant().Equals("JARRAY")) + { + var result = TransformJArray(jsonObject, rule.ComplexType, mapping.IgnoreNullValue); + if (result != null) + jsonString.Json.Add(rule.DestinationColumn, result); + } + else + { + // Recursive call to handle complex type + var result = ExecuteToJson(jsonObject, rule.ComplexType); + if (result != null) { - // handle transpose - if (rule.TransformValue != null && rule.TransformValue.Type != null && string.Equals(rule.TransformValue.Type, "promoteArrayToProperty", StringComparison.OrdinalIgnoreCase)) - { - Dictionary transposeResponse = handler.GetHandler() - .Run(JObject.FromObject(rule), jsonObject); - if (transposeResponse != null) - jsonString.Json.AddRange(transposeResponse); - } - else if (!string.IsNullOrEmpty(rule.DestinationColumn)) - { - if (rule.ComplexType == null) - { - // Handle Jvalue - string valueType; - string destinationValue = rule.DestinationColumn.StartsWith("$") ? jsonObject.SelectToken(rule.DestinationColumn).ToString() : rule.DestinationColumn; - - var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue,out valueType); - if (rule.DataType == null) - rule.DataType = valueType; - var finalValue = handler.GetHandler() - .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); - if (finalValue != null || finalValue.Type != JTokenType.Null || (finalValue == null && !mapping.IgnoreNullValue) || (finalValue.Type == JTokenType.Null && !mapping.IgnoreNullValue)) - jsonString.Json.Add(destinationValue, finalValue); - } - else if (rule.ComplexType.DataType != null && rule.ComplexType.DataType.ToUpperInvariant().Equals("JARRAY")) - { - var result = TransformJArray(jsonObject, rule.ComplexType, mapping.IgnoreNullValue); - if (result != null) - jsonString.Json.Add(rule.DestinationColumn, result); - } - else - { - // Recursive call to handle complex type - var result = ExecuteToJson(jsonObject, rule.ComplexType); - if (result != null) - { - if (!string.IsNullOrWhiteSpace(rule.DataType)) - jsonString.Json.Add(rule.DestinationColumn, handler.GetHandler() - .Run(JObject.FromObject(rule), JObject.FromObject(new { value = result }))); - - else - jsonString.Json.Add(rule.DestinationColumn, result); - } - } - } - } - - return JObject.FromObject(jsonString); + if (!string.IsNullOrWhiteSpace(rule.DataType)) + jsonString.Json.Add(rule.DestinationColumn, handler.GetHandler() + .Run(JObject.FromObject(rule), JObject.FromObject(new { value = result }))); + else + jsonString.Json.Add(rule.DestinationColumn, result); + } + } } + } + + return JObject.FromObject(jsonString); + } - private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ignoreNullVaue) + private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ignoreNullVaue) + { + var tokens = jsonObject.SelectTokens(mapping.Node); + JArray array = new JArray(); + bool hasToken = false; + foreach (var item in tokens) + { + hasToken = true; + if (string.Equals(item.GetType().Name, "jarray", StringComparison.OrdinalIgnoreCase)) { - var tokens = jsonObject.SelectTokens(mapping.Node); - JArray array = new JArray(); - bool hasToken = false; - foreach (var item in tokens) + JArray itemJArray = (JArray)item; + if (itemJArray.Any()) + { + foreach (var a in itemJArray) { - hasToken = true; - if (string.Equals(item.GetType().Name, "jarray", StringComparison.OrdinalIgnoreCase)) - { - JArray itemJArray = (JArray)item; - if (itemJArray.Any()) - { - foreach (var a in itemJArray) - { - var o = (JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)a, mapping)), JsonConvertSettings); - array.Add(o); - } - } - else - { - itemJArray.Add(new JObject(new JProperty("temp", ""))); - array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item.FirstOrDefault(), mapping)))); - } - } - else - { - array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item, mapping)), JsonConvertSettings)); - } + var o = (JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)a, mapping)), JsonConvertSettings); + array.Add(o); } - if (!hasToken && mapping.IgnoreEmptyArray) - return null; - return array; + } + else + { + itemJArray.Add(new JObject(new JProperty("temp", ""))); + array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item.FirstOrDefault(), mapping)))); + } } - private string GetValue(JObject jsonObject, string key, Transform transform, out string valueType) + else { - string value = null; - valueType = "string"; + array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item, mapping)), JsonConvertSettings)); + } + } - if (transform != null && transform.Type != null && transform.Type.Equals("SCRIPT", StringComparison.OrdinalIgnoreCase)) - { - return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); - } - else if (transform != null && transform.Type != null && transform.Type.Equals("FUNCTION", StringComparison.OrdinalIgnoreCase)) + if (!hasToken && mapping.IgnoreEmptyArray) + return null; + return array; + } + + private string GetValue(JObject jsonObject, string key, Transform transform, out string valueType) + { + string value = null; + valueType = "string"; + + if (transform != null && transform.Type != null && transform.Type.Equals("SCRIPT", StringComparison.OrdinalIgnoreCase)) + { + return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); + } + else if (transform != null && transform.Type != null && transform.Type.Equals("FUNCTION", StringComparison.OrdinalIgnoreCase)) + { + return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); + } + else if (!string.IsNullOrEmpty(key) && key.StartsWith("$")) + { + if (!key.ToUpperInvariant().Contains("[{PARENT}]")) + { + JToken token = jsonObject.SelectToken(key); + if (token != null && token.Value() != null) + { + valueType = token.Type.ToString(); + string tokenValue = token.ToString(); + if (token.GetType().Name.Equals("JVALUE", StringComparison.OrdinalIgnoreCase) && token.Type == JTokenType.Null) + value = null; + else if (valueType.Equals("Date", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) { - return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); + string val = (token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries).Length > 1) ? token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries)[1] : tokenValue; + value = val.Replace("\"", "").Trim(); } - else if (!string.IsNullOrEmpty(key) && key.StartsWith("$")) + else if (valueType.Equals("Boolean", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) { - if (!key.ToUpperInvariant().Contains("[{PARENT}]")) - { - JToken token = jsonObject.SelectToken(key); - if (token != null && token.Value() != null) - { - valueType = token.Type.ToString(); - string tokenValue = token.ToString(); - if (token.GetType().Name.Equals("JVALUE", StringComparison.OrdinalIgnoreCase) && token.Type == JTokenType.Null) - value = null; - else if (valueType.Equals("Date", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) - { - string val = (token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries).Length > 1)? token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries)[1] : tokenValue; - value = val.Replace("\"", "").Trim(); - } - else if (valueType.Equals("Boolean", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) - { - value = tokenValue.ToLowerInvariant(); - } - else - { - value = tokenValue; - } - } - else - value = null; - } - else - { - JContainer json; - json = jsonObject.Parent; - for (int i = 2; i < key.Split(new string[] { "[{parent}]" }, System.StringSplitOptions.None).Length; i++) - { - json = json.Parent; - } - JToken valueToken = json.SelectToken(key.Replace("[{parent}].", "").Replace("$.", "")); - if (valueToken != null) - { - valueType = valueToken.Type.ToString(); - if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) - value = valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", ""); - else if (valueToken.Value() != null) - { - value = valueToken.ToString(); - } - else - value = null; - } - else - value = null; - } + value = tokenValue.ToLowerInvariant(); } else { - var jsonobjectvalue = jsonObject.GetValue(key, StringComparison.OrdinalIgnoreCase); - if (jsonobjectvalue == null || jsonobjectvalue.Type == JTokenType.Null) - value = null; - else - { - valueType = jsonobjectvalue.Type.ToString(); - value = jsonobjectvalue.ToString(); - if (value.StartsWith("\"")) - value = value.Substring(1); - if (value.EndsWith("\"")) - value = value.Substring(0, value.Length - 1); - } + value = tokenValue; } - - if (transform != null) - value = handler.GetHandler() - .Run(JObject.FromObject(transform), JObject.FromObject(new { value = value })); - - return value; - } - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - // Protected implementation of Dispose pattern. - protected virtual void Dispose(bool disposing) - { - Mapping = null; - } - } - public class AutoMapperConfig - { - public List Scripts { get; set; } - public MappingRule MappingRuleConfig { get; set; } - } - public class MappingRule - { - public string DestinationType { get; set; } - public string DataType { get; set; } - public string Node { get; set; } - public bool IgnoreEmptyArray { get; set; } - - public bool IgnoreNullValue { get; set; } = true; - public List TruthTable { get; set; } - public MappingRule() - { - TruthTable = new List(); - } - } - - public class Rule - { - public string SourceColumn { get; set; } - public string DestinationColumn { get; set; } - public string DataType { get; set; } - public string Format { get; set; } - public MappingRule ComplexType { get; set; } - public Transform TransformValue { get; set; } - public Rule(string sourceColumn, string destinationColumn, string dataType) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - } - public Rule(string sourceColumn, string destinationColumn, string dataType, string format) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - Format = format; - } - public Rule(string sourceColumn, string destinationColumn, string dataType, MappingRule mappingRule) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - ComplexType = mappingRule; + } + else + value = null; } - - public Rule(string sourceColumn, string destinationColumn, string dataType, MappingRule mappingRule, Transform transform) + else { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - ComplexType = mappingRule; - TransformValue = transform; + JContainer json; + json = jsonObject.Parent; + for (int i = 2; i < key.Split(new string[] { "[{parent}]" }, StringSplitOptions.None).Length; i++) + { + json = json.Parent; + } + + JToken valueToken = json.SelectToken(key.Replace("[{parent}].", "").Replace("$.", "")); + if (valueToken != null) + { + valueType = valueToken.Type.ToString(); + if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) + value = valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", ""); + else if (valueToken.Value() != null) + { + value = valueToken.ToString(); + } + else + value = null; + } + else + value = null; } - - public Rule(string sourceColumn, string destinationColumn, string dataType, Transform transform) + } + else + { + var jsonobjectvalue = jsonObject.GetValue(key, StringComparison.OrdinalIgnoreCase); + if (jsonobjectvalue == null || jsonobjectvalue.Type == JTokenType.Null) + value = null; + else { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - TransformValue = transform; + valueType = jsonobjectvalue.Type.ToString(); + value = jsonobjectvalue.ToString(); + if (value.StartsWith("\"")) + value = value.Substring(1); + if (value.EndsWith("\"")) + value = value.Substring(0, value.Length - 1); } + } - public Rule(string sourceColumn, string destinationColumn, string dataType, string format, Transform transform) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - Format = format; - TransformValue = transform; - } + if (transform != null) + value = handler.GetHandler() + .Run(JObject.FromObject(transform), JObject.FromObject(new { value = value })); - public Rule() - { - SourceColumn = string.Empty; - DestinationColumn = string.Empty; - DataType = string.Empty; - } + return value; } - public class Transform + public void Dispose() { - public string Type { get; set; } - public string PrependKeyText { get; set; } - public List ValueMapping { get; set; } - public string DefaultValue { get; set; } - public string ScriptName { get; set; } - public List Params { get; set; } - public string KeyLookupField { get; set; } - public string ValueLookupField { get; set; } - public string Function { get; set; } - public string Delimeter { get; set; } - public string CompareToValue { get; set; } - public string ReturnValue { get; set; } - public string IgnoreEmptyParams { get; set; } - public int Index { get; set; } - - } - public class ConvertValue - { - public string ExistingValue { get; set; } - public string NewValue { get; set; } - public ConvertValue(string existingValue, string newValue) - { - ExistingValue = existingValue; - NewValue = newValue; - } - } - public class JsonTransform - { - [JsonExtensionData] - public Dictionary Json { get; set; } - public JsonTransform() - { - Json = new Dictionary(); - } + Dispose(true); + GC.SuppressFinalize(this); } - public class ScriptDefinitions - { - public string Name { get; set; } - public string Code { get; set; } - public Script ScriptIL { get; set; } - public Reference Reference { get; set; } - } - public class Reference - { - public string Assembly { get; set; } - public string NameSpace { get; set; } - } - public class ScriptHost + // Protected implementation of Dispose pattern. + protected virtual void Dispose(bool disposing) { - public string Args { get; set; } + Mapping = null; } -} \ No newline at end of file + } +} diff --git a/.Net Framework/src/AutoMapper/AutoMapperConfig.cs b/.Net Framework/src/AutoMapper/AutoMapperConfig.cs new file mode 100644 index 0000000..1da2fb5 --- /dev/null +++ b/.Net Framework/src/AutoMapper/AutoMapperConfig.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace JsonToJsonMapper +{ + public class AutoMapperConfig + { + public List Scripts { get; set; } + public MappingRule MappingRuleConfig { get; set; } + } +} diff --git a/.Net Framework/src/AutoMapper/ConvertValue.cs b/.Net Framework/src/AutoMapper/ConvertValue.cs new file mode 100644 index 0000000..350a548 --- /dev/null +++ b/.Net Framework/src/AutoMapper/ConvertValue.cs @@ -0,0 +1,14 @@ +namespace JsonToJsonMapper +{ + public class ConvertValue + { + public string ExistingValue { get; set; } + public string NewValue { get; set; } + + public ConvertValue(string existingValue, string newValue) + { + ExistingValue = existingValue; + NewValue = newValue; + } + } +} diff --git a/.Net Framework/src/AutoMapper/ExtensionMethods.cs b/.Net Framework/src/AutoMapper/ExtensionMethods.cs index f3b8cd2..e455bf7 100644 --- a/.Net Framework/src/AutoMapper/ExtensionMethods.cs +++ b/.Net Framework/src/AutoMapper/ExtensionMethods.cs @@ -1,20 +1,15 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; namespace JsonToJsonMapper { - public static class ExtensionMethods - { - public static void AddRange(this Dictionary dictA, Dictionary dictB) - { - foreach (KeyValuePair pair in dictB) - { - dictA[pair.Key] = pair.Value; - } - } + public static class ExtensionMethods + { + public static void AddRange(this Dictionary dictA, Dictionary dictB) + { + foreach (KeyValuePair pair in dictB) + { + dictA[pair.Key] = pair.Value; + } } + } } diff --git a/.Net Framework/src/AutoMapper/Handlers/FunctionHandler.cs b/.Net Framework/src/AutoMapper/Handlers/FunctionHandler.cs index eed8ff8..ab80e2c 100644 --- a/.Net Framework/src/AutoMapper/Handlers/FunctionHandler.cs +++ b/.Net Framework/src/AutoMapper/Handlers/FunctionHandler.cs @@ -9,283 +9,284 @@ namespace JsonToJsonMapper { - public class FunctionHandler : ITransformationHandler + public class FunctionHandler : ITransformationHandler + { + public dynamic Run(JObject transform, JObject input) { - public dynamic Run(JObject transform, JObject input) + var inputParam = new List(); + string nullString = null; + var parameters = transform["Params"].ToObject>(); + var function = transform["Function"].Value(); + string ignoreEmptyValue = transform["IgnoreEmptyParams"] != null ? transform["IgnoreEmptyParams"].Value() : string.Empty; + if (!string.IsNullOrWhiteSpace(function) && function.Equals("URIESCAPEDATASTRING", StringComparison.OrdinalIgnoreCase) == false) + { + if (parameters != null) { - var inputParam = new List(); - string nullString = null; - var parameters = transform["Params"].ToObject>(); - var function = transform["Function"].Value(); - string ignoreEmptyValue = transform["IgnoreEmptyParams"] != null ? transform["IgnoreEmptyParams"].Value() : string.Empty; - if (!string.IsNullOrWhiteSpace(function) && function.Equals("URIESCAPEDATASTRING",StringComparison.OrdinalIgnoreCase) == false) - { - if (parameters != null) + foreach (var item in parameters) + { + if (!(item is JToken)) + if (item.StartsWith("$")) + { + if (!item.ToUpperInvariant().Contains("[{PARENT}]")) { - foreach (var item in parameters) + var tokens = input.SelectTokens((string)item); + if (tokens != null && tokens.Any()) + { + foreach (var i in tokens) { - if (!(item is JToken)) - if (item.StartsWith("$")) - { - if (!item.ToUpperInvariant().Contains("[{PARENT}]")) - { - var tokens = input.SelectTokens((string)item); - if (tokens != null && tokens.Any()) - { - foreach (var i in tokens) - { - if (i.Type == JTokenType.Null) - { - inputParam.Add(nullString); - } - else if (string.IsNullOrWhiteSpace(i.ToString())) - { - if (Convert.ToBoolean(ignoreEmptyValue)) - inputParam.Add(nullString); - else - inputParam.Add(i.ToString()); - } - else - { - inputParam.Add(i.ToString()); - } - - } - } - else - { - inputParam.Add(nullString); - } - } - else - { - JContainer json; - json = input.Parent; - for (int i = 2; i < item.Split(new string[] { "[{parent}]" }, System.StringSplitOptions.None).Length; i++) - { - json = json.Parent; - } - JToken valueToken = json.SelectToken(item.Replace("[{parent}].", "").Replace("$.", "")); - if (valueToken != null) - { - if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) - inputParam.Add(valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); - else if (valueToken.Value() != null) - { - if (string.IsNullOrWhiteSpace(valueToken.ToString())) - { - if (Convert.ToBoolean(ignoreEmptyValue)) - inputParam.Add(nullString); - else - inputParam.Add(valueToken.ToString()); - } - else - { - inputParam.Add(valueToken.ToString()); - } - } - else - inputParam.Add(nullString); - } - else - inputParam.Add(nullString); - } - } - else - inputParam.Add(item); + if (i.Type == JTokenType.Null) + { + inputParam.Add(nullString); + } + else if (string.IsNullOrWhiteSpace(i.ToString())) + { + if (Convert.ToBoolean(ignoreEmptyValue)) + inputParam.Add(nullString); + else + inputParam.Add(i.ToString()); + } + else + { + inputParam.Add(i.ToString()); + } } - } - } - switch (function.ToUpperInvariant()) - { - case "CONCAT": - return ConCat(inputParam, transform["Delimeter"].Value()); - case "REPLACEVALUE": - { - string compareToValue = transform["CompareToValue"].Value(); - string returnValue = transform["ReturnValue"].Value(); - string defaultValue = transform["DefaultValue"].Value(); - - compareToValue = GetCompareValue(input, nullString, compareToValue); - returnValue = GetTokenValue(input, nullString, returnValue); - defaultValue = GetTokenValue(input, nullString, defaultValue); - return ReplaceValue(inputParam, compareToValue, returnValue, defaultValue); - } - case "REPLACEVALUEWITHREGEXCOMPARISON": - { - string compareToValue = transform["CompareToValue"].Value(); - string returnValue = transform["ReturnValue"].Value(); - string defaultValue = transform["DefaultValue"].Value(); - compareToValue = GetCompareValue(input, nullString, compareToValue); - - returnValue = GetTokenValue(input, nullString, returnValue); - defaultValue = GetTokenValue(input, nullString, defaultValue); - - return ReplaceValueWithRegexComparison(inputParam, compareToValue, returnValue, defaultValue); - } - case "SPLIT": - { - char delimeter = transform["Delimeter"].Value(); - int index = transform["Index"].Value(); - var positionToken = transform["Position"]; - string position = positionToken != null ? positionToken.ToString() : string.Empty; - return Split(inputParam, delimeter, index, position); - } - case "TOUPPERCASE": - { - return inputParam[0] != null ? inputParam[0].ToUpperInvariant() : string.Empty; - } - case "TOLOWERCASE": - { - return inputParam[0] != null ? inputParam[0].ToLowerInvariant() : string.Empty; - } - case "RANGEMAPPING": - { - return mapRange((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); - } - case "ONETOONEMAPPING": - { - return mapOneToOne((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); - } - case "URIESCAPEDATASTRING": - { - UriEscapeDataString(input, parameters); - break; - } - } - return null; - } - - private string GetTokenValue(JObject input, string nullString, string Value) - { - if (Value != null && Value.StartsWith("$.")) - { - var returnValueToken = input.SelectToken(Value); - if (returnValueToken == null) - { - Value = nullString; + } + else + { + inputParam.Add(nullString); + } } else { - if (returnValueToken.Type == JTokenType.Null) + JContainer json; + json = input.Parent; + for (int i = 2; i < item.Split(new string[] { "[{parent}]" }, System.StringSplitOptions.None).Length; i++) + { + json = json.Parent; + } + + JToken valueToken = json.SelectToken(item.Replace("[{parent}].", "").Replace("$.", "")); + if (valueToken != null) + { + if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) + inputParam.Add(valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); + else if (valueToken.Value() != null) { - Value = nullString; + if (string.IsNullOrWhiteSpace(valueToken.ToString())) + { + if (Convert.ToBoolean(ignoreEmptyValue)) + inputParam.Add(nullString); + else + inputParam.Add(valueToken.ToString()); + } + else + { + inputParam.Add(valueToken.ToString()); + } } else - { - Value = returnValueToken.ToString(); - } + inputParam.Add(nullString); + } + else + inputParam.Add(nullString); } - } - - return Value; + } + else + inputParam.Add(item); + } } + } - private string GetCompareValue(JObject input, string nullString, string compareToValue) + switch (function.ToUpperInvariant()) + { + case "CONCAT": + return ConCat(inputParam, transform["Delimeter"].Value()); + case "REPLACEVALUE": { - if (compareToValue != null && compareToValue.StartsWith("$.")) - { - var compareToValueToken = input.SelectToken(compareToValue); - if (compareToValueToken == null) - { - compareToValue = nullString; - } - else - { - compareToValue = compareToValueToken.ToString(); - } - } - return compareToValue; - } + string compareToValue = transform["CompareToValue"].Value(); + string returnValue = transform["ReturnValue"].Value(); + string defaultValue = transform["DefaultValue"].Value(); - private void UriEscapeDataString(JObject input, IList parameters) + compareToValue = GetCompareValue(input, nullString, compareToValue); + returnValue = GetTokenValue(input, nullString, returnValue); + defaultValue = GetTokenValue(input, nullString, defaultValue); + return ReplaceValue(inputParam, compareToValue, returnValue, defaultValue); + } + case "REPLACEVALUEWITHREGEXCOMPARISON": { - if (parameters != null) - { - foreach (var parameter in parameters) - { - if (parameter != null) - { - string theParameter = parameter.ToString(); - if (theParameter.StartsWith("$")) - { - var parameterToken = input.SelectTokens(theParameter); - if (parameterToken != null && parameterToken.Any()) - { - foreach (var token in parameterToken) - { - if (token.Type != JTokenType.Null) - { - string data = token.ToString(); - string uriEscapedData = Uri.EscapeDataString(data); - token.Replace(uriEscapedData); - } - } - } - } - } - } - } + string compareToValue = transform["CompareToValue"].Value(); + string returnValue = transform["ReturnValue"].Value(); + string defaultValue = transform["DefaultValue"].Value(); + compareToValue = GetCompareValue(input, nullString, compareToValue); - } + returnValue = GetTokenValue(input, nullString, returnValue); + defaultValue = GetTokenValue(input, nullString, defaultValue); - private string ConCat(List args, string delimeter) + return ReplaceValueWithRegexComparison(inputParam, compareToValue, returnValue, defaultValue); + } + case "SPLIT": { - return string.Join(delimeter, args.Where(value => value != null).ToList()); + char delimeter = transform["Delimeter"].Value(); + int index = transform["Index"].Value(); + var positionToken = transform["Position"]; + string position = positionToken != null ? positionToken.ToString() : string.Empty; + return Split(inputParam, delimeter, index, position); } - - private string ReplaceValue(List args, string compareToValue, string returnValue, string defaultValue) + case "TOUPPERCASE": { - if (args[0] == null && compareToValue == null) - return returnValue; - if (args[0] != null && args[0].Equals(compareToValue, StringComparison.OrdinalIgnoreCase)) - return returnValue; - - return defaultValue; + return inputParam[0] != null ? inputParam[0].ToUpperInvariant() : string.Empty; + } + case "TOLOWERCASE": + { + return inputParam[0] != null ? inputParam[0].ToLowerInvariant() : string.Empty; + } + case "RANGEMAPPING": + { + return mapRange((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); + } + case "ONETOONEMAPPING": + { + return mapOneToOne((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); } + case "URIESCAPEDATASTRING": + { + UriEscapeDataString(input, parameters); + break; + } + } + + return null; + } - private string ReplaceValueWithRegexComparison(List args, string compareToValue, string returnValue, string defaultValue) + private string GetTokenValue(JObject input, string nullString, string Value) + { + if (Value != null && Value.StartsWith("$.")) + { + var returnValueToken = input.SelectToken(Value); + if (returnValueToken == null) { - if (args[0] == null && compareToValue == null) - return returnValue; - if (args[0] != null && compareToValue != null && Regex.IsMatch(args[0], compareToValue, RegexOptions.IgnoreCase)) - return returnValue; - return defaultValue; + Value = nullString; + } + else + { + if (returnValueToken.Type == JTokenType.Null) + { + Value = nullString; + } + else + { + Value = returnValueToken.ToString(); + } + } + } + + return Value; + } + private string GetCompareValue(JObject input, string nullString, string compareToValue) + { + if (compareToValue != null && compareToValue.StartsWith("$.")) + { + var compareToValueToken = input.SelectToken(compareToValue); + if (compareToValueToken == null) + { + compareToValue = nullString; } - private string Split(List args, char delimeter, int index, string position = "") + else { - if (string.IsNullOrEmpty(position)) - { - char[] delimiters = new char[] { delimeter }; - return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries)[index]; - } - else + compareToValue = compareToValueToken.ToString(); + } + } + + return compareToValue; + } + + private void UriEscapeDataString(JObject input, IList parameters) + { + if (parameters != null) + { + foreach (var parameter in parameters) + { + if (parameter != null) + { + string theParameter = parameter.ToString(); + if (theParameter.StartsWith("$")) { - if (position.Equals("FIRST",StringComparison.OrdinalIgnoreCase)) - { - char[] delimiters = new char[] { delimeter }; - return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); - } - else if (position.Equals("LAST", StringComparison.OrdinalIgnoreCase)) + var parameterToken = input.SelectTokens(theParameter); + if (parameterToken != null && parameterToken.Any()) + { + foreach (var token in parameterToken) { - char[] delimiters = new char[] { delimeter }; - return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); + if (token.Type != JTokenType.Null) + { + string data = token.ToString(); + string uriEscapedData = Uri.EscapeDataString(data); + token.Replace(uriEscapedData); + } } - else - return string.Empty; + } } - + } } + } + } - private string mapRange(JArray truthTable, string value) - { - return Convert.ToString(truthTable.SelectToken($"$.[?(@.min<'{Convert.ToInt64(value)}' && @.max>'{Convert.ToInt64(value)}')].value")); + private string ConCat(List args, string delimeter) + { + return string.Join(delimeter, args.Where(value => value != null).ToList()); + } + private string ReplaceValue(List args, string compareToValue, string returnValue, string defaultValue) + { + if (args[0] == null && compareToValue == null) + return returnValue; + if (args[0] != null && args[0].Equals(compareToValue, StringComparison.OrdinalIgnoreCase)) + return returnValue; + + return defaultValue; + } + + private string ReplaceValueWithRegexComparison(List args, string compareToValue, string returnValue, string defaultValue) + { + if (args[0] == null && compareToValue == null) + return returnValue; + if (args[0] != null && compareToValue != null && Regex.IsMatch(args[0], compareToValue, RegexOptions.IgnoreCase)) + return returnValue; + return defaultValue; + } + + private string Split(List args, char delimeter, int index, string position = "") + { + if (string.IsNullOrEmpty(position)) + { + char[] delimiters = new char[] { delimeter }; + return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries)[index]; + } + else + { + if (position.Equals("FIRST", StringComparison.OrdinalIgnoreCase)) + { + char[] delimiters = new char[] { delimeter }; + return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); } - private string mapOneToOne(JArray truthTable, string value) + else if (position.Equals("LAST", StringComparison.OrdinalIgnoreCase)) { - return Convert.ToString(truthTable.SelectToken($"$.[?(@.key=='{value}')].value")); + char[] delimiters = new char[] { delimeter }; + return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); } + else + return string.Empty; + } + } + + private string mapRange(JArray truthTable, string value) + { + return Convert.ToString(truthTable.SelectToken($"$.[?(@.min<'{Convert.ToInt64(value)}' && @.max>'{Convert.ToInt64(value)}')].value")); + } + + private string mapOneToOne(JArray truthTable, string value) + { + return Convert.ToString(truthTable.SelectToken($"$.[?(@.key=='{value}')].value")); } + } } diff --git a/.Net Framework/src/AutoMapper/Handlers/ITransformationHandler.cs b/.Net Framework/src/AutoMapper/Handlers/ITransformationHandler.cs index dfc707f..ceedfc8 100644 --- a/.Net Framework/src/AutoMapper/Handlers/ITransformationHandler.cs +++ b/.Net Framework/src/AutoMapper/Handlers/ITransformationHandler.cs @@ -2,8 +2,8 @@ namespace JsonToJsonMapper { - public interface ITransformationHandler - { - dynamic Run(JObject config, JObject input); - } + public interface ITransformationHandler + { + dynamic Run(JObject config, JObject input); + } } diff --git a/.Net Framework/src/AutoMapper/Handlers/RoslynScriptHandler.cs b/.Net Framework/src/AutoMapper/Handlers/RoslynScriptHandler.cs index 3a98cf4..a894a25 100644 --- a/.Net Framework/src/AutoMapper/Handlers/RoslynScriptHandler.cs +++ b/.Net Framework/src/AutoMapper/Handlers/RoslynScriptHandler.cs @@ -1,58 +1,56 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Text; -using System.Threading.Tasks; -using JsonToJsonMapper; -using Newtonsoft.Json.Linq; using Microsoft.CodeAnalysis.Scripting; -using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace JsonToJsonMapper { - class RoslynScriptHandler : ITransformationHandler + internal class RoslynScriptHandler : ITransformationHandler + { + public Dictionary Scripts { get; set; } + + public RoslynScriptHandler(Dictionary scripts) { - public Dictionary Scripts { get; set; } - public RoslynScriptHandler(Dictionary scripts) - { - Scripts = scripts; - } + Scripts = scripts; + } - /// - /// Executes the script using Roslyn and returns the value. - /// - /// - /// - /// - public dynamic Run(JObject transform, JObject input) - { - StringBuilder inputParam = new StringBuilder(); - List parameters = transform["Params"].ToObject>(); - string scriptName = transform["ScriptName"].Value(); + /// + /// Executes the script using Roslyn and returns the value. + /// + /// + /// + /// + public dynamic Run(JObject transform, JObject input) + { + StringBuilder inputParam = new StringBuilder(); + List parameters = transform["Params"].ToObject>(); + string scriptName = transform["ScriptName"].Value(); - foreach (var item in parameters) + foreach (var item in parameters) + { + if (item.StartsWith("$")) + { + if (input.SelectTokens(item) != null) + { + var tokens = input.SelectTokens(item); + foreach (var i in tokens) { - if (item.StartsWith("$")) - { - if (input.SelectTokens(item) != null) - { - var tokens = input.SelectTokens(item); - foreach (var i in tokens) - { - inputParam.Append(i.ToString()); - if (tokens.Count() > 1) - inputParam.Append("[tokenDelimiter]"); - } - } - if (parameters.Count > 1) - inputParam.Append(string.Empty + "[delimiter]"); - } - else - inputParam.Append(item + "[delimiter]"); + inputParam.Append(i.ToString()); + if (tokens.Count() > 1) + inputParam.Append("[tokenDelimiter]"); } + } - var result = Scripts[scriptName].RunAsync(new ScriptHost { Args = inputParam.ToString() }); - return result.Result.ReturnValue.ToString(); + if (parameters.Count > 1) + inputParam.Append(string.Empty + "[delimiter]"); } + else + inputParam.Append(item + "[delimiter]"); + } + + var result = Scripts[scriptName].RunAsync(new ScriptHost { Args = inputParam.ToString() }); + return result.Result.ReturnValue.ToString(); } + } } diff --git a/.Net Framework/src/AutoMapper/Handlers/TransformationFactory.cs b/.Net Framework/src/AutoMapper/Handlers/TransformationFactory.cs new file mode 100644 index 0000000..4d3685f --- /dev/null +++ b/.Net Framework/src/AutoMapper/Handlers/TransformationFactory.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace JsonToJsonMapper +{ + internal class TransformationFactory + { + private readonly Dictionary registeredHandlers = new Dictionary(); + + /// + /// Add handler to the dictionary + /// + /// + public void AddHandlers(ITransformationHandler handler) + { + registeredHandlers[handler.GetType().Name] = handler; + } + + /// + /// Returns a handler based on the type + /// + /// + /// + public ITransformationHandler GetHandler() + { + if (!registeredHandlers.ContainsKey(typeof(T).Name)) + return null; + + return registeredHandlers[typeof(T).Name]; + } + } +} diff --git a/.Net Framework/src/AutoMapper/Handlers/TransformationHandlersFactory.cs b/.Net Framework/src/AutoMapper/Handlers/TransformationHandlersFactory.cs deleted file mode 100644 index a728cb9..0000000 --- a/.Net Framework/src/AutoMapper/Handlers/TransformationHandlersFactory.cs +++ /dev/null @@ -1,35 +0,0 @@ -using JsonToJsonMapper; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace JsonToJsonMapper -{ - class TransformationFactory - { - readonly Dictionary registeredHandlers = new Dictionary(); - - /// - /// Add handler to the dictionary - /// - /// - public void AddHandlers(ITransformationHandler handler) - { - registeredHandlers[handler.GetType().Name] = handler; - } - /// - /// Returns a handler based on the type - /// - /// - /// - public ITransformationHandler GetHandler() - { - if (!registeredHandlers.ContainsKey(typeof(T).Name)) - return null; - - return registeredHandlers[typeof(T).Name]; - } - } -} diff --git a/.Net Framework/src/AutoMapper/Handlers/TransposeHandler.cs b/.Net Framework/src/AutoMapper/Handlers/TransposeHandler.cs index 20f647f..459a840 100644 --- a/.Net Framework/src/AutoMapper/Handlers/TransposeHandler.cs +++ b/.Net Framework/src/AutoMapper/Handlers/TransposeHandler.cs @@ -1,50 +1,46 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using JsonToJsonMapper; +using System.Collections.Generic; using Newtonsoft.Json.Linq; namespace JsonToJsonMapper { - public class TransposeHandler : ITransformationHandler + public class TransposeHandler : ITransformationHandler + { + /// + /// Transposes an array into properties + /// + /// + /// + /// + public dynamic Run(JObject rule, JObject input) { - /// - /// Transposes an array into properties - /// - /// - /// - /// - public dynamic Run(JObject rule, JObject input) - { - string sourceColumn = rule["SourceColumn"].Value(); - string transformValueKey = rule["TransformValue"]["KeyLookupField"].Value(); - string transformValuePrependText = rule["TransformValue"]["PrependKeyText"].Value(); - string transformValue = rule["TransformValue"]["ValueLookupField"].Value(); + string sourceColumn = rule["SourceColumn"].Value(); + string transformValueKey = rule["TransformValue"]["KeyLookupField"].Value(); + string transformValuePrependText = rule["TransformValue"]["PrependKeyText"].Value(); + string transformValue = rule["TransformValue"]["ValueLookupField"].Value(); - var tokens = input.SelectTokens(sourceColumn); - Dictionary array = new Dictionary(); - foreach (var i in tokens) - { - string key = string.Empty; - var token = i.SelectToken(transformValueKey); - if (token != null) - key = transformValuePrependText + token.ToString().Replace(" ", string.Empty); + var tokens = input.SelectTokens(sourceColumn); + Dictionary array = new Dictionary(); + foreach (var i in tokens) + { + string key = string.Empty; + var token = i.SelectToken(transformValueKey); + if (token != null) + key = transformValuePrependText + token.ToString().Replace(" ", string.Empty); - if (!string.IsNullOrWhiteSpace(key)) - { - var valueToken = i.SelectToken(transformValue); - if (valueToken != null) - { - if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) - array.Add(key, valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); - else if (valueToken.Value() != null) - array.Add(key, valueToken); - } - } - } - return array; + if (!string.IsNullOrWhiteSpace(key)) + { + var valueToken = i.SelectToken(transformValue); + if (valueToken != null) + { + if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) + array.Add(key, valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); + else if (valueToken.Value() != null) + array.Add(key, valueToken); + } } + } + + return array; } + } } diff --git a/.Net Framework/src/AutoMapper/Handlers/TypeConverterHandler.cs b/.Net Framework/src/AutoMapper/Handlers/TypeConverterHandler.cs index a76ba76..f457219 100644 --- a/.Net Framework/src/AutoMapper/Handlers/TypeConverterHandler.cs +++ b/.Net Framework/src/AutoMapper/Handlers/TypeConverterHandler.cs @@ -1,204 +1,199 @@ -using JsonToJsonMapper; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; +using System; using System.Globalization; using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace JsonToJsonMapper { - class TypeConverterHandler : ITransformationHandler + internal class TypeConverterHandler : ITransformationHandler + { + /// + /// Converts value from one type to another + /// + /// + /// + /// + public dynamic Run(JObject config, JObject input) { - /// - /// Converts value from one type to another - /// - /// - /// - /// - public dynamic Run(JObject config, JObject input) - { + object value = input["value"].Value(); + string dataType = config["DataType"].Value(); + string format = config["Format"].Value(); - object value = input["value"].Value(); - string dataType = config["DataType"].Value(); - string format = config["Format"].Value(); - - if (value==null || ((JToken)value).Type == JTokenType.Null) - return value; - try + if (value == null || ((JToken)value).Type == JTokenType.Null) + return value; + try + { + if (!string.IsNullOrWhiteSpace(dataType)) + { + switch (dataType.ToUpperInvariant()) + { + case "LONG": + return Convert.ToInt64(value); + case "JOBJECT": + { + JToken Jtokenvalue = (JToken)value; + if (Jtokenvalue.Type == JTokenType.Object) + return (JObject)Jtokenvalue; + else + return JsonConvert.DeserializeObject(Jtokenvalue.ToString()); + } + case "JARRAY": { - if (!string.IsNullOrWhiteSpace(dataType)) + JToken Jtokenvalue = (JToken)value; + if (Jtokenvalue.Type == JTokenType.Array) + { + if (Jtokenvalue.Any()) + return (JArray)Jtokenvalue; + else + return null; + } + else if (Jtokenvalue.Type == JTokenType.Object) + { + return new JArray(Jtokenvalue); + } + else + { + if (Jtokenvalue.ToString().StartsWith("[") && Jtokenvalue.ToString().EndsWith("]")) { - switch (dataType.ToUpperInvariant()) - { - case "LONG": - return Convert.ToInt64(value); - case "JOBJECT": - { - JToken Jtokenvalue = (JToken)value; - if (Jtokenvalue.Type == JTokenType.Object) - return (JObject)Jtokenvalue; - else - return JsonConvert.DeserializeObject(Jtokenvalue.ToString()); - } - case "JARRAY": - { - JToken Jtokenvalue = (JToken)value; - if (Jtokenvalue.Type == JTokenType.Array) - { - if (Jtokenvalue.Any()) - return (JArray)Jtokenvalue; - else - return null; - } - else if (Jtokenvalue.Type == JTokenType.Object) - { - return new JArray(Jtokenvalue); - } - else - { - if (Jtokenvalue.ToString().StartsWith("[") && Jtokenvalue.ToString().EndsWith("]")) - { - return JArray.Parse(Jtokenvalue.ToString()); - } - else - return new JArray(Jtokenvalue); - } - } - case "SHORT": - return Convert.ToInt16(value); - case "INT": - case "INTEGER": - return Convert.ToInt32(value); - case "GUID": - return new Guid(value.ToString()); - case "DATETIME": - { - string valueType = value.ToString(); - Regex x = new Regex(@".*[+-][0-9][0-9][:]"); - if (x.IsMatch(valueType)) - return DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture); - else - return DateTime.Parse(valueType, CultureInfo.InvariantCulture); - } - case "CUSTOMDATETIME": - { - string valueType = value.ToString(); - Regex x = new Regex(@".[+-][0-9]{4}"); - if (x.IsMatch(valueType)) - { - int pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - String datetime = valueType.Substring(0, pos); - return datetime; - } - else - { - return null; - } + return JArray.Parse(Jtokenvalue.ToString()); + } + else + return new JArray(Jtokenvalue); + } + } + case "SHORT": + return Convert.ToInt16(value); + case "INT": + case "INTEGER": + return Convert.ToInt32(value); + case "GUID": + return new Guid(value.ToString()); + case "DATETIME": + { + string valueType = value.ToString(); + Regex x = new Regex(@".*[+-][0-9][0-9][:]"); + if (x.IsMatch(valueType)) + return DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture); + else + return DateTime.Parse(valueType, CultureInfo.InvariantCulture); + } + case "CUSTOMDATETIME": + { + string valueType = value.ToString(); + Regex x = new Regex(@".[+-][0-9]{4}"); + if (x.IsMatch(valueType)) + { + int pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + String datetime = valueType.Substring(0, pos); + return datetime; + } + else + { + return null; + } + } + case "BOOL": + case "BOOLEAN": + return Convert.ToBoolean(value); + case "DECIMAL": + return Convert.ToDecimal(value); + case "DECIMAL?": + { + decimal decimalValue; + if (decimal.TryParse(value.ToString(), out decimalValue)) + return decimalValue; + return null; + } + case "INT?": + { + decimal dval = Convert.ToDecimal(value.ToString()); + return Decimal.ToInt32(dval); + } + case "GUID?": + { + Guid guid; + if (Guid.TryParse(value.ToString(), out guid)) + return guid; + return null; + } + case "DATETIME?": + { + DateTime datetime; + if (DateTime.TryParse(value.ToString(), out datetime)) + return datetime; + return null; + } + case "UTCDATETIME": + { + DateTime dateTime; + if (DateTime.TryParse(value.ToString(), out dateTime)) + { + string utcDateTime = dateTime.ToString("s"); + var zone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); + utcDateTime = utcDateTime + "+" + zone.BaseUtcOffset.ToString(); + return utcDateTime; + } - } - case "BOOL": - case "BOOLEAN": - return Convert.ToBoolean(value); - case "DECIMAL": - return Convert.ToDecimal(value); - case "DECIMAL?": - { - decimal decimalValue; - if (decimal.TryParse(value.ToString(), out decimalValue)) - return decimalValue; - return null; - } - case "INT?": - { - decimal dval = Convert.ToDecimal(value.ToString()); - return Decimal.ToInt32(dval); - } - case "GUID?": - { - Guid guid; - if (Guid.TryParse(value.ToString(), out guid)) - return guid; - return null; - } - case "DATETIME?": - { - DateTime datetime; - if (DateTime.TryParse(value.ToString(), out datetime)) - return datetime; - return null; - } - case "UTCDATETIME": - { - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) - { - string utcDateTime = dateTime.ToString("s"); - var zone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); - utcDateTime = utcDateTime + "+" + zone.BaseUtcOffset.ToString(); - return utcDateTime; - } - return null; - } - case "STRINGTOUTCDATEFORMAT": - { - //This block converts the given date into UTC formatted string, it will not change the TimeZone offset - //compared to previous block. - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) - { - string timeInUTCFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); - return timeInUTCFormat; + return null; + } + case "STRINGTOUTCDATEFORMAT": + { + //This block converts the given date into UTC formatted string, it will not change the TimeZone offset + //compared to previous block. + DateTime dateTime; + if (DateTime.TryParse(value.ToString(), out dateTime)) + { + string timeInUTCFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); + return timeInUTCFormat; + } - } - return null; - } - case "REMOVEDATETIMEOFFSET": - { - string valueType = value.ToString(); - if (valueType.Contains("Z")) - { - int pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - string datetime = valueType.Substring(0, pos+1); //including 'Z' in the output - return datetime; - } + return null; + } + case "REMOVEDATETIMEOFFSET": + { + string valueType = value.ToString(); + if (valueType.Contains("Z")) + { + int pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + string datetime = valueType.Substring(0, pos + 1); //including 'Z' in the output + return datetime; + } - return valueType; - } - case "FORMATTEDDATETIME": - { - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) - { - string timeInUTCFormat; - if (!string.IsNullOrWhiteSpace(format)) - timeInUTCFormat = dateTime.ToString(format); - else - timeInUTCFormat = dateTime.ToString(null, CultureInfo.InvariantCulture); - return timeInUTCFormat; + return valueType; + } + case "FORMATTEDDATETIME": + { + DateTime dateTime; + if (DateTime.TryParse(value.ToString(), out dateTime)) + { + string timeInUTCFormat; + if (!string.IsNullOrWhiteSpace(format)) + timeInUTCFormat = dateTime.ToString(format); + else + timeInUTCFormat = dateTime.ToString(null, CultureInfo.InvariantCulture); + return timeInUTCFormat; + } - } - return null; - } - case "STRING": - { - if (value.GetType().Equals("JValue")) - return ((JValue)value).Value(); - else - return value.ToString(); - } - } - } + return null; } - catch (Exception ex) + case "STRING": { - throw new Exception("Failed while trying to cast value into " + dataType + ". " + ex.ToString()); + if (value.GetType().Equals("JValue")) + return ((JValue)value).Value(); + else + return value.ToString(); } - return value; + } } + } + catch (Exception ex) + { + throw new Exception("Failed while trying to cast value into " + dataType + ". " + ex.ToString()); + } + + return value; } + } } - diff --git a/.Net Framework/src/AutoMapper/Handlers/ValueMappingHandler.cs b/.Net Framework/src/AutoMapper/Handlers/ValueMappingHandler.cs index a4105f1..4096a9e 100644 --- a/.Net Framework/src/AutoMapper/Handlers/ValueMappingHandler.cs +++ b/.Net Framework/src/AutoMapper/Handlers/ValueMappingHandler.cs @@ -1,39 +1,37 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using JsonToJsonMapper; using Newtonsoft.Json.Linq; namespace JsonToJsonMapper { - public class ValueMappingHandler : ITransformationHandler + public class ValueMappingHandler : ITransformationHandler + { + /// + /// Returns value if matches the rule else returns default value. + /// + /// + /// + /// + public dynamic Run(JObject transform, JObject input) { - /// - /// Returns value if matches the rule else returns default value. - /// - /// - /// - /// - public dynamic Run(JObject transform, JObject input) - { - var valueMapping = transform["ValueMapping"].ToObject>(); - var defaultValue = transform["DefaultValue"].Value(); - var value = input["value"].Value(); - - if (transform != null && valueMapping != null && value != null) - value = (from item in valueMapping where item.ExistingValue.Equals(value, StringComparison.OrdinalIgnoreCase) select item.NewValue).FirstOrDefault(); - if (transform != null && string.IsNullOrWhiteSpace(value) && defaultValue != null) - { - if (defaultValue.Equals("UTCNOW", StringComparison.OrdinalIgnoreCase)) - return DateTime.UtcNow.ToString(); - else if (defaultValue.Equals("NEWGUID",StringComparison.OrdinalIgnoreCase)) - return Guid.NewGuid().ToString(); - else - return defaultValue; - } - return value; - } + var valueMapping = transform["ValueMapping"].ToObject>(); + var defaultValue = transform["DefaultValue"].Value(); + var value = input["value"].Value(); + + if (transform != null && valueMapping != null && value != null) + value = (from item in valueMapping where item.ExistingValue.Equals(value, StringComparison.OrdinalIgnoreCase) select item.NewValue).FirstOrDefault(); + if (transform != null && string.IsNullOrWhiteSpace(value) && defaultValue != null) + { + if (defaultValue.Equals("UTCNOW", StringComparison.OrdinalIgnoreCase)) + return DateTime.UtcNow.ToString(); + else if (defaultValue.Equals("NEWGUID", StringComparison.OrdinalIgnoreCase)) + return Guid.NewGuid().ToString(); + else + return defaultValue; + } + + return value; } + } } diff --git a/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj b/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj index 8866b74..c5d71b1 100644 --- a/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj +++ b/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj @@ -65,15 +65,24 @@ + + - + + + + + + + + diff --git a/.Net Framework/src/AutoMapper/JsonTransform.cs b/.Net Framework/src/AutoMapper/JsonTransform.cs new file mode 100644 index 0000000..c99bb50 --- /dev/null +++ b/.Net Framework/src/AutoMapper/JsonTransform.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace JsonToJsonMapper +{ + public class JsonTransform + { + [JsonExtensionData] + public Dictionary Json { get; set; } + + public JsonTransform() + { + Json = new Dictionary(); + } + } +} diff --git a/.Net Framework/src/AutoMapper/MappingRule.cs b/.Net Framework/src/AutoMapper/MappingRule.cs new file mode 100644 index 0000000..ac275f6 --- /dev/null +++ b/.Net Framework/src/AutoMapper/MappingRule.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; + +namespace JsonToJsonMapper +{ + public class MappingRule + { + public string DestinationType { get; set; } + public string DataType { get; set; } + public string Node { get; set; } + public bool IgnoreEmptyArray { get; set; } + + public bool IgnoreNullValue { get; set; } = true; + public List TruthTable { get; set; } + + public MappingRule() + { + TruthTable = new List(); + } + } +} diff --git a/.Net Framework/src/AutoMapper/Reference.cs b/.Net Framework/src/AutoMapper/Reference.cs new file mode 100644 index 0000000..132837f --- /dev/null +++ b/.Net Framework/src/AutoMapper/Reference.cs @@ -0,0 +1,8 @@ +namespace JsonToJsonMapper +{ + public class Reference + { + public string Assembly { get; set; } + public string NameSpace { get; set; } + } +} diff --git a/.Net Framework/src/AutoMapper/Rule.cs b/.Net Framework/src/AutoMapper/Rule.cs new file mode 100644 index 0000000..3d2ba5c --- /dev/null +++ b/.Net Framework/src/AutoMapper/Rule.cs @@ -0,0 +1,68 @@ +namespace JsonToJsonMapper +{ + public class Rule + { + public string SourceColumn { get; set; } + public string DestinationColumn { get; set; } + public string DataType { get; set; } + public string Format { get; set; } + public MappingRule ComplexType { get; set; } + public Transform TransformValue { get; set; } + + public Rule(string sourceColumn, string destinationColumn, string dataType) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + } + + public Rule(string sourceColumn, string destinationColumn, string dataType, string format) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + Format = format; + } + + public Rule(string sourceColumn, string destinationColumn, string dataType, MappingRule mappingRule) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + ComplexType = mappingRule; + } + + public Rule(string sourceColumn, string destinationColumn, string dataType, MappingRule mappingRule, Transform transform) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + ComplexType = mappingRule; + TransformValue = transform; + } + + public Rule(string sourceColumn, string destinationColumn, string dataType, Transform transform) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + TransformValue = transform; + } + + public Rule(string sourceColumn, string destinationColumn, string dataType, string format, Transform transform) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + Format = format; + TransformValue = transform; + } + + public Rule() + { + SourceColumn = string.Empty; + DestinationColumn = string.Empty; + DataType = string.Empty; + } + } +} diff --git a/.Net Framework/src/AutoMapper/ScriptDefinitions.cs b/.Net Framework/src/AutoMapper/ScriptDefinitions.cs new file mode 100644 index 0000000..e4b48bc --- /dev/null +++ b/.Net Framework/src/AutoMapper/ScriptDefinitions.cs @@ -0,0 +1,12 @@ +using Microsoft.CodeAnalysis.Scripting; + +namespace JsonToJsonMapper +{ + public class ScriptDefinitions + { + public string Name { get; set; } + public string Code { get; set; } + public Script ScriptIL { get; set; } + public Reference Reference { get; set; } + } +} diff --git a/.Net Framework/src/AutoMapper/ScriptHost.cs b/.Net Framework/src/AutoMapper/ScriptHost.cs new file mode 100644 index 0000000..1b26d86 --- /dev/null +++ b/.Net Framework/src/AutoMapper/ScriptHost.cs @@ -0,0 +1,7 @@ +namespace JsonToJsonMapper +{ + public class ScriptHost + { + public string Args { get; set; } + } +} diff --git a/.Net Framework/src/AutoMapper/Transform.cs b/.Net Framework/src/AutoMapper/Transform.cs new file mode 100644 index 0000000..dd92cfa --- /dev/null +++ b/.Net Framework/src/AutoMapper/Transform.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace JsonToJsonMapper +{ + public class Transform + { + public string Type { get; set; } + public string PrependKeyText { get; set; } + public List ValueMapping { get; set; } + public string DefaultValue { get; set; } + public string ScriptName { get; set; } + public List Params { get; set; } + public string KeyLookupField { get; set; } + public string ValueLookupField { get; set; } + public string Function { get; set; } + public string Delimeter { get; set; } + public string CompareToValue { get; set; } + public string ReturnValue { get; set; } + public string IgnoreEmptyParams { get; set; } + public int Index { get; set; } + } +} diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/.Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index 11895a1..1a5deb1 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/.Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -7,1421 +7,1409 @@ namespace MipUnitTest { - [TestClass] - public class AutoMapperTest - { - //Test - [TestMethod, Description("Validate that the exception is thrown by auto mapper if mapping json is invalid")] - public void Validate_AutoMapper_ExceptionThrownByInvalidMappingJson() - { - // Arrange - string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - string inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; - - //Act - try - { - var mapper = new AutoMapper(mappingJson); - var lead = mapper.TransformIntoJson(inputJson, true); - Assert.Fail(); - } - catch (Exception ex) - { - //Assert - Assert.IsTrue(string.Equals(ex.Message, string.Format("Invalid mapping json"))); - } - } - - [TestMethod, Description("Validate that the property is not set if value datatype is different that the datatype mentioned in the config.")] - public void Validate_AutoMapper_InvalidDatatype() - { - // Arrange - string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - string inputJson = - "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100a}"; - - try - { - //Act - var mapper = new AutoMapper(mappingJson); - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.Fail(); - } - catch (Exception ex) - { - //Assert - Assert.AreEqual(ex.Message, "Invalid mapping json"); - } - } - [TestMethod, Description("Validate that the property is not set if the value is null")] - public void Validate_AutoMapper_NullValue() - { - // Arrange - string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - string inputJson = - "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsNull(lead.Name); - } - catch (Exception) - { - Assert.Fail(); - } - } - [TestMethod, Description("Validate that the property is not set if the value is empty string except if the datatype is string.")] - public void Validate_AutoMapper_EmptyString() - { - // Arrange - string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - string inputJson = - "{\"name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"101\"}"; - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.AllowEmail == false); - Assert.IsTrue(lead.LeadScore == 101); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("Validate that the datetime value is not modified due to transformation.")] - public void Validate_AutoMapper_DateTimeValidation() - { - // Arrange - string mappingJson = @"{ ""MappingRuleConfig"": { ""TruthTable"": [ { ""SourceColumn"": """", ""DestinationColumn"": ""EventId"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""-1"" } }, { ""SourceColumn"": ""$.MifContext.correlationId"", ""DestinationColumn"": ""Token"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""SchemaName"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""JournalEvents.EventCore.SessionScanData"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""Content"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""ContentObject"", ""DataType"": ""string"", ""ComplexType"": { ""DataType"": ""JArray"", ""Node"": ""$.GetReportResponse[*].GetReportResult[*].diffgr:diffgram[*].DocumentElement[*].['Session Scan Data']"", ""TruthTable"": [ { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.id"", ""DestinationColumn"": ""EventKey"", ""DataType"": ""string"" }, { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.name"", ""DestinationColumn"": ""EventName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Event ID"", ""DestinationColumn"": ""EventID"", ""DataType"": ""int"" }, { ""SourceColumn"": ""RegStatusID"", ""DestinationColumn"": ""RegStatusID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Registrant ID"", ""DestinationColumn"": ""RegistrantID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Type"", ""DestinationColumn"": ""Type"", ""DataType"": ""string"" }, { ""SourceColumn"": ""First Name"", ""DestinationColumn"": ""FirstName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Last Name"", ""DestinationColumn"": ""LastName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Email"", ""DestinationColumn"": ""Email"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignedUp"", ""DestinationColumn"": ""SignedUp"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignupInsertDate"", ""DestinationColumn"": ""SignupInsertDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationSignupModifiedDate"", ""DestinationColumn"": ""PresentationSignupModifiedDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Code"", ""DestinationColumn"": ""SessionCode"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Title"", ""DestinationColumn"": ""SessionTitle"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Start Time"", ""DestinationColumn"": ""StartTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""End Time"", ""DestinationColumn"": ""EndTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Track"", ""DestinationColumn"": ""Track"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationCheckedInDate"", ""DestinationColumn"": ""PresentationCheckedInDate"", ""DataType"": ""string"" } ] } }, { ""SourceColumn"": """", ""DestinationColumn"": ""EventDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""CreatedDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } } ] }}"; - - string inputJson = @"{ ""GetReportResponse"": [ { ""@xmlns"": ""https://api.eventcore.com/"", ""GetReportResult"": [ { ""diffgr:diffgram"": [ { ""@xmlns:msdata"": ""urn:schemas-microsoft-com:xml-msdata"", ""@xmlns:diffgr"": ""urn:schemas-microsoft-com:xml-diffgram-v1"", ""DocumentElement"": [ { ""@xmlns"": """", ""Session Scan Data"": [ { ""@diffgr:id"": ""Session Scan Data1"", ""@msdata:rowOrder"": ""0"", ""@diffgr:hasChanges"": ""inserted"", ""Event ID"": ""14337"", ""RegStatusID"": ""7"", ""Registrant ID"": ""2017054"", ""Type"": ""General Attendee"", ""First Name"": ""emad"", ""Last Name"": ""AbuAljazer "", ""Email"": ""jazer313@hotmail.com"", ""SignedUp"": ""true"", ""SignupInsertDate"": ""2015-10-29T07:48:27.767-07:00"", ""PresentationSignupModifiedDate"": ""2015-10-29T07:48:27.767-07:00"", ""Session Code"": ""ITPRO17"", ""Session Title"": ""Deploy virtual machines in the cloud part II"", ""Start Time"": ""11/02/2015 15:15:00 -08:00"", ""End Time"": ""11/02/2015 16:30:00 -08:00"", ""Track"": ""IT Professional"" } ] } ] } ] } ], ""recordCount"": ""-1"" } ], ""MifContext"": { ""runImmediate"": true, ""runId"": ""b8cb0be4-2375-4de2-9781-15dbbf8bc9b3"", ""TrackingEnabled"": false, ""WorkFlowName"": ""EventCoreSessionScanDataToEDP"", ""moreData"": ""true"", ""start_Index"": 501, ""end_Index"": 1000, ""correlationId"": ""8ab25b61-ec8a-4b40-8189-4b77f4f3cbf5"" }, ""ForEachContext"": { ""id"": ""8707"", ""name"": ""MGX FY14"" }}"; - - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = mapper.TransformIntoJson(inputJson, true); - - Assert.IsTrue(lead.Contains("2015-10-29T07:48:27.767-07:00") && lead.Contains("2015-10-29T07:48:27.767-07:00") - && lead.Contains("11/02/2015 15:15:00 -08:00") && lead.Contains("11/02/2015 16:30:00 -08:00") && lead.Contains("8707")); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] - public void Validate_AutoMapper_DefaultValue1() - { - // Arrange - string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":null,\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - string inputJson = - "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "NA"); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("Validate that the property is mapped according to input value.")] - public void Validate_AutoMapper_DefaultValue2() - { - // Arrange - string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - string inputJson = - "{\"Name\": \"1\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "true"); - } - catch (Exception) - { - Assert.Fail(); - } - } - [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] - public void Validate_AutoMapper_DefaultValue3() - { - // Arrange - string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - string inputJson = - "{\"Name\": \"22\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "NA"); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("Validate that the property is set to custom value if the value passed is empty.")] - public void Validate_AutoMapper_EmptyValue() - { - // Arrange - string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": false},{\"ExistingValue\": \"\",\"NewValue\": true}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - string inputJson = - "{\"Name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "true"); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("Complex transformation test - Validate that the value returned is a complex type.")] - public void Complex2FlatTransformationTest() - { - //Arrange - Certain input json with complex object - string inputJson = "{\"dateCreated\": \"2015-08-31T14:30:00\", \"accountCode\": \"Cross-Product\", \"isActive\": true, \"isHotel\": false, \"isPreferred\": false, \"brandFrnId\": null, \"chainFrnId\": null, \"locationType\": \"Venue\", \"largestSpace\": null, \"numberOfMeetRooms\": null, \"numberOfRooms\": null, \"totalSpace\": null, \"address\": { \"line1\": \"750 Main Street\", \"line2\": null, \"line3\": null, \"line4\": null, \"city\": \"Moncton\", \"state\": \"New Brunswick\", \"postalCode\": \"E1C 1E6\", \"country\": \"Canada\", \"intlState\": null }, \"locationThirdParty\": null, \"locationCode\": \"msft_can_delta_monc\", \"desc\": \"\", \"directions\": \"\", \"email\": \"\", \"externalFrnKey\": null, \"fax\": \"\", \"imgAttributes\": \"\", \"imgSrc\": null, \"label\": \"\", \"name\": \"Delta Beausejour Hotel\", \"notes\": \"\", \"organization\": null, \"phone\": \"\", \"tollfree\": \"\", \"url\": \"http://binged.it/1O4l53S\" } "; - string mapping = "{\"MappingRuleConfig\":{\"DestinationType\":\"\",\"SourceObject\":\"\",\"DestinationObject\":\"\",\"TruthTable\":[{\"SourceColumn\":\"$.address['city']\",\"DestinationColumn\":\"City\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['state']\",\"DestinationColumn\":\"State\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['postalCode']\",\"DestinationColumn\":\"PostalCode\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['country']\",\"DestinationColumn\":\"Country\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var flatObject = JObject.Parse(mapper.TransformIntoJson(inputJson, false)); - - //Assert - Assert.AreEqual(flatObject.HasValues, true); - Assert.AreEqual(flatObject.Count, 4); - } - [TestMethod, Description("Transpose handler test - Validate that the value returned is transposed.")] - public void PromoteAttributesToPropertyTestWithoutPrependKeyText() - { - //Arrange - Certain input json with complex object - string inputJson = "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; - string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""SourceType"":""Webpagevisit"",""SourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""ClientIPAddress"":""203.141.7.100"",""UserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""WebpageID"":4,""WebpageURL"":""/anti-phishing.html""}]}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); - //Assert - Assert.AreEqual(value, expectedResponse); - } - - - [TestMethod, Description("Transpose handler test - Validate that the value returned is transposed with prepend key text.")] - public void PromoteAttributesToPropertyTestWithPrependKeyText() - { - //Arrange - Certain input json with complex object - string inputJson = "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; - string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"PrependKeyText\":\"Attribute\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""AttributeSourceType"":""Webpagevisit"",""AttributeSourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""AttributeClientIPAddress"":""203.141.7.100"",""AttributeUserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""AttributeWebpageID"":4,""AttributeWebpageURL"":""/anti-phishing.html""}]}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); - //Assert - Assert.IsTrue(value.Contains("AttributeWebpageURL")); - Assert.AreEqual(value, expectedResponse); - } - - - [TestMethod, Description("Roslyn script handler test - Validate that the value returned is after executing the script.")] - public void RoslynTest() - { - //Arrange - Certain input json with complex object - string inputJson = "{\r\n \"eventCode\": \"APAC-1PWBNR3-0331-16-HQ\",\r\n \"pkEventId\": \"0x449740001\",\r\n \"eventId\": \"2353\",\r\n \"externalKey\": \"AP-Azure-WBNR-FY16-03Mar-31-Win10_Device_Management\",\r\n \"accountCode\": \"C-and-E\",\r\n \"eventName\": \"Windows 10 for device management\",\r\n \"url\": null,\r\n \"autoCalcCode\": false,\r\n \"isTestMode\": false,\r\n \"isActive\": true,\r\n \"isTemplate\": false,\r\n \"isLocked\": true,\r\n \"isClassic\": true,\r\n \"eventStatus\": \"Live\",\r\n \"isPending\": false,\r\n \"isDesign\": false,\r\n \"isTesting\": false,\r\n \"isOnsite\": false,\r\n \"isOffline\": false,\r\n \"isClosed\": false,\r\n \"isNotificationEnabled\": false,\r\n \"notes\": \"\",\r\n \"contact\": {\r\n \"contactName\": \"Microsoft SQL Team\",\r\n \"organization\": \"\",\r\n \"email\": \"b-dikurn@microsoft.com\",\r\n \"phone\": \"\",\r\n \"tollfree\": \"\",\r\n \"fax\": \"\",\r\n \"url\": \"\",\r\n \"notes\": \"\"\r\n },\r\n \"location\": {\r\n \"locationName\": \"Webinar\",\r\n \"locationCode\": \"Webinar\",\r\n \"email\": null,\r\n \"phone\": null,\r\n \"tollfree\": null,\r\n \"fax\": null,\r\n \"url\": null,\r\n \"notes\": null\r\n },\r\n \"dateCreated\": \"2016-02-17T15:59:42\",\r\n \"dateModified\": \"2016-02-19T14:21:21\",\r\n \"startDate\": \"2016-03-31T08:00:00\",\r\n \"endDate\": \"2016-03-31T16:00:00\",\r\n \"dateClosed\": null,\r\n \"txtEvtCreatedBy\": \"Samuel Pak\",\r\n \"txtEvtModifiedBy\": \"Maha Pasha\",\r\n \"glNumber\": \"\",\r\n \"timezone\": \"(GMT+05:00) Islamabad, Karachi, Tashkent\",\r\n \"timezoneMapping\": \"Asia/Karachi\",\r\n \"timezoneId\": 85,\r\n \"proposedLocation\": null,\r\n \"plannedAttendance\": null,\r\n \"proposedBudget\": null,\r\n \"plannedCurrency\": null,\r\n \"travelAccoCurrency\": null,\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionField\": \"evt_ans_field19\",\r\n \"questionId\": 638,\r\n \"questionCode\": \"Design-LPHeroImg\",\r\n \"questionName\": \"Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"https://info.microsoft.com/rs/157-GQE-382/images/ms-win10-webinar-banners-3000x300-04.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field24\",\r\n \"questionId\": 996,\r\n \"questionCode\": \"Design-EmailBannerImg\",\r\n \"questionName\": \"Design-EmailBannerImg \",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field16\",\r\n \"questionId\": 398,\r\n \"questionCode\": \"Program-BannerText\",\r\n \"questionName\": \"Program-BannerText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Microsft Event Banner Title\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field20\",\r\n \"questionId\": 639,\r\n \"questionCode\": \"Design-BannerTextColor\",\r\n \"questionName\": \"Design-BannerTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field17\",\r\n \"questionId\": 633,\r\n \"questionCode\": \"Design-HeaderTextColor\",\r\n \"questionName\": \"Design-HeaderTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#333333\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field06\",\r\n \"questionId\": 152,\r\n \"questionCode\": \"Program-HeaderText\",\r\n \"questionName\": \"Program-HeaderText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Windows 10 for device management\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field07\",\r\n \"questionId\": 153,\r\n \"questionCode\": \"Program-Description\",\r\n \"questionName\": \"Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"A\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field09\",\r\n \"questionId\": 229,\r\n \"questionCode\": \"Program-AdditionalInfo\",\r\n \"questionName\": \"Program-AdditionalInfo\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"B\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field21\",\r\n \"questionId\": 640,\r\n \"questionCode\": \"Design-HighlightColor\",\r\n \"questionName\": \"Design-HighlightColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field22\",\r\n \"questionId\": 641,\r\n \"questionCode\": \"Design-HighlightTextColor\",\r\n \"questionName\": \"Design-HighlightTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field01\",\r\n \"questionId\": 147,\r\n \"questionCode\": \"Hero Banner Image\",\r\n \"questionName\": \"Hero Banner Image\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"EN-BASICE-Banner-PeopleWithDevices.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field02\",\r\n \"questionId\": 37143,\r\n \"questionCode\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"questionName\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field30\",\r\n \"questionId\": 649,\r\n \"questionCode\": \"DELETED-Program-Description\",\r\n \"questionName\": \"DELETED-Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n \"groups\": null,\r\n \"rotations\": null,\r\n \"forms\": null,\r\n \"websites\": null,\r\n \"primaryFormURL\": \"/profile/form/index.cfm?PKformID=0x1084150001\",\r\n \"questionAssignments\": null\r\n}"; - string mapping = "{\r\n \"Scripts\": [\r\n {\r\n \"Name\": \"GetTitle\",\r\n \"Code\": \"string GetTitle(string args){string[] input = args.Split(new string[] {\\\"[delimiter]\\\"}, System.StringSplitOptions.None);string[] data = null; var title = string.Empty;for (int i = 0; i < input.Length; i++){if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")){title = input[i];break;}if (input[i].Contains(\\\"tokenDelimiter\\\") == true){data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None);for (int x = 0; x < data.Length; x++){if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])){title = data[x].ToString();break;}}}else{continue;}} return title;}GetTitle(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetDescription\",\r\n \"Code\": \"string GetEventDesc(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventDesc = string.Empty; for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventDesc = input[i]; eventDesc = System.Text.RegularExpressions.Regex.Replace(input[i], @\\\"<(.|\\n)*?>\\\", string.Empty); break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] {\\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventDesc = data[x].ToString(); eventDesc = System.Text.RegularExpressions.Regex.Replace(data[x], @\\\"<(.|\\n)*?>\\\", string.Empty); break;} } } else { continue; }} return eventDesc;}GetEventDesc(Args)\",\r\n \"Reference\": {\r\n \"Assembly\": \"System\",\r\n \"NameSpace\": \"System.Text.RegularExpressions\"\r\n }\r\n },\r\n {\r\n \"Name\": \"GetURL\",\r\n \"Code\": \"string GetURL(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventURL = string.Empty;for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventURL = input[i]; break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventURL = data[x].ToString(); break; } } } else { continue; } } if (string.IsNullOrEmpty(eventURL)) return eventURL = \\\"www.microsoft.com\\\"; else return eventURL; }GetURL(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetJsonArray\",\r\n \"Code\": \"string GetJsonArray(string args) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(\\\"[\\\"); foreach (var item in args.Split(',')) { sb.Append(@\\\"\\\"\\\"\\\" + item + @\\\"\\\"\\\",\\\"); } sb.Remove(sb.Length - 1, 1); sb.Append(\\\"]\\\"); return sb.ToString();}GetJsonArray(Args)\"\r\n }\r\n ],\r\n \"MappingRuleConfig\": {\r\n \"DestinationType\": \"EventInformation\",\r\n \"SourceObject\": \"CertainEvents\",\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventList\",\r\n \"DataType\": \"jarray\",\r\n \"ComplexType\": {\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"title\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetTitle\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-HeaderText')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-BannerText')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"accountCode\",\r\n \"DestinationColumn\": \"accountCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventCode\",\r\n \"DestinationColumn\": \"Id\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventStatus\",\r\n \"DestinationColumn\": \"Status\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"timezone\",\r\n \"DestinationColumn\": \"timezone\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"source\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Certain\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventCategory\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Onsite Event\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"startDate\",\r\n \"DestinationColumn\": \"StartDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"endDate\",\r\n \"DestinationColumn\": \"EndDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"$.location['locationName']\",\r\n \"DestinationColumn\": \"locationCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Description\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetDescription\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventAbstract')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-Description')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryLanguage\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Localization-Form-and-Email-Language')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryTargetAudience\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventsFor')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Product\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventProduct')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"EventSource\",\r\n \"DestinationColumn\": \"EventSource\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"$.eventQuestions.question[?(@.questionCode == 'Search-EventIcon')].answers.answer.[0].value\",\r\n \"DestinationColumn\": \"EventIcon\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Category\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"TBD\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"URL\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetURL\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-AlternateRegURL')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'primaryFormURL')].answers.answer.[0].value\"\r\n ]\r\n }\r\n\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"RequestId\",\r\n \"DataType\": \"guid\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"4bfaac9c-1e0d-4620-b9e6-66095376e99a\"\r\n }\r\n }\r\n ]\r\n }\r\n}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""EventList"":[{""title"":""Windows 10 for device management"",""accountCode"":""C-and-E"",""Id"":""APAC-1PWBNR3-0331-16-HQ"",""Status"":""Live"",""timezone"":""(GMT+05:00) Islamabad, Karachi, Tashkent"",""source"":""Certain"",""EventCategory"":""Onsite Event"",""StartDate"":""2016-03-31T08:00:00Z"",""EndDate"":""2016-03-31T16:00:00Z"",""locationCode"":""Webinar"",""Description"":""A"",""PrimaryLanguage"":[""""],""PrimaryTargetAudience"":[""""],""Product"":[""""],""Category"":""TBD"",""URL"":""www.microsoft.com""}],""RequestId"":""4bfaac9c-1e0d-4620-b9e6-66095376e99a""}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); - //Assert - Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); - } - - [TestMethod, Description("Parent data test - Validate that the value returned is from the parent JObject.")] - public void ParentDataTest() - { - //Arrange - Certain input json with complex object - string inputJson = "{\r\n \"events\": [\r\n {\r\n \"eventId\": \"100\",\r\n \"eventName\": \"A\",\r\n \"location\": {\r\n \"locationName\": \"Lincoln Square\",\r\n \"locationCode\": \"Lincoln Square\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q1\", \r\n \"questionName\": \"1Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n },\r\n{\r\n \"answerId\": null,\r\n \"value\": \"2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q2\", \r\n \"questionName\": \"2Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"3Consumers,Partners\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n{\r\n \"eventId\": \"200\",\r\n \"eventName\": \"B\",\r\n \"location\": {\r\n \"locationName\": \"Bel\",\r\n \"locationCode\": \"Bel\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q3\", \r\n \"questionName\": \"3Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n \r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q4\", \r\n \"questionName\": \"4Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"4Klo\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n}"; - string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Answers\",\"DataType\":\"string\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.events[*].eventQuestions.question[*].answers.answer\",\"TruthTable\":[{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].eventId\",\"DestinationColumn\":\"eventId\",\"DataType\":\"string\"},{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].questionId\",\"DestinationColumn\":\"questionId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerId\",\"DestinationColumn\":\"answerId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerCode\",\"DestinationColumn\":\"answerCode\",\"DataType\":\"string\"},{\"SourceColumn\":\"value\",\"DestinationColumn\":\"value\",\"DataType\":\"string\"}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""Answers"":[{""eventId"":""100"",""questionId"":""Q1"",""value"":""1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q1"",""value"":""2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q2"",""value"":""3Consumers,Partners""},{""eventId"":""200"",""questionId"":""Q3""},{""eventId"":""200"",""questionId"":""Q4"",""value"":""4Klo""}]}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); - //Assert - Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); - } - - [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned.")] - public void Validate_ValueMappingHandler_DefaultValue() - { - // Arrange - string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"Certain\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - string input = "{\"value\":null}"; - - //Act - ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - Assert.IsTrue(response == "Certain"); - } - catch (Exception) - { - Assert.Fail(); - } - } - [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is UTC now.")] - public void Validate_ValueMappingHandler_DefaultValue_UtcNow() - { - // Arrange - string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - string input = "{\"value\":null}"; - - //Act - ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - DateTime date; - Assert.IsTrue(DateTime.TryParse(response, out date)); - } - catch (Exception) - { - Assert.Fail(); - } - } - [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is new Guid.")] - public void Validate_ValueMappingHandler_DefaultValue_Guid() - { - // Arrange - string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"NewGuid\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - string input = "{\"value\":null}"; - - //Act - ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - Guid guid; - Assert.IsTrue(Guid.TryParse(response, out guid)); - } - catch (Exception) - { - Assert.Fail(); - } - } - [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is mapped.")] - public void Validate_ValueMappingHandler_DefaultValue_Mapping() - { - // Arrange - string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": 1},{\"ExistingValue\": \"1\",\"NewValue\": 2}, {\"ExistingValue\": \"0\",\"NewValue\": -1}],\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - string input = "{\"value\":\"1\"}"; - - //Act - ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - Assert.IsTrue(response == "2"); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("Function handler test - Validate that the value returned is concatenated.")] - public void FunctionTest_ConCat() - { - //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": [{""questionField"": ""evt_ans_field19"",""questionId"": 638,""questionCode"": ""Design-LPHeroImg"",""questionName"": ""Design-LPHeroImg"",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""https://info.microsoft.com""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""First answer""},{""answerId"": null,""answerCode"": null,""value"": ""Last answer""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": """"}]}}]}}"; - string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.com,Hello world!\"},{\"title\":\"First answer,Last answer,Hello world!\"},{\"title\":\",Hello world!\"}]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - [TestMethod, Description("Function handler test - Validate that the value returned is concatenated when delimeter is null.")] - public void FunctionTest_ConCat_WithoutDelimeter() - { - //Arrange - Certain input json with complex object - string inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; - string mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value','Hello world!']}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.comHello world!\"},{\"title\":\"First answerLast answerHello world!\"},{\"title\":\"Hello world!\"}]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Function handler test - Validate that the value returned is concatenated when params collection is null.")] - public void FunctionTest_ConCat_EmptyParamCollection() - { - //Arrange - Certain input json with complex object - string inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; - string mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value1','Hello world!']}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"}]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Function handler test - Validate that the value returned has no empty array.")] - public void IgnoreEmptyArrayTest_True() - { - //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":true, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - [TestMethod, Description("Function handler test - Validate that the value returned is empty array.")] - public void IgnoreEmptyArrayTest_False() - { - //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":false, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - [TestMethod, Description("Function handler test - Validate that the value returned is empty array.")] - public void IgnoreEmptyArrayTest_NotSet() - { - //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"", ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Value handler test - Validate transformation if default value is empty.")] - public void Automapper_EmptyDefaultValueTest() - { - //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - string mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"__meta__Entity\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"GenericPresales\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"EncryptedFields\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \" \" } } ] } } "; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"__meta__Entity\":\"GenericPresales\",\"EncryptedFields\":\" \"}"; - - //Assert - Assert.AreEqual(expectedResponse, response); - } - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value.")] - public void FunctionTest_ReplaceValue() - { - //Arrange - Certain input json with complex object - string inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'httPS://info.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValue','Params':['$.answers.answer[*].value']}}]}}]}}"; + [TestClass] + public class AutoMapperTest + { + //Test + [TestMethod, Description("Validate that the exception is thrown by auto mapper if mapping json is invalid")] + public void Validate_AutoMapper_ExceptionThrownByInvalidMappingJson() + { + // Arrange + string mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + + string inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; + + //Act + try + { + var mapper = new AutoMapper(mappingJson); + var lead = mapper.TransformIntoJson(inputJson, true); + Assert.Fail(); + } + catch (Exception ex) + { + //Assert + Assert.IsTrue(string.Equals(ex.Message, string.Format("Invalid mapping json"))); + } + } + + [TestMethod, Description("Validate that the property is not set if value datatype is different that the datatype mentioned in the config.")] + public void Validate_AutoMapper_InvalidDatatype() + { + // Arrange + string mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + + string inputJson = + "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100a}"; + + try + { + //Act + var mapper = new AutoMapper(mappingJson); + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.Fail(); + } + catch (Exception ex) + { + //Assert + Assert.AreEqual(ex.Message, "Invalid mapping json"); + } + } + + [TestMethod, Description("Validate that the property is not set if the value is null")] + public void Validate_AutoMapper_NullValue() + { + // Arrange + string mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + + string inputJson = + "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsNull(lead.Name); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the property is not set if the value is empty string except if the datatype is string.")] + public void Validate_AutoMapper_EmptyString() + { + // Arrange + string mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + + string inputJson = + "{\"name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"101\"}"; + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.AllowEmail == false); + Assert.IsTrue(lead.LeadScore == 101); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the datetime value is not modified due to transformation.")] + public void Validate_AutoMapper_DateTimeValidation() + { + // Arrange + string mappingJson = + @"{ ""MappingRuleConfig"": { ""TruthTable"": [ { ""SourceColumn"": """", ""DestinationColumn"": ""EventId"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""-1"" } }, { ""SourceColumn"": ""$.MifContext.correlationId"", ""DestinationColumn"": ""Token"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""SchemaName"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""JournalEvents.EventCore.SessionScanData"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""Content"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""ContentObject"", ""DataType"": ""string"", ""ComplexType"": { ""DataType"": ""JArray"", ""Node"": ""$.GetReportResponse[*].GetReportResult[*].diffgr:diffgram[*].DocumentElement[*].['Session Scan Data']"", ""TruthTable"": [ { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.id"", ""DestinationColumn"": ""EventKey"", ""DataType"": ""string"" }, { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.name"", ""DestinationColumn"": ""EventName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Event ID"", ""DestinationColumn"": ""EventID"", ""DataType"": ""int"" }, { ""SourceColumn"": ""RegStatusID"", ""DestinationColumn"": ""RegStatusID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Registrant ID"", ""DestinationColumn"": ""RegistrantID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Type"", ""DestinationColumn"": ""Type"", ""DataType"": ""string"" }, { ""SourceColumn"": ""First Name"", ""DestinationColumn"": ""FirstName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Last Name"", ""DestinationColumn"": ""LastName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Email"", ""DestinationColumn"": ""Email"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignedUp"", ""DestinationColumn"": ""SignedUp"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignupInsertDate"", ""DestinationColumn"": ""SignupInsertDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationSignupModifiedDate"", ""DestinationColumn"": ""PresentationSignupModifiedDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Code"", ""DestinationColumn"": ""SessionCode"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Title"", ""DestinationColumn"": ""SessionTitle"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Start Time"", ""DestinationColumn"": ""StartTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""End Time"", ""DestinationColumn"": ""EndTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Track"", ""DestinationColumn"": ""Track"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationCheckedInDate"", ""DestinationColumn"": ""PresentationCheckedInDate"", ""DataType"": ""string"" } ] } }, { ""SourceColumn"": """", ""DestinationColumn"": ""EventDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""CreatedDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } } ] }}"; + + string inputJson = + @"{ ""GetReportResponse"": [ { ""@xmlns"": ""https://api.eventcore.com/"", ""GetReportResult"": [ { ""diffgr:diffgram"": [ { ""@xmlns:msdata"": ""urn:schemas-microsoft-com:xml-msdata"", ""@xmlns:diffgr"": ""urn:schemas-microsoft-com:xml-diffgram-v1"", ""DocumentElement"": [ { ""@xmlns"": """", ""Session Scan Data"": [ { ""@diffgr:id"": ""Session Scan Data1"", ""@msdata:rowOrder"": ""0"", ""@diffgr:hasChanges"": ""inserted"", ""Event ID"": ""14337"", ""RegStatusID"": ""7"", ""Registrant ID"": ""2017054"", ""Type"": ""General Attendee"", ""First Name"": ""emad"", ""Last Name"": ""AbuAljazer "", ""Email"": ""jazer313@hotmail.com"", ""SignedUp"": ""true"", ""SignupInsertDate"": ""2015-10-29T07:48:27.767-07:00"", ""PresentationSignupModifiedDate"": ""2015-10-29T07:48:27.767-07:00"", ""Session Code"": ""ITPRO17"", ""Session Title"": ""Deploy virtual machines in the cloud part II"", ""Start Time"": ""11/02/2015 15:15:00 -08:00"", ""End Time"": ""11/02/2015 16:30:00 -08:00"", ""Track"": ""IT Professional"" } ] } ] } ] } ], ""recordCount"": ""-1"" } ], ""MifContext"": { ""runImmediate"": true, ""runId"": ""b8cb0be4-2375-4de2-9781-15dbbf8bc9b3"", ""TrackingEnabled"": false, ""WorkFlowName"": ""EventCoreSessionScanDataToEDP"", ""moreData"": ""true"", ""start_Index"": 501, ""end_Index"": 1000, ""correlationId"": ""8ab25b61-ec8a-4b40-8189-4b77f4f3cbf5"" }, ""ForEachContext"": { ""id"": ""8707"", ""name"": ""MGX FY14"" }}"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = mapper.TransformIntoJson(inputJson, true); + + Assert.IsTrue(lead.Contains("2015-10-29T07:48:27.767-07:00") && lead.Contains("2015-10-29T07:48:27.767-07:00") + && lead.Contains("11/02/2015 15:15:00 -08:00") && lead.Contains("11/02/2015 16:30:00 -08:00") && lead.Contains("8707")); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] + public void Validate_AutoMapper_DefaultValue1() + { + // Arrange + string mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":null,\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + + string inputJson = + "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.Name == "NA"); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the property is mapped according to input value.")] + public void Validate_AutoMapper_DefaultValue2() + { + // Arrange + string mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + + string inputJson = + "{\"Name\": \"1\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.Name == "true"); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] + public void Validate_AutoMapper_DefaultValue3() + { + // Arrange + string mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + + string inputJson = + "{\"Name\": \"22\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.Name == "NA"); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the property is set to custom value if the value passed is empty.")] + public void Validate_AutoMapper_EmptyValue() + { + // Arrange + string mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": false},{\"ExistingValue\": \"\",\"NewValue\": true}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + + string inputJson = + "{\"Name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.Name == "true"); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Complex transformation test - Validate that the value returned is a complex type.")] + public void Complex2FlatTransformationTest() + { + //Arrange - Certain input json with complex object + string inputJson = + "{\"dateCreated\": \"2015-08-31T14:30:00\", \"accountCode\": \"Cross-Product\", \"isActive\": true, \"isHotel\": false, \"isPreferred\": false, \"brandFrnId\": null, \"chainFrnId\": null, \"locationType\": \"Venue\", \"largestSpace\": null, \"numberOfMeetRooms\": null, \"numberOfRooms\": null, \"totalSpace\": null, \"address\": { \"line1\": \"750 Main Street\", \"line2\": null, \"line3\": null, \"line4\": null, \"city\": \"Moncton\", \"state\": \"New Brunswick\", \"postalCode\": \"E1C 1E6\", \"country\": \"Canada\", \"intlState\": null }, \"locationThirdParty\": null, \"locationCode\": \"msft_can_delta_monc\", \"desc\": \"\", \"directions\": \"\", \"email\": \"\", \"externalFrnKey\": null, \"fax\": \"\", \"imgAttributes\": \"\", \"imgSrc\": null, \"label\": \"\", \"name\": \"Delta Beausejour Hotel\", \"notes\": \"\", \"organization\": null, \"phone\": \"\", \"tollfree\": \"\", \"url\": \"http://binged.it/1O4l53S\" } "; + string mapping = "{\"MappingRuleConfig\":{\"DestinationType\":\"\",\"SourceObject\":\"\",\"DestinationObject\":\"\",\"TruthTable\":[{\"SourceColumn\":\"$.address['city']\",\"DestinationColumn\":\"City\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['state']\",\"DestinationColumn\":\"State\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['postalCode']\",\"DestinationColumn\":\"PostalCode\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['country']\",\"DestinationColumn\":\"Country\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var flatObject = JObject.Parse(mapper.TransformIntoJson(inputJson, false)); + + //Assert + Assert.AreEqual(flatObject.HasValues, true); + Assert.AreEqual(flatObject.Count, 4); + } + + [TestMethod, Description("Transpose handler test - Validate that the value returned is transposed.")] + public void PromoteAttributesToPropertyTestWithoutPrependKeyText() + { + //Arrange - Certain input json with complex object + string inputJson = + "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; + string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""SourceType"":""Webpagevisit"",""SourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""ClientIPAddress"":""203.141.7.100"",""UserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""WebpageID"":4,""WebpageURL"":""/anti-phishing.html""}]}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert + Assert.AreEqual(value, expectedResponse); + } + + [TestMethod, Description("Transpose handler test - Validate that the value returned is transposed with prepend key text.")] + public void PromoteAttributesToPropertyTestWithPrependKeyText() + { + //Arrange - Certain input json with complex object + string inputJson = + "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; + string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"PrependKeyText\":\"Attribute\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""AttributeSourceType"":""Webpagevisit"",""AttributeSourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""AttributeClientIPAddress"":""203.141.7.100"",""AttributeUserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""AttributeWebpageID"":4,""AttributeWebpageURL"":""/anti-phishing.html""}]}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert + Assert.IsTrue(value.Contains("AttributeWebpageURL")); + Assert.AreEqual(value, expectedResponse); + } + + [TestMethod, Description("Roslyn script handler test - Validate that the value returned is after executing the script.")] + public void RoslynTest() + { + //Arrange - Certain input json with complex object + string inputJson = + "{\r\n \"eventCode\": \"APAC-1PWBNR3-0331-16-HQ\",\r\n \"pkEventId\": \"0x449740001\",\r\n \"eventId\": \"2353\",\r\n \"externalKey\": \"AP-Azure-WBNR-FY16-03Mar-31-Win10_Device_Management\",\r\n \"accountCode\": \"C-and-E\",\r\n \"eventName\": \"Windows 10 for device management\",\r\n \"url\": null,\r\n \"autoCalcCode\": false,\r\n \"isTestMode\": false,\r\n \"isActive\": true,\r\n \"isTemplate\": false,\r\n \"isLocked\": true,\r\n \"isClassic\": true,\r\n \"eventStatus\": \"Live\",\r\n \"isPending\": false,\r\n \"isDesign\": false,\r\n \"isTesting\": false,\r\n \"isOnsite\": false,\r\n \"isOffline\": false,\r\n \"isClosed\": false,\r\n \"isNotificationEnabled\": false,\r\n \"notes\": \"\",\r\n \"contact\": {\r\n \"contactName\": \"Microsoft SQL Team\",\r\n \"organization\": \"\",\r\n \"email\": \"b-dikurn@microsoft.com\",\r\n \"phone\": \"\",\r\n \"tollfree\": \"\",\r\n \"fax\": \"\",\r\n \"url\": \"\",\r\n \"notes\": \"\"\r\n },\r\n \"location\": {\r\n \"locationName\": \"Webinar\",\r\n \"locationCode\": \"Webinar\",\r\n \"email\": null,\r\n \"phone\": null,\r\n \"tollfree\": null,\r\n \"fax\": null,\r\n \"url\": null,\r\n \"notes\": null\r\n },\r\n \"dateCreated\": \"2016-02-17T15:59:42\",\r\n \"dateModified\": \"2016-02-19T14:21:21\",\r\n \"startDate\": \"2016-03-31T08:00:00\",\r\n \"endDate\": \"2016-03-31T16:00:00\",\r\n \"dateClosed\": null,\r\n \"txtEvtCreatedBy\": \"Samuel Pak\",\r\n \"txtEvtModifiedBy\": \"Maha Pasha\",\r\n \"glNumber\": \"\",\r\n \"timezone\": \"(GMT+05:00) Islamabad, Karachi, Tashkent\",\r\n \"timezoneMapping\": \"Asia/Karachi\",\r\n \"timezoneId\": 85,\r\n \"proposedLocation\": null,\r\n \"plannedAttendance\": null,\r\n \"proposedBudget\": null,\r\n \"plannedCurrency\": null,\r\n \"travelAccoCurrency\": null,\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionField\": \"evt_ans_field19\",\r\n \"questionId\": 638,\r\n \"questionCode\": \"Design-LPHeroImg\",\r\n \"questionName\": \"Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"https://info.microsoft.com/rs/157-GQE-382/images/ms-win10-webinar-banners-3000x300-04.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field24\",\r\n \"questionId\": 996,\r\n \"questionCode\": \"Design-EmailBannerImg\",\r\n \"questionName\": \"Design-EmailBannerImg \",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field16\",\r\n \"questionId\": 398,\r\n \"questionCode\": \"Program-BannerText\",\r\n \"questionName\": \"Program-BannerText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Microsft Event Banner Title\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field20\",\r\n \"questionId\": 639,\r\n \"questionCode\": \"Design-BannerTextColor\",\r\n \"questionName\": \"Design-BannerTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field17\",\r\n \"questionId\": 633,\r\n \"questionCode\": \"Design-HeaderTextColor\",\r\n \"questionName\": \"Design-HeaderTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#333333\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field06\",\r\n \"questionId\": 152,\r\n \"questionCode\": \"Program-HeaderText\",\r\n \"questionName\": \"Program-HeaderText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Windows 10 for device management\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field07\",\r\n \"questionId\": 153,\r\n \"questionCode\": \"Program-Description\",\r\n \"questionName\": \"Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"A\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field09\",\r\n \"questionId\": 229,\r\n \"questionCode\": \"Program-AdditionalInfo\",\r\n \"questionName\": \"Program-AdditionalInfo\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"B\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field21\",\r\n \"questionId\": 640,\r\n \"questionCode\": \"Design-HighlightColor\",\r\n \"questionName\": \"Design-HighlightColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field22\",\r\n \"questionId\": 641,\r\n \"questionCode\": \"Design-HighlightTextColor\",\r\n \"questionName\": \"Design-HighlightTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field01\",\r\n \"questionId\": 147,\r\n \"questionCode\": \"Hero Banner Image\",\r\n \"questionName\": \"Hero Banner Image\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"EN-BASICE-Banner-PeopleWithDevices.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field02\",\r\n \"questionId\": 37143,\r\n \"questionCode\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"questionName\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field30\",\r\n \"questionId\": 649,\r\n \"questionCode\": \"DELETED-Program-Description\",\r\n \"questionName\": \"DELETED-Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n \"groups\": null,\r\n \"rotations\": null,\r\n \"forms\": null,\r\n \"websites\": null,\r\n \"primaryFormURL\": \"/profile/form/index.cfm?PKformID=0x1084150001\",\r\n \"questionAssignments\": null\r\n}"; + string mapping = + "{\r\n \"Scripts\": [\r\n {\r\n \"Name\": \"GetTitle\",\r\n \"Code\": \"string GetTitle(string args){string[] input = args.Split(new string[] {\\\"[delimiter]\\\"}, System.StringSplitOptions.None);string[] data = null; var title = string.Empty;for (int i = 0; i < input.Length; i++){if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")){title = input[i];break;}if (input[i].Contains(\\\"tokenDelimiter\\\") == true){data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None);for (int x = 0; x < data.Length; x++){if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])){title = data[x].ToString();break;}}}else{continue;}} return title;}GetTitle(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetDescription\",\r\n \"Code\": \"string GetEventDesc(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventDesc = string.Empty; for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventDesc = input[i]; eventDesc = System.Text.RegularExpressions.Regex.Replace(input[i], @\\\"<(.|\\n)*?>\\\", string.Empty); break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] {\\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventDesc = data[x].ToString(); eventDesc = System.Text.RegularExpressions.Regex.Replace(data[x], @\\\"<(.|\\n)*?>\\\", string.Empty); break;} } } else { continue; }} return eventDesc;}GetEventDesc(Args)\",\r\n \"Reference\": {\r\n \"Assembly\": \"System\",\r\n \"NameSpace\": \"System.Text.RegularExpressions\"\r\n }\r\n },\r\n {\r\n \"Name\": \"GetURL\",\r\n \"Code\": \"string GetURL(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventURL = string.Empty;for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventURL = input[i]; break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventURL = data[x].ToString(); break; } } } else { continue; } } if (string.IsNullOrEmpty(eventURL)) return eventURL = \\\"www.microsoft.com\\\"; else return eventURL; }GetURL(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetJsonArray\",\r\n \"Code\": \"string GetJsonArray(string args) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(\\\"[\\\"); foreach (var item in args.Split(',')) { sb.Append(@\\\"\\\"\\\"\\\" + item + @\\\"\\\"\\\",\\\"); } sb.Remove(sb.Length - 1, 1); sb.Append(\\\"]\\\"); return sb.ToString();}GetJsonArray(Args)\"\r\n }\r\n ],\r\n \"MappingRuleConfig\": {\r\n \"DestinationType\": \"EventInformation\",\r\n \"SourceObject\": \"CertainEvents\",\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventList\",\r\n \"DataType\": \"jarray\",\r\n \"ComplexType\": {\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"title\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetTitle\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-HeaderText')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-BannerText')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"accountCode\",\r\n \"DestinationColumn\": \"accountCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventCode\",\r\n \"DestinationColumn\": \"Id\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventStatus\",\r\n \"DestinationColumn\": \"Status\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"timezone\",\r\n \"DestinationColumn\": \"timezone\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"source\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Certain\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventCategory\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Onsite Event\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"startDate\",\r\n \"DestinationColumn\": \"StartDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"endDate\",\r\n \"DestinationColumn\": \"EndDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"$.location['locationName']\",\r\n \"DestinationColumn\": \"locationCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Description\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetDescription\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventAbstract')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-Description')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryLanguage\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Localization-Form-and-Email-Language')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryTargetAudience\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventsFor')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Product\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventProduct')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"EventSource\",\r\n \"DestinationColumn\": \"EventSource\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"$.eventQuestions.question[?(@.questionCode == 'Search-EventIcon')].answers.answer.[0].value\",\r\n \"DestinationColumn\": \"EventIcon\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Category\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"TBD\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"URL\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetURL\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-AlternateRegURL')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'primaryFormURL')].answers.answer.[0].value\"\r\n ]\r\n }\r\n\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"RequestId\",\r\n \"DataType\": \"guid\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"4bfaac9c-1e0d-4620-b9e6-66095376e99a\"\r\n }\r\n }\r\n ]\r\n }\r\n}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = @"{""EventList"":[{""title"":""Windows 10 for device management"",""accountCode"":""C-and-E"",""Id"":""APAC-1PWBNR3-0331-16-HQ"",""Status"":""Live"",""timezone"":""(GMT+05:00) Islamabad, Karachi, Tashkent"",""source"":""Certain"",""EventCategory"":""Onsite Event"",""StartDate"":""2016-03-31T08:00:00Z"",""EndDate"":""2016-03-31T16:00:00Z"",""locationCode"":""Webinar"",""Description"":""A"",""PrimaryLanguage"":[""""],""PrimaryTargetAudience"":[""""],""Product"":[""""],""Category"":""TBD"",""URL"":""www.microsoft.com""}],""RequestId"":""4bfaac9c-1e0d-4620-b9e6-66095376e99a""}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert + Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); + } + + [TestMethod, Description("Parent data test - Validate that the value returned is from the parent JObject.")] + public void ParentDataTest() + { + //Arrange - Certain input json with complex object + string inputJson = + "{\r\n \"events\": [\r\n {\r\n \"eventId\": \"100\",\r\n \"eventName\": \"A\",\r\n \"location\": {\r\n \"locationName\": \"Lincoln Square\",\r\n \"locationCode\": \"Lincoln Square\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q1\", \r\n \"questionName\": \"1Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n },\r\n{\r\n \"answerId\": null,\r\n \"value\": \"2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q2\", \r\n \"questionName\": \"2Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"3Consumers,Partners\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n{\r\n \"eventId\": \"200\",\r\n \"eventName\": \"B\",\r\n \"location\": {\r\n \"locationName\": \"Bel\",\r\n \"locationCode\": \"Bel\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q3\", \r\n \"questionName\": \"3Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n \r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q4\", \r\n \"questionName\": \"4Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"4Klo\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n}"; + string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Answers\",\"DataType\":\"string\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.events[*].eventQuestions.question[*].answers.answer\",\"TruthTable\":[{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].eventId\",\"DestinationColumn\":\"eventId\",\"DataType\":\"string\"},{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].questionId\",\"DestinationColumn\":\"questionId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerId\",\"DestinationColumn\":\"answerId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerCode\",\"DestinationColumn\":\"answerCode\",\"DataType\":\"string\"},{\"SourceColumn\":\"value\",\"DestinationColumn\":\"value\",\"DataType\":\"string\"}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = @"{""Answers"":[{""eventId"":""100"",""questionId"":""Q1"",""value"":""1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q1"",""value"":""2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q2"",""value"":""3Consumers,Partners""},{""eventId"":""200"",""questionId"":""Q3""},{""eventId"":""200"",""questionId"":""Q4"",""value"":""4Klo""}]}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert + Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); + } + + [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned.")] + public void Validate_ValueMappingHandler_DefaultValue() + { + // Arrange + string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"Certain\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + string input = "{\"value\":null}"; + + //Act + ITransformationHandler handler = new ValueMappingHandler(); + try + { + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + Assert.IsTrue(response == "Certain"); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is UTC now.")] + public void Validate_ValueMappingHandler_DefaultValue_UtcNow() + { + // Arrange + string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + string input = "{\"value\":null}"; + + //Act + ITransformationHandler handler = new ValueMappingHandler(); + try + { + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + DateTime date; + Assert.IsTrue(DateTime.TryParse(response, out date)); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is new Guid.")] + public void Validate_ValueMappingHandler_DefaultValue_Guid() + { + // Arrange + string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"NewGuid\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + string input = "{\"value\":null}"; + + //Act + ITransformationHandler handler = new ValueMappingHandler(); + try + { + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + Guid guid; + Assert.IsTrue(Guid.TryParse(response, out guid)); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is mapped.")] + public void Validate_ValueMappingHandler_DefaultValue_Mapping() + { + // Arrange + string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": 1},{\"ExistingValue\": \"1\",\"NewValue\": 2}, {\"ExistingValue\": \"0\",\"NewValue\": -1}],\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + string input = "{\"value\":\"1\"}"; + + //Act + ITransformationHandler handler = new ValueMappingHandler(); + try + { + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + Assert.IsTrue(response == "2"); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Function handler test - Validate that the value returned is concatenated.")] + public void FunctionTest_ConCat() + { + //Arrange - Certain input json with complex object + string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": [{""questionField"": ""evt_ans_field19"",""questionId"": 638,""questionCode"": ""Design-LPHeroImg"",""questionName"": ""Design-LPHeroImg"",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""https://info.microsoft.com""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""First answer""},{""answerId"": null,""answerCode"": null,""value"": ""Last answer""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": """"}]}}]}}"; + string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; - var mapper = new AutoMapper(mapping); + var mapper = new AutoMapper(mapping); - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.com,Hello world!\"},{\"title\":\"First answer,Last answer,Hello world!\"},{\"title\":\",Hello world!\"}]}"; - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNode_Failure() - { - //Arrange - Certain input json with complex object + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Function handler test - Validate that the value returned is concatenated when delimeter is null.")] + public void FunctionTest_ConCat_WithoutDelimeter() + { + //Arrange - Certain input json with complex object + string inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; + string mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value','Hello world!']}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.comHello world!\"},{\"title\":\"First answerLast answerHello world!\"},{\"title\":\"Hello world!\"}]}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Function handler test - Validate that the value returned is concatenated when params collection is null.")] + public void FunctionTest_ConCat_EmptyParamCollection() + { + //Arrange - Certain input json with complex object + string inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; + string mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value1','Hello world!']}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"}]}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Function handler test - Validate that the value returned has no empty array.")] + public void IgnoreEmptyArrayTest_True() + { + //Arrange - Certain input json with complex object + string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":true, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Function handler test - Validate that the value returned is empty array.")] + public void IgnoreEmptyArrayTest_False() + { + //Arrange - Certain input json with complex object + string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":false, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[]}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Function handler test - Validate that the value returned is empty array.")] + public void IgnoreEmptyArrayTest_NotSet() + { + //Arrange - Certain input json with complex object + string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"", ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[]}"; - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'CNE','ReturnValue':'','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + [TestMethod, Description("Value handler test - Validate transformation if default value is empty.")] + public void Automapper_EmptyDefaultValueTest() + { + //Arrange - Certain input json with complex object + string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + string mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"__meta__Entity\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"GenericPresales\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"EncryptedFields\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \" \" } } ] } } "; - var mapper = new AutoMapper(mapping); + var mapper = new AutoMapper(mapping); - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"NA\\\"\\r\\n}\"}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"__meta__Entity\":\"GenericPresales\",\"EncryptedFields\":\" \"}"; - //Assert - Assert.AreEqual(response, expectedResponse); - } - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNode_Sucess() - { - //Arrange - Certain input json with complex object + //Assert + Assert.AreEqual(expectedResponse, response); + } - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value.")] + public void FunctionTest_ReplaceValue() + { + //Arrange - Certain input json with complex object + string inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; + string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'httPS://info.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValue','Params':['$.answers.answer[*].value']}}]}}]}}"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'Topic','ReturnValue':'RV','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapper = new AutoMapper(mapping); - var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"RV\\\"\\r\\n}\"}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNode_Failure() + { + //Arrange - Certain input json with complex object - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNode_JsonPath() - { - //Arrange - Certain input json with complex object + string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'CNE','ReturnValue':'','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapper = new AutoMapper(mapping); - var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"NA\\\"\\r\\n}\"}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNode_Sucess() + { + //Arrange - Certain input json with complex object - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() - { - //Arrange - Certain input json with complex object + string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": null, }"; + string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'Topic','ReturnValue':'RV','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapper = new AutoMapper(mapping); - var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"RV\\\"\\r\\n}\"}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNode_JsonPath() + { + //Arrange - Certain input json with complex object - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValue_ReturnValue_Node() - { - //Arrange - Certain input json with complex object + string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapper = new AutoMapper(mapping); - var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() + { + //Arrange - Certain input json with complex object - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNodeTwo() - { - //Arrange - Certain input json with complex object + string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": null, }"; - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": \"+1234565430\", \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Mswide\", }"; + string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'MSWide','ReturnValue':'','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapper = new AutoMapper(mapping); - var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"\\\"\\r\\n}\"}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValue_ReturnValue_Node() + { + //Arrange - Certain input json with complex object + string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - [TestMethod, Description("Function handler test - Validate the value returned when compareToValue and input value are both null.")] - public void FunctionTest_ReplaceValue_NullCompareToValueAndInputValue_RegexTest() - { - //Arrange - Certain input json - string inputJson = @"{'MessageBody': {'address': null}}"; - string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': 'def' ,'DefaultValue': 'fgh','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + var mapper = new AutoMapper(mapping); - var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"address\":\"def\"}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNodeTwo() + { + //Arrange - Certain input json with complex object + + string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": \"+1234565430\", \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Mswide\", }"; + + string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'MSWide','ReturnValue':'','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"\\\"\\r\\n}\"}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } - [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is null and inputvalue is not null.")] - public void FunctionTest_ReplaceValue_NulllCompareToValue_RegexTest() - { - //Arrange - Certain input json - string inputJson = @"{'MessageBody': {'address': 'abc'}}"; - string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': null ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + [TestMethod, Description("Function handler test - Validate the value returned when compareToValue and input value are both null.")] + public void FunctionTest_ReplaceValue_NullCompareToValueAndInputValue_RegexTest() + { + //Arrange - Certain input json + string inputJson = @"{'MessageBody': {'address': null}}"; + string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': 'def' ,'DefaultValue': 'fgh','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; - var mapper = new AutoMapper(mapping); + var mapper = new AutoMapper(mapping); - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"address\":\"abc\"}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"address\":\"def\"}"; - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Assert + Assert.AreEqual(response, expectedResponse); + } - [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is empty.")] - public void FunctionTest_ReplaceValue_EmptyCompareToValue_RegexTest() - { - //Arrange - Certain input json - string inputJson = @"{'MessageBody': {'address': 'abc'}}"; - string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': '' ,'ReturnValue': 'def' ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is null and inputvalue is not null.")] + public void FunctionTest_ReplaceValue_NulllCompareToValue_RegexTest() + { + //Arrange - Certain input json + string inputJson = @"{'MessageBody': {'address': 'abc'}}"; + string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': null ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; - var mapper = new AutoMapper(mapping); + var mapper = new AutoMapper(mapping); - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"address\":\"def\"}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"address\":\"abc\"}"; - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Assert + Assert.AreEqual(response, expectedResponse); + } - [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is a nonempty,non null regex.")] - public void FunctionTest_ReplaceValue_RegexTest() - { - //Arrange - Certain input json with complex object - string inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'[a-z]+.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValueWithRegexComparison','Params':['$.answers.answer[*].value']}}]}}]}}"; + [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is empty.")] + public void FunctionTest_ReplaceValue_EmptyCompareToValue_RegexTest() + { + //Arrange - Certain input json + string inputJson = @"{'MessageBody': {'address': 'abc'}}"; + string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': '' ,'ReturnValue': 'def' ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + + var mapper = new AutoMapper(mapping); - var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"address\":\"def\"}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Value handler test - Validate transformation if ignoreNull is set as false.")] - public void Automapper_IgnoreNullFalseTest() - { - //Arrange - Certain input json with complex object - string inputJson = "{ \"etag\": \"1-null\", \"transactionId\": null, \"completeCollectionSize\": 25, \"size\": 3, \"startingIndex\": 1, \"maxResults\": 3, \"questions\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answer\": [ { \"answerName\": \"answerNameXYZ\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\" } ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answer\": [ ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answer\": [ ] } ] }"; - string mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"EventId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"-1\" } }, { \"SourceColumn\": \"$.MifContext.BatchId\", \"DestinationColumn\": \"BatchId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.correlationId\", \"DestinationColumn\": \"RequestId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.moreEventQuestions\", \"DestinationColumn\": \"MoreResults\", \"DataType\": \"bool\", \"ComplexType\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"SchemaName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"JournalEvents.Certain.EventQuestionAnswersDetail\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Content\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"ContentObject\", \"DataType\": \"string\", \"ComplexType\": { \"DataType\": \"JArray\", \"IgnoreNullValue\": false, \"Node\": \"$.questions[*].answer\", \"TruthTable\": [ { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].accountCode\", \"DestinationColumn\": \"accountCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].eventCode\", \"DestinationColumn\": \"eventCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionName\", \"DestinationColumn\": \"questionName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionLabel\", \"DestinationColumn\": \"questionLabel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionCode\", \"DestinationColumn\": \"questionCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionType\", \"DestinationColumn\": \"questionType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"answerLabel\", \"DestinationColumn\": \"answerLabel\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerCode\", \"DestinationColumn\": \"answerCode\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerName\", \"DestinationColumn\": \"answerName\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } } ] } } ] } }"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(JObject.Parse(inputJson), true); - string expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; - //Assert - Assert.IsTrue(JToken.DeepEquals(response, JObject.Parse(expectedResponse))); - } - - [TestMethod, Description("Function handler test - Validate that the value returned is first index after split")] - public void FunctionTest_SplitWithOneIndex() - { - //Arrange - Certain input json with complex object - string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Key\":[{\"Key\":\"12121212333\"}]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Function handler test - Validate that the value returned is first and second index after split")] - public void FunctionTest_SplitWithTwoIndex() - { - //Arrange - Certain input json with complex object - string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}},{""SourceColumn"":"""",""DestinationColumn"":""Message"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":1,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"Key\":\"12121212333\",\"Message\":\"AKJKKAJDKAKJKKKDKSKAK\"}]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Function handler test - Validate Upper case functionality")] - public void FunctionTest_TransformToUpperCase() - { - //Arrange - Certain input json with complex object - string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOUPPERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\"}]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Function handler test - Validate Upper case functionality in Parent Node")] - public void FunctionTest_TransformToUpperCaseParent() - { - //Arrange - Certain input json with complex object - string mapping; - using (StreamReader r = new StreamReader(@"Jsons\ToUpper\Upper_Mapping.json")) - { - mapping = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - string inputJson; - using (StreamReader r = new StreamReader(@"Jsons\ToUpper\Transformation_Input.json")) - { - inputJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\",\"FirstName\":\"AP - Azure\",\"LastName\":\"C - AND - E\"}]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Function handler test - Validate Upper case functionality")] - public void FunctionTest_TransformToLowerCase() - { - //Arrange - Certain input json with complex object - string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOLOWERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; - - var mapper = new AutoMapper(mapping); - - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"windows 10\"}]}"; - - //Assert - Assert.AreEqual(response, expectedResponse); - } - - [TestMethod, Description("Validate that the datatype is set to input type if mapping datatype is set to null.")] - public void Validate_AutoMapper_NullDataType() - { - // Arrange - string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"$.AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null}]}}"; - - string inputJson = - "{\"Name\": \"22\",\"AllowEmail\": false,\"CrmId\": null,\"LeadScore\":100}"; - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - LeadRecord lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.LeadScore == 100); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("Validate that the JObject and JArray are created With same Flattene Object.")] - public void AutoMappperMappingForJObjectAndJarray() - { - // Arrange - string inputJson = - "{ \"ProgramName\": \"test4\", \"ProgramFolderId\": \"49\", \"ProgramFolderType\": \"Folder\", \"ProgramDescription\": \"xcvxbv\", \"ProgramType\": \"Default\", \"ProgramChannel\": \"Email Blast\", \"ProgramCosts\": \"8360\", \"ProgramStartDate\": \"2015-01-01\" }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"DestinationType\": \"JObject\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramName\", \"DestinationColumn\": \"ProgramName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Folder\", \"DataType\": \"JObject\", \"ComplexType\": { \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramFolderId\", \"DestinationColumn\": \"id\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramFolderType\", \"DestinationColumn\": \"type\", \"DataType\": \"string\" } ] } }, { \"SourceColumn\": \"$.ProgramDescription\", \"DestinationColumn\": \"ProgramDescription\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramType\", \"DestinationColumn\": \"ProgramType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramChannel\", \"DestinationColumn\": \"ProgramChannel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Costs\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"IgnoreEmptyArray\": true, \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramStartDate\", \"DestinationColumn\": \"startDate\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramCosts\", \"DestinationColumn\": \"cost\", \"DataType\": \"string\" } ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(inputJson); - string expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; - - Assert.AreEqual(output, expectedOutput); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("Validate that the datetime format is not changed after transformation.")] - public void AutoMappperMapping_ValidateDateTimeFormat() - { - // Arrange - string inputJson = - "{'Content':[{'Date':'2015-11-30T00:00:00','LongFormattedDate':'Monday,November30','ShortFormattedDate':'11/30/2015','DateString':null,'DateIndex':1}],'MifContext':{'runImmediate':true,'runId':'97216631-3453-4326-9a83-d5c83c62c2e6','TrackingEnabled':false,'WorkFlowName':'EPDaysToEDP','programId':'52aa95a6-831a-e511-ab0e-00155d5066d7','programCode':'conv2015emea','correlationId':'e62812d0-7d19-4496-bd9a-8a5202fa8750'},'ForEachContext':{'Url':'https://eventpoint-conv2015emea-services.azurewebsites.net','APIKey':'050e1a02033e48319ac9fd051452a484'}"; - - string mappingJson = - "{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventId','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': '-1'}},{'SourceColumn': '$.MifContext.correlationId','DestinationColumn': 'BatchId','DataType': 'guid','ComplexType': null,'TransformValue': null},{'SourceColumn': '','DestinationColumn': 'RequestId','DataType': 'guid','ComplexType': null,'TransformValue': {'DefaultValue': 'newGuid'}},{'SourceColumn': '','DestinationColumn': 'MoreResults','DataType': 'bool','ComplexType': null,'TransformValue': {'DefaultValue': 'false'}},{'SourceColumn': '','DestinationColumn': 'SchemaName','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': 'JournalEvents.EventPoint.ProgramDay'}},{'SourceColumn': '','DestinationColumn': 'ContentObject','DataType': 'JArray','ComplexType': {'DataType': 'JArray','Node': '$.Content[*]','TruthTable': [{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programId','DestinationColumn': 'ProgramId','DataType': 'string'},{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programCode','DestinationColumn': 'ProgramCode','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'ProgramDayDate','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'LongFormattedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ',},{'SourceColumn': '$.ShortFormattedDate','DestinationColumn': 'ShortFormattedDate','DataType': 'string'},{'SourceColumn': '$.DateString','DestinationColumn': 'DateString','DataType': 'string'},{'SourceColumn': '$.DateIndex','DestinationColumn': 'DateIndex','DataType': 'string'}]}},{'SourceColumn': '','DestinationColumn': 'CreatedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}},{'SourceColumn': '','DestinationColumn': 'EventDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}}]}}"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - - Assert.AreEqual(output["ContentObject"][0]["ProgramDayDate"].ToString(), "2015-11-30T00:00:00"); - Assert.AreEqual(output["ContentObject"][0]["ShortFormattedDate"].ToString(), "11/30/2015"); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("Validate that the concatenation where nulls are present.")] - public void AutoMappperMapping_ConcatWithNull() - { - // Arrange - string inputJson = - "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ { \"message\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate that the concatenation where nulls are present.")] - public void AutoMappperMapping_ConcatWithEmptyList() - { - // Arrange - string inputJson = - "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors1\": [ { \"message1\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; - - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate that the DateTime offset is removed from the value to be returned.")] - public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithOffset() - { - // Arrange - string inputJson = - "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000Z+0000\", \"endDate\": \"2015-06-26T15:55:00.000Z-0000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate that the DateTime is sent as it is if no offset is present.")] - public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithoutOffset() - { - // Arrange - string inputJson = - "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000\", \"endDate\": \"2015-06-26T15:55:00.000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_HappyPath() - { - // Arrange - string inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"12345\", \"phone\": \"67890\" } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamNull() - { - // Arrange - string inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"67890\" } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamNotPresent() - { - // Arrange - string inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"phone\": \"67890\" } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ReturnValueNullParamNull() - { - // Arrange - string inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\":null } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\" }"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyString() - { - // Arrange - string inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpace() - { - // Arrange - string inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() - { - // Arrange - string inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"\" } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEmptyParamEnabled() - { - // Arrange - string inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgnoreEmptyParamEnabled() - { - // Arrange - string inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; - - string mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - JObject j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Test one to one mapping functionality")] - public void OneToOneMappingTest() - { - //Arrange - string mappingJson; - using (StreamReader r = new StreamReader(@"Jsons\OneToOneMapping\OneToOneMappingRules.json")) - { - mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - string input; - using (StreamReader r = new StreamReader(@"Jsons\OneToOneMapping\Transformation_Input.json")) - { - input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); - - //Assert - Assert.AreEqual("Financial Services", output.SelectToken("$.Industry").ToString()); - - } - - - [TestMethod, Description("Test range mapping functionality")] - public void RangeMappingTest() - { - //Arrange - string mappingJson; - using (StreamReader r = new StreamReader(@"Jsons\RangeMapping\RangeMappingRules.json")) - { - mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - string input; - using (StreamReader r = new StreamReader(@"Jsons\RangeMapping\Transformation_Input.json")) - { - input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); - - //Assert - Assert.AreEqual("51to250employees", output.SelectToken("$.CompanySize").ToString()); - - } - - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Ampersand")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Ampersand() - { - // Arrange - string inputJson = - "{ \"data\": { \"companyName\": \"Procter & Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - } - - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Dollar")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Dollar() - { - // Arrange - string inputJson = - "{ \"data\": { \"companyName\": \"Procter $ Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - - } - - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Plus")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Plus() - { - // Arrange - string inputJson = - "{ \"data\": { \"companyName\": \"Procter + Gamble Company\", \"countryName\": \"Bulgaria+\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - - } - - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Space")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Space() - { - // Arrange - string inputJson = - "{ \"data\": { \"companyName\": \"Procter Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - } - - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Percent")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Percent() - { - // Arrange - string inputJson = - "{ \"data\": { \"companyName\": \"Procter%Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - - } - - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Exclamation")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Exclamation() - { - // Arrange - string inputJson = - "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - } - - [TestMethod, Description("Test for UriEscapeDataString Null Paramters")] - public void FunctionHanlder_UriEscapeDataString_Null_Parameters() - { - // Arrange - string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": null } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - // string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, new JObject())); - } - - [TestMethod, Description("Test for UriEscapeDataString One Null Paramter")] - public void FunctionHanlder_UriEscapeDataString_One_Null_Parameter() - { - // Arrange - string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", null, \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - } - - [TestMethod, Description("Test for UriEscapeDataString With Invalid Parameter Field")] - public void FunctionHanlder_UriEscapeDataString_Invalid_Parameter_Field() - { - // Arrange - string inputJson = - "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state1\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - } - - } - - - public class LeadRecord - { - public string Name { get; set; } - public bool AllowEmail { get; set; } - public dynamic LeadScore { get; set; } - public Guid CrmId { get; set; } + [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is a nonempty,non null regex.")] + public void FunctionTest_ReplaceValue_RegexTest() + { + //Arrange - Certain input json with complex object + string inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; + string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'[a-z]+.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValueWithRegexComparison','Params':['$.answers.answer[*].value']}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Value handler test - Validate transformation if ignoreNull is set as false.")] + public void Automapper_IgnoreNullFalseTest() + { + //Arrange - Certain input json with complex object + string inputJson = "{ \"etag\": \"1-null\", \"transactionId\": null, \"completeCollectionSize\": 25, \"size\": 3, \"startingIndex\": 1, \"maxResults\": 3, \"questions\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answer\": [ { \"answerName\": \"answerNameXYZ\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\" } ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answer\": [ ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answer\": [ ] } ] }"; + string mapping = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"EventId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"-1\" } }, { \"SourceColumn\": \"$.MifContext.BatchId\", \"DestinationColumn\": \"BatchId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.correlationId\", \"DestinationColumn\": \"RequestId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.moreEventQuestions\", \"DestinationColumn\": \"MoreResults\", \"DataType\": \"bool\", \"ComplexType\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"SchemaName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"JournalEvents.Certain.EventQuestionAnswersDetail\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Content\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"ContentObject\", \"DataType\": \"string\", \"ComplexType\": { \"DataType\": \"JArray\", \"IgnoreNullValue\": false, \"Node\": \"$.questions[*].answer\", \"TruthTable\": [ { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].accountCode\", \"DestinationColumn\": \"accountCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].eventCode\", \"DestinationColumn\": \"eventCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionName\", \"DestinationColumn\": \"questionName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionLabel\", \"DestinationColumn\": \"questionLabel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionCode\", \"DestinationColumn\": \"questionCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionType\", \"DestinationColumn\": \"questionType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"answerLabel\", \"DestinationColumn\": \"answerLabel\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerCode\", \"DestinationColumn\": \"answerCode\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerName\", \"DestinationColumn\": \"answerName\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } } ] } } ] } }"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(JObject.Parse(inputJson), true); + string expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; + //Assert + Assert.IsTrue(JToken.DeepEquals(response, JObject.Parse(expectedResponse))); + } + + [TestMethod, Description("Function handler test - Validate that the value returned is first index after split")] + public void FunctionTest_SplitWithOneIndex() + { + //Arrange - Certain input json with complex object + string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Key\":[{\"Key\":\"12121212333\"}]}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Function handler test - Validate that the value returned is first and second index after split")] + public void FunctionTest_SplitWithTwoIndex() + { + //Arrange - Certain input json with complex object + string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}},{""SourceColumn"":"""",""DestinationColumn"":""Message"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":1,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Data\":[{\"Key\":\"12121212333\",\"Message\":\"AKJKKAJDKAKJKKKDKSKAK\"}]}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Function handler test - Validate Upper case functionality")] + public void FunctionTest_TransformToUpperCase() + { + //Arrange - Certain input json with complex object + string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOUPPERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\"}]}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Function handler test - Validate Upper case functionality in Parent Node")] + public void FunctionTest_TransformToUpperCaseParent() + { + //Arrange - Certain input json with complex object + string mapping; + using (StreamReader r = new StreamReader(@"Jsons\ToUpper\Upper_Mapping.json")) + { + mapping = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); + } + + string inputJson; + using (StreamReader r = new StreamReader(@"Jsons\ToUpper\Transformation_Input.json")) + { + inputJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); + } + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\",\"FirstName\":\"AP - Azure\",\"LastName\":\"C - AND - E\"}]}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Function handler test - Validate Upper case functionality")] + public void FunctionTest_TransformToLowerCase() + { + //Arrange - Certain input json with complex object + string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOLOWERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"windows 10\"}]}"; + + //Assert + Assert.AreEqual(response, expectedResponse); + } + + [TestMethod, Description("Validate that the datatype is set to input type if mapping datatype is set to null.")] + public void Validate_AutoMapper_NullDataType() + { + // Arrange + string mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"$.AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null}]}}"; + + string inputJson = + "{\"Name\": \"22\",\"AllowEmail\": false,\"CrmId\": null,\"LeadScore\":100}"; + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + LeadRecord lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.LeadScore == 100); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the JObject and JArray are created With same Flattene Object.")] + public void AutoMappperMappingForJObjectAndJarray() + { + // Arrange + string inputJson = + "{ \"ProgramName\": \"test4\", \"ProgramFolderId\": \"49\", \"ProgramFolderType\": \"Folder\", \"ProgramDescription\": \"xcvxbv\", \"ProgramType\": \"Default\", \"ProgramChannel\": \"Email Blast\", \"ProgramCosts\": \"8360\", \"ProgramStartDate\": \"2015-01-01\" }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"DestinationType\": \"JObject\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramName\", \"DestinationColumn\": \"ProgramName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Folder\", \"DataType\": \"JObject\", \"ComplexType\": { \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramFolderId\", \"DestinationColumn\": \"id\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramFolderType\", \"DestinationColumn\": \"type\", \"DataType\": \"string\" } ] } }, { \"SourceColumn\": \"$.ProgramDescription\", \"DestinationColumn\": \"ProgramDescription\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramType\", \"DestinationColumn\": \"ProgramType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramChannel\", \"DestinationColumn\": \"ProgramChannel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Costs\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"IgnoreEmptyArray\": true, \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramStartDate\", \"DestinationColumn\": \"startDate\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramCosts\", \"DestinationColumn\": \"cost\", \"DataType\": \"string\" } ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(inputJson); + string expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; + + Assert.AreEqual(output, expectedOutput); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the datetime format is not changed after transformation.")] + public void AutoMappperMapping_ValidateDateTimeFormat() + { + // Arrange + string inputJson = + "{'Content':[{'Date':'2015-11-30T00:00:00','LongFormattedDate':'Monday,November30','ShortFormattedDate':'11/30/2015','DateString':null,'DateIndex':1}],'MifContext':{'runImmediate':true,'runId':'97216631-3453-4326-9a83-d5c83c62c2e6','TrackingEnabled':false,'WorkFlowName':'EPDaysToEDP','programId':'52aa95a6-831a-e511-ab0e-00155d5066d7','programCode':'conv2015emea','correlationId':'e62812d0-7d19-4496-bd9a-8a5202fa8750'},'ForEachContext':{'Url':'https://eventpoint-conv2015emea-services.azurewebsites.net','APIKey':'050e1a02033e48319ac9fd051452a484'}"; + + string mappingJson = + "{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventId','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': '-1'}},{'SourceColumn': '$.MifContext.correlationId','DestinationColumn': 'BatchId','DataType': 'guid','ComplexType': null,'TransformValue': null},{'SourceColumn': '','DestinationColumn': 'RequestId','DataType': 'guid','ComplexType': null,'TransformValue': {'DefaultValue': 'newGuid'}},{'SourceColumn': '','DestinationColumn': 'MoreResults','DataType': 'bool','ComplexType': null,'TransformValue': {'DefaultValue': 'false'}},{'SourceColumn': '','DestinationColumn': 'SchemaName','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': 'JournalEvents.EventPoint.ProgramDay'}},{'SourceColumn': '','DestinationColumn': 'ContentObject','DataType': 'JArray','ComplexType': {'DataType': 'JArray','Node': '$.Content[*]','TruthTable': [{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programId','DestinationColumn': 'ProgramId','DataType': 'string'},{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programCode','DestinationColumn': 'ProgramCode','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'ProgramDayDate','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'LongFormattedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ',},{'SourceColumn': '$.ShortFormattedDate','DestinationColumn': 'ShortFormattedDate','DataType': 'string'},{'SourceColumn': '$.DateString','DestinationColumn': 'DateString','DataType': 'string'},{'SourceColumn': '$.DateIndex','DestinationColumn': 'DateIndex','DataType': 'string'}]}},{'SourceColumn': '','DestinationColumn': 'CreatedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}},{'SourceColumn': '','DestinationColumn': 'EventDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}}]}}"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + + Assert.AreEqual(output["ContentObject"][0]["ProgramDayDate"].ToString(), "2015-11-30T00:00:00"); + Assert.AreEqual(output["ContentObject"][0]["ShortFormattedDate"].ToString(), "11/30/2015"); + } + catch (Exception) + { + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the concatenation where nulls are present.")] + public void AutoMappperMapping_ConcatWithNull() + { + // Arrange + string inputJson = + "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ { \"message\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate that the concatenation where nulls are present.")] + public void AutoMappperMapping_ConcatWithEmptyList() + { + // Arrange + string inputJson = + "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors1\": [ { \"message1\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; + + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate that the DateTime offset is removed from the value to be returned.")] + public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithOffset() + { + // Arrange + string inputJson = + "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000Z+0000\", \"endDate\": \"2015-06-26T15:55:00.000Z-0000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate that the DateTime is sent as it is if no offset is present.")] + public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithoutOffset() + { + // Arrange + string inputJson = + "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000\", \"endDate\": \"2015-06-26T15:55:00.000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_HappyPath() + { + // Arrange + string inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"12345\", \"phone\": \"67890\" } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamNull() + { + // Arrange + string inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"67890\" } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamNotPresent() + { + // Arrange + string inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"phone\": \"67890\" } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ReturnValueNullParamNull() + { + // Arrange + string inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\":null } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"LeadId\":\"leadId1\" }"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyString() + { + // Arrange + string inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpace() + { + // Arrange + string inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() + { + // Arrange + string inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"\" } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEmptyParamEnabled() + { + // Arrange + string inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgnoreEmptyParamEnabled() + { + // Arrange + string inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; + + string mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + JObject j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } + + [TestMethod, Description("Test one to one mapping functionality")] + public void OneToOneMappingTest() + { + //Arrange + string mappingJson; + using (StreamReader r = new StreamReader(@"Jsons\OneToOneMapping\OneToOneMappingRules.json")) + { + mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); + } + + string input; + using (StreamReader r = new StreamReader(@"Jsons\OneToOneMapping\Transformation_Input.json")) + { + input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); + } + + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); + + //Assert + Assert.AreEqual("Financial Services", output.SelectToken("$.Industry").ToString()); + } + + [TestMethod, Description("Test range mapping functionality")] + public void RangeMappingTest() + { + //Arrange + string mappingJson; + using (StreamReader r = new StreamReader(@"Jsons\RangeMapping\RangeMappingRules.json")) + { + mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); + } + + string input; + using (StreamReader r = new StreamReader(@"Jsons\RangeMapping\Transformation_Input.json")) + { + input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); + } + + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); + + //Assert + Assert.AreEqual("51to250employees", output.SelectToken("$.CompanySize").ToString()); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Ampersand")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Ampersand() + { + // Arrange + string inputJson = + "{ \"data\": { \"companyName\": \"Procter & Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Dollar")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Dollar() + { + // Arrange + string inputJson = + "{ \"data\": { \"companyName\": \"Procter $ Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Plus")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Plus() + { + // Arrange + string inputJson = + "{ \"data\": { \"companyName\": \"Procter + Gamble Company\", \"countryName\": \"Bulgaria+\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Space")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Space() + { + // Arrange + string inputJson = + "{ \"data\": { \"companyName\": \"Procter Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Percent")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Percent() + { + // Arrange + string inputJson = + "{ \"data\": { \"companyName\": \"Procter%Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Exclamation")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Exclamation() + { + // Arrange + string inputJson = + "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString Null Paramters")] + public void FunctionHanlder_UriEscapeDataString_Null_Parameters() + { + // Arrange + string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + + string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": null } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + // string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, new JObject())); + } + + [TestMethod, Description("Test for UriEscapeDataString One Null Paramter")] + public void FunctionHanlder_UriEscapeDataString_One_Null_Parameter() + { + // Arrange + string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + + string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", null, \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString With Invalid Parameter Field")] + public void FunctionHanlder_UriEscapeDataString_Invalid_Parameter_Field() + { + // Arrange + string inputJson = + "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state1\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } + } } diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj b/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj index 0c6779c..5478bd2 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj +++ b/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj @@ -132,6 +132,7 @@ + diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/Transformation_Input.json b/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/Transformation_Input.json index 7dd78cb..08e0a91 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/Transformation_Input.json +++ b/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/Transformation_Input.json @@ -1,4 +1,3 @@ { "Industry": "Financial Services" - -} \ No newline at end of file +} diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/RangeMappingRules.json b/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/RangeMappingRules.json index 083f293..d232668 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/RangeMappingRules.json +++ b/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/RangeMappingRules.json @@ -1,6 +1,5 @@ { "MappingRuleConfig": { - "TruthTable": [ { "SourceColumn": "", @@ -17,25 +16,21 @@ "max": 9, "value": "1to9employees" }, - { "min": 10, "max": 50, "value": "10to50employees" }, - { "min": 51, "max": 250, "value": "51to250employees" }, - { "min": 251, "max": 1000, "value": "251to1000employees" }, - { "min": 1001, "max": 5000, @@ -46,22 +41,18 @@ "max": 10000, "value": "5001to10000employees" }, - { "min": 10001, "max": 20000, "value": "10001to20000employees" }, - { "min": 20001, "value": "Morethan20000employees" } ] - } } - ] } } diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/Transformation_Input.json b/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/Transformation_Input.json index 20796d2..b1cf3ba 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/Transformation_Input.json +++ b/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/Transformation_Input.json @@ -1,4 +1,3 @@ { - "CompanySize": 57 - -} \ No newline at end of file + "CompanySize": 57 +} diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Upper_Mapping.json b/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Upper_Mapping.json index 632be91..f02c1cb 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Upper_Mapping.json +++ b/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Upper_Mapping.json @@ -1,4 +1,4 @@ -{ +{ "MappingRuleConfig": { "TruthTable": [ { @@ -43,4 +43,4 @@ } ] } -} \ No newline at end of file +} diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/LeadRecord.cs b/.Net Framework/test/JsonToJsonMapper.Tests/LeadRecord.cs new file mode 100644 index 0000000..7c677e8 --- /dev/null +++ b/.Net Framework/test/JsonToJsonMapper.Tests/LeadRecord.cs @@ -0,0 +1,12 @@ +using System; + +namespace MipUnitTest +{ + public class LeadRecord + { + public string Name { get; set; } + public bool AllowEmail { get; set; } + public dynamic LeadScore { get; set; } + public Guid CrmId { get; set; } + } +} From 2ee9302986e018e3a32b1e60f9b0d7ea828735f0 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 15:17:10 +0100 Subject: [PATCH 04/37] - upgrade Newtonsoft to 13.0.2-beta2 --- .Net Framework/src/AutoMapper/JsonToJsonMapper.csproj | 2 +- .../test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj | 4 ++-- .Net Framework/test/JsonToJsonMapper.Tests/packages.config | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj b/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj index c5d71b1..2689109 100644 --- a/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj +++ b/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj @@ -97,7 +97,7 @@ 4.3.0 - 10.0.1 + 13.0.2-beta2 4.3.0 diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj b/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj index 5478bd2..45ac365 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj +++ b/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj @@ -49,8 +49,8 @@ ..\..\packages\Microsoft.CodeAnalysis.Scripting.Common.2.8.2\lib\netstandard1.3\Microsoft.CodeAnalysis.Scripting.dll - - ..\..\packages\Newtonsoft.Json.10.0.1\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.13.0.2-beta2\lib\net45\Newtonsoft.Json.dll diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/packages.config b/.Net Framework/test/JsonToJsonMapper.Tests/packages.config index a32f887..7ec0e8f 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/packages.config +++ b/.Net Framework/test/JsonToJsonMapper.Tests/packages.config @@ -6,7 +6,7 @@ - + From c064d9d0085c772f1407a46984d29de96b1c09fe Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:08:22 +0100 Subject: [PATCH 05/37] - ported to .NET Core 6 --- .Net Framework/JsonToJsonMapper.Core.sln | 36 ++++++++++++++++ .../AutoMapper/JsonToJsonMapper.Core.csproj | 15 +++++++ .../JsonToJsonMapper.Tests/AutoMapperTest.cs | 42 +++++++++---------- .../JsonToJsonMapper.Core.Tests.csproj | 41 ++++++++++++++++++ 4 files changed, 113 insertions(+), 21 deletions(-) create mode 100644 .Net Framework/JsonToJsonMapper.Core.sln create mode 100644 .Net Framework/src/AutoMapper/JsonToJsonMapper.Core.csproj create mode 100644 .Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj diff --git a/.Net Framework/JsonToJsonMapper.Core.sln b/.Net Framework/JsonToJsonMapper.Core.sln new file mode 100644 index 0000000..a7d575c --- /dev/null +++ b/.Net Framework/JsonToJsonMapper.Core.sln @@ -0,0 +1,36 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30114.105 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9181289D-E1A0-4294-86C3-000A3DB40611}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonToJsonMapper.Core", "src\AutoMapper\JsonToJsonMapper.Core.csproj", "{4620C9BA-6A5E-4B38-A3E3-6394AA94D06C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{5925B6A8-817B-4767-AFF8-12A593C7A3AB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonToJsonMapper.Core.Tests", "test\JsonToJsonMapper.Tests\JsonToJsonMapper.Core.Tests.csproj", "{D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4620C9BA-6A5E-4B38-A3E3-6394AA94D06C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4620C9BA-6A5E-4B38-A3E3-6394AA94D06C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4620C9BA-6A5E-4B38-A3E3-6394AA94D06C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4620C9BA-6A5E-4B38-A3E3-6394AA94D06C}.Release|Any CPU.Build.0 = Release|Any CPU + {D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {4620C9BA-6A5E-4B38-A3E3-6394AA94D06C} = {9181289D-E1A0-4294-86C3-000A3DB40611} + {D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2} = {5925B6A8-817B-4767-AFF8-12A593C7A3AB} + EndGlobalSection +EndGlobal diff --git a/.Net Framework/src/AutoMapper/JsonToJsonMapper.Core.csproj b/.Net Framework/src/AutoMapper/JsonToJsonMapper.Core.csproj new file mode 100644 index 0000000..093e809 --- /dev/null +++ b/.Net Framework/src/AutoMapper/JsonToJsonMapper.Core.csproj @@ -0,0 +1,15 @@ + + + + net6.0 + enable + enable + false + + + + + + + + diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/.Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index 1a5deb1..4eb3f01 100644 --- a/.Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/.Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -63,7 +63,7 @@ public void Validate_AutoMapper_NullValue() { // Arrange string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; string inputJson = "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; @@ -75,9 +75,9 @@ public void Validate_AutoMapper_NullValue() var lead = (LeadRecord)mapper.Transform(inputJson); Assert.IsNull(lead.Name); } - catch (Exception) + catch (Exception ex) { - Assert.Fail(); + Assert.Fail(ex.Message); } } @@ -86,7 +86,7 @@ public void Validate_AutoMapper_EmptyString() { // Arrange string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; string inputJson = "{\"name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"101\"}"; @@ -99,9 +99,9 @@ public void Validate_AutoMapper_EmptyString() Assert.IsTrue(lead.AllowEmail == false); Assert.IsTrue(lead.LeadScore == 101); } - catch (Exception) + catch (Exception ex) { - Assert.Fail(); + Assert.Fail(ex.Message); } } @@ -136,7 +136,7 @@ public void Validate_AutoMapper_DefaultValue1() { // Arrange string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":null,\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":null,\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; string inputJson = "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; @@ -148,9 +148,9 @@ public void Validate_AutoMapper_DefaultValue1() var lead = (LeadRecord)mapper.Transform(inputJson); Assert.IsTrue(lead.Name == "NA"); } - catch (Exception) + catch (Exception ex) { - Assert.Fail(); + Assert.Fail(ex.Message); } } @@ -159,7 +159,7 @@ public void Validate_AutoMapper_DefaultValue2() { // Arrange string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; string inputJson = "{\"Name\": \"1\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; @@ -171,9 +171,9 @@ public void Validate_AutoMapper_DefaultValue2() var lead = (LeadRecord)mapper.Transform(inputJson); Assert.IsTrue(lead.Name == "true"); } - catch (Exception) + catch (Exception ex) { - Assert.Fail(); + Assert.Fail(ex.Message); } } @@ -182,7 +182,7 @@ public void Validate_AutoMapper_DefaultValue3() { // Arrange string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; string inputJson = "{\"Name\": \"22\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; @@ -194,9 +194,9 @@ public void Validate_AutoMapper_DefaultValue3() var lead = (LeadRecord)mapper.Transform(inputJson); Assert.IsTrue(lead.Name == "NA"); } - catch (Exception) + catch (Exception ex) { - Assert.Fail(); + Assert.Fail(ex.Message); } } @@ -205,7 +205,7 @@ public void Validate_AutoMapper_EmptyValue() { // Arrange string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": false},{\"ExistingValue\": \"\",\"NewValue\": true}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": false},{\"ExistingValue\": \"\",\"NewValue\": true}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; string inputJson = "{\"Name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; @@ -217,9 +217,9 @@ public void Validate_AutoMapper_EmptyValue() var lead = (LeadRecord)mapper.Transform(inputJson); Assert.IsTrue(lead.Name == "true"); } - catch (Exception) + catch (Exception ex) { - Assert.Fail(); + Assert.Fail(ex.Message); } } @@ -831,7 +831,7 @@ public void Validate_AutoMapper_NullDataType() { // Arrange string mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"$.AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null}]}}"; + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"$.AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null}]}}"; string inputJson = "{\"Name\": \"22\",\"AllowEmail\": false,\"CrmId\": null,\"LeadScore\":100}"; @@ -843,9 +843,9 @@ public void Validate_AutoMapper_NullDataType() LeadRecord lead = (LeadRecord)mapper.Transform(inputJson); Assert.IsTrue(lead.LeadScore == 100); } - catch (Exception) + catch (Exception ex) { - Assert.Fail(); + Assert.Fail(ex.Message); } } diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj b/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj new file mode 100644 index 0000000..de0a553 --- /dev/null +++ b/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + net6.0 + enable + enable + false + + + From 8bb4456cc5b3cf4386f2d09c631d3fa893235fdc Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:10:17 +0100 Subject: [PATCH 06/37] - deleted Framework projects -- use .NET Core --- .Net Framework/Json2JsonMapper.sln | 38 ---- .../src/AutoMapper/JsonToJsonMapper.csproj | 119 ----------- .../JsonToJsonMapper.Tests.csproj | 197 ------------------ 3 files changed, 354 deletions(-) delete mode 100644 .Net Framework/Json2JsonMapper.sln delete mode 100644 .Net Framework/src/AutoMapper/JsonToJsonMapper.csproj delete mode 100644 .Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj diff --git a/.Net Framework/Json2JsonMapper.sln b/.Net Framework/Json2JsonMapper.sln deleted file mode 100644 index 543c3bc..0000000 --- a/.Net Framework/Json2JsonMapper.sln +++ /dev/null @@ -1,38 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31112.23 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonToJsonMapper", "src\AutoMapper\JsonToJsonMapper.csproj", "{27E353D4-B88D-49AF-A072-7C19A47A2465}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3B55A638-964C-4F13-865A-24C6E1CD0937}" - ProjectSection(SolutionItems) = preProject - .gitignore = .gitignore - JsonToJsonMapper.md = JsonToJsonMapper.md - JsonToJsonMapper.png = JsonToJsonMapper.png - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonToJsonMapper.Tests", "test\JsonToJsonMapper.Tests\JsonToJsonMapper.Tests.csproj", "{CF0531C0-8948-4506-BB42-BAF457D47508}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {27E353D4-B88D-49AF-A072-7C19A47A2465}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {27E353D4-B88D-49AF-A072-7C19A47A2465}.Debug|Any CPU.Build.0 = Debug|Any CPU - {27E353D4-B88D-49AF-A072-7C19A47A2465}.Release|Any CPU.ActiveCfg = Release|Any CPU - {27E353D4-B88D-49AF-A072-7C19A47A2465}.Release|Any CPU.Build.0 = Release|Any CPU - {CF0531C0-8948-4506-BB42-BAF457D47508}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CF0531C0-8948-4506-BB42-BAF457D47508}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CF0531C0-8948-4506-BB42-BAF457D47508}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CF0531C0-8948-4506-BB42-BAF457D47508}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1E6565CC-9567-443D-A2EC-F63B555FA4F7} - EndGlobalSection -EndGlobal diff --git a/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj b/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj deleted file mode 100644 index 2689109..0000000 --- a/.Net Framework/src/AutoMapper/JsonToJsonMapper.csproj +++ /dev/null @@ -1,119 +0,0 @@ - - - - - https://github.com/microsoft/dynamic-odata/blob/main/CHANGELOG.md - https://github.com/microsoft/JsonToJsonMapper - https://github.com/microsoft/JsonToJsonMapper - Copyright (c) Microsoft Corporation. - Karan Singh, Akash Khandelwal - Microsoft Corporation - JSON Mapper, JSonToJSon, AutoMapper - - - LICENSE - 1.0.0-preview - JSonToJSonMapper works on JSON format to exchange information between systems. MIP. It enables transformation of data from one canonical schema to another and allows integration of different SaaS applications through orchestration. - - - Debug - AnyCPU - {27E353D4-B88D-49AF-A072-7C19A47A2465} - Library - Properties - JsonToJsonMapper - JsonToJsonMapper - v4.6 - 512 - - 1.0.0-preview - - - 1.0.0-preview - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - v4.8 - - - 1.0.0-preview - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - true - v4.6 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - 2.8.2 - - - 4.3.0 - - - 13.0.2-beta2 - - - 4.3.0 - - - 4.3.0 - - - - - - - \ No newline at end of file diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj b/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj deleted file mode 100644 index 45ac365..0000000 --- a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Tests.csproj +++ /dev/null @@ -1,197 +0,0 @@ - - - - Debug - AnyCPU - {CF0531C0-8948-4506-BB42-BAF457D47508} - Library - Properties - JsonToJsonMapper.Tests - JsonToJsonMapper.Tests - v4.8 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\packages\Microsoft.CodeAnalysis.Common.2.8.2\lib\netstandard1.3\Microsoft.CodeAnalysis.dll - - - ..\..\packages\Microsoft.CodeAnalysis.CSharp.2.8.2\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll - - - ..\..\packages\Microsoft.CodeAnalysis.CSharp.Scripting.2.8.2\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Scripting.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Scripting.Common.2.8.2\lib\netstandard1.3\Microsoft.CodeAnalysis.Scripting.dll - - - - ..\..\packages\Newtonsoft.Json.13.0.2-beta2\lib\net45\Newtonsoft.Json.dll - - - - ..\..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll - - - ..\..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll - - - - ..\..\packages\System.Console.4.3.0\lib\net46\System.Console.dll - - - ..\..\packages\System.Diagnostics.FileVersionInfo.4.3.0\lib\net46\System.Diagnostics.FileVersionInfo.dll - - - ..\..\packages\System.Diagnostics.StackTrace.4.3.0\lib\net46\System.Diagnostics.StackTrace.dll - - - ..\..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll - - - ..\..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll - - - ..\..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll - - - - ..\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll - - - ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net46\System.Security.Cryptography.Algorithms.dll - - - ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - - - ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - - - ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net46\System.Security.Cryptography.X509Certificates.dll - - - ..\..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll - - - ..\..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll - - - ..\..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll - - - - - ..\..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll - - - ..\..\packages\System.Xml.XmlDocument.4.3.0\lib\net46\System.Xml.XmlDocument.dll - - - ..\..\packages\System.Xml.XPath.4.3.0\lib\net46\System.Xml.XPath.dll - - - ..\..\packages\System.Xml.XPath.XDocument.4.3.0\lib\net46\System.Xml.XPath.XDocument.dll - - - - - - - - - - - - - - - - - - - - - - {27e353d4-b88d-49af-a072-7c19a47a2465} - JsonToJsonMapper - - - - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - \ No newline at end of file From d4edc79bac423983d1e5301b1477f5f5f0c83ed8 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:13:43 +0100 Subject: [PATCH 07/37] - moved --- ...pper.Core.sln => JsonToJsonMapper.Core.sln | 0 .../JsonToJsonMapper.samples/App.config | 0 .../JsonToJsonMapper.samples.csproj | 0 .../JsonToJsonMapper.samples.sln | 0 .../OneToOneMapping/OneToOneMappingRules.json | 0 .../OneToOneMapping/Transformation_Input.json | 0 .../Jsons/RangeMapping/RangeMappingRules.json | 0 .../RangeMapping/Transformation_Input.json | 0 .../Jsons/ToUpper/Transformation_Input.json | 0 .../Jsons/ToUpper/Upper_Mapping.json | 0 .../JsonToJsonMapper.samples/Program.cs | 0 .../Properties/AssemblyInfo.cs | 0 {.Net Framework/samples => samples}/SAMPLE.md | 30 +++++++++--------- .../src => src}/AutoMapper/AutoMapper.cs | 0 .../AutoMapper/AutoMapperConfig.cs | 0 .../src => src}/AutoMapper/ConvertValue.cs | 0 .../AutoMapper/ExtensionMethods.cs | 0 .../AutoMapper/Handlers/FunctionHandler.cs | 0 .../Handlers/ITransformationHandler.cs | 0 .../Handlers/RoslynScriptHandler.cs | 0 .../Handlers/TransformationFactory.cs | 0 .../AutoMapper/Handlers/TransposeHandler.cs | 0 .../Handlers/TypeConverterHandler.cs | 0 .../Handlers/ValueMappingHandler.cs | 0 .../AutoMapper/JsonToJsonMapper.Core.csproj | 0 .../AutoMapper/JsonToJsonMapper.nuspec | 0 .../src => src}/AutoMapper/JsonTransform.cs | 0 .../src => src}/AutoMapper/MappingRule.cs | 0 .../AutoMapper/Properties/AssemblyInfo.cs | 0 .../src => src}/AutoMapper/Reference.cs | 0 .../src => src}/AutoMapper/Rule.cs | 0 .../AutoMapper/ScriptDefinitions.cs | 0 .../src => src}/AutoMapper/ScriptHost.cs | 0 .../src => src}/AutoMapper/Transform.cs | 0 .../src => src}/AutoMapper/app.config | 0 .../src => src}/AutoMapper/nuget.exe | Bin .../JsonToJsonMapper.Tests/AutoMapperTest.cs | 0 .../JsonToJsonMapper.Core.Tests.csproj | 0 .../OneToOneMapping/OneToOneMappingRules.json | 0 .../OneToOneMapping/Transformation_Input.json | 0 .../Jsons/RangeMapping/RangeMappingRules.json | 0 .../RangeMapping/Transformation_Input.json | 0 .../Jsons/ToUpper/Transformation_Input.json | 0 .../Jsons/ToUpper/Upper_Mapping.json | 0 .../JsonToJsonMapper.Tests/LeadRecord.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../TestRunSettings.runsettings | 0 .../JsonToJsonMapper.Tests/app.config | 0 .../JsonToJsonMapper.Tests/packages.config | 0 49 files changed, 15 insertions(+), 15 deletions(-) rename .Net Framework/JsonToJsonMapper.Core.sln => JsonToJsonMapper.Core.sln (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/App.config (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/JsonToJsonMapper.samples.csproj (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/JsonToJsonMapper.samples.sln (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/Jsons/OneToOneMapping/OneToOneMappingRules.json (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/Jsons/OneToOneMapping/Transformation_Input.json (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/Jsons/RangeMapping/RangeMappingRules.json (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/Jsons/RangeMapping/Transformation_Input.json (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/Jsons/ToUpper/Transformation_Input.json (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/Jsons/ToUpper/Upper_Mapping.json (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/Program.cs (100%) rename {.Net Framework/samples => samples}/JsonToJsonMapper.samples/Properties/AssemblyInfo.cs (100%) rename {.Net Framework/samples => samples}/SAMPLE.md (96%) rename {.Net Framework/src => src}/AutoMapper/AutoMapper.cs (100%) rename {.Net Framework/src => src}/AutoMapper/AutoMapperConfig.cs (100%) rename {.Net Framework/src => src}/AutoMapper/ConvertValue.cs (100%) rename {.Net Framework/src => src}/AutoMapper/ExtensionMethods.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Handlers/FunctionHandler.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Handlers/ITransformationHandler.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Handlers/RoslynScriptHandler.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Handlers/TransformationFactory.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Handlers/TransposeHandler.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Handlers/TypeConverterHandler.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Handlers/ValueMappingHandler.cs (100%) rename {.Net Framework/src => src}/AutoMapper/JsonToJsonMapper.Core.csproj (100%) rename {.Net Framework/src => src}/AutoMapper/JsonToJsonMapper.nuspec (100%) rename {.Net Framework/src => src}/AutoMapper/JsonTransform.cs (100%) rename {.Net Framework/src => src}/AutoMapper/MappingRule.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Properties/AssemblyInfo.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Reference.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Rule.cs (100%) rename {.Net Framework/src => src}/AutoMapper/ScriptDefinitions.cs (100%) rename {.Net Framework/src => src}/AutoMapper/ScriptHost.cs (100%) rename {.Net Framework/src => src}/AutoMapper/Transform.cs (100%) rename {.Net Framework/src => src}/AutoMapper/app.config (100%) rename {.Net Framework/src => src}/AutoMapper/nuget.exe (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/AutoMapperTest.cs (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/OneToOneMappingRules.json (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/Transformation_Input.json (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/Jsons/RangeMapping/RangeMappingRules.json (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/Jsons/RangeMapping/Transformation_Input.json (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/Jsons/ToUpper/Transformation_Input.json (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/Jsons/ToUpper/Upper_Mapping.json (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/LeadRecord.cs (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/Properties/AssemblyInfo.cs (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/TestRunSettings.runsettings (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/app.config (100%) rename {.Net Framework/test => test}/JsonToJsonMapper.Tests/packages.config (100%) diff --git a/.Net Framework/JsonToJsonMapper.Core.sln b/JsonToJsonMapper.Core.sln similarity index 100% rename from .Net Framework/JsonToJsonMapper.Core.sln rename to JsonToJsonMapper.Core.sln diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/App.config b/samples/JsonToJsonMapper.samples/App.config similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/App.config rename to samples/JsonToJsonMapper.samples/App.config diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/JsonToJsonMapper.samples.csproj b/samples/JsonToJsonMapper.samples/JsonToJsonMapper.samples.csproj similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/JsonToJsonMapper.samples.csproj rename to samples/JsonToJsonMapper.samples/JsonToJsonMapper.samples.csproj diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/JsonToJsonMapper.samples.sln b/samples/JsonToJsonMapper.samples/JsonToJsonMapper.samples.sln similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/JsonToJsonMapper.samples.sln rename to samples/JsonToJsonMapper.samples/JsonToJsonMapper.samples.sln diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/Jsons/OneToOneMapping/OneToOneMappingRules.json b/samples/JsonToJsonMapper.samples/Jsons/OneToOneMapping/OneToOneMappingRules.json similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/Jsons/OneToOneMapping/OneToOneMappingRules.json rename to samples/JsonToJsonMapper.samples/Jsons/OneToOneMapping/OneToOneMappingRules.json diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/Jsons/OneToOneMapping/Transformation_Input.json b/samples/JsonToJsonMapper.samples/Jsons/OneToOneMapping/Transformation_Input.json similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/Jsons/OneToOneMapping/Transformation_Input.json rename to samples/JsonToJsonMapper.samples/Jsons/OneToOneMapping/Transformation_Input.json diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/Jsons/RangeMapping/RangeMappingRules.json b/samples/JsonToJsonMapper.samples/Jsons/RangeMapping/RangeMappingRules.json similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/Jsons/RangeMapping/RangeMappingRules.json rename to samples/JsonToJsonMapper.samples/Jsons/RangeMapping/RangeMappingRules.json diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/Jsons/RangeMapping/Transformation_Input.json b/samples/JsonToJsonMapper.samples/Jsons/RangeMapping/Transformation_Input.json similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/Jsons/RangeMapping/Transformation_Input.json rename to samples/JsonToJsonMapper.samples/Jsons/RangeMapping/Transformation_Input.json diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/Jsons/ToUpper/Transformation_Input.json b/samples/JsonToJsonMapper.samples/Jsons/ToUpper/Transformation_Input.json similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/Jsons/ToUpper/Transformation_Input.json rename to samples/JsonToJsonMapper.samples/Jsons/ToUpper/Transformation_Input.json diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/Jsons/ToUpper/Upper_Mapping.json b/samples/JsonToJsonMapper.samples/Jsons/ToUpper/Upper_Mapping.json similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/Jsons/ToUpper/Upper_Mapping.json rename to samples/JsonToJsonMapper.samples/Jsons/ToUpper/Upper_Mapping.json diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/Program.cs b/samples/JsonToJsonMapper.samples/Program.cs similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/Program.cs rename to samples/JsonToJsonMapper.samples/Program.cs diff --git a/.Net Framework/samples/JsonToJsonMapper.samples/Properties/AssemblyInfo.cs b/samples/JsonToJsonMapper.samples/Properties/AssemblyInfo.cs similarity index 100% rename from .Net Framework/samples/JsonToJsonMapper.samples/Properties/AssemblyInfo.cs rename to samples/JsonToJsonMapper.samples/Properties/AssemblyInfo.cs diff --git a/.Net Framework/samples/SAMPLE.md b/samples/SAMPLE.md similarity index 96% rename from .Net Framework/samples/SAMPLE.md rename to samples/SAMPLE.md index ff6aa27..cfb7bf6 100644 --- a/.Net Framework/samples/SAMPLE.md +++ b/samples/SAMPLE.md @@ -1,15 +1,15 @@ - -# How to run Samples - -1. Open Program.cs file and you will find below Sample methods. -2. Uncomment any of the method in the main to test the features of JsonToJsonMapper - - - Complex2ComplexTransformationSample(); - - Complex2FlatTransformationSample(); - - RoslynSample(); - - TransformToUpperCaseParent(); - - TransformToLowerCase(); - - OneToOneMappingTest(); - - RangeMappingTest(); - - + +# How to run Samples + +1. Open Program.cs file and you will find below Sample methods. +2. Uncomment any of the method in the main to test the features of JsonToJsonMapper + + - Complex2ComplexTransformationSample(); + - Complex2FlatTransformationSample(); + - RoslynSample(); + - TransformToUpperCaseParent(); + - TransformToLowerCase(); + - OneToOneMappingTest(); + - RangeMappingTest(); + + diff --git a/.Net Framework/src/AutoMapper/AutoMapper.cs b/src/AutoMapper/AutoMapper.cs similarity index 100% rename from .Net Framework/src/AutoMapper/AutoMapper.cs rename to src/AutoMapper/AutoMapper.cs diff --git a/.Net Framework/src/AutoMapper/AutoMapperConfig.cs b/src/AutoMapper/AutoMapperConfig.cs similarity index 100% rename from .Net Framework/src/AutoMapper/AutoMapperConfig.cs rename to src/AutoMapper/AutoMapperConfig.cs diff --git a/.Net Framework/src/AutoMapper/ConvertValue.cs b/src/AutoMapper/ConvertValue.cs similarity index 100% rename from .Net Framework/src/AutoMapper/ConvertValue.cs rename to src/AutoMapper/ConvertValue.cs diff --git a/.Net Framework/src/AutoMapper/ExtensionMethods.cs b/src/AutoMapper/ExtensionMethods.cs similarity index 100% rename from .Net Framework/src/AutoMapper/ExtensionMethods.cs rename to src/AutoMapper/ExtensionMethods.cs diff --git a/.Net Framework/src/AutoMapper/Handlers/FunctionHandler.cs b/src/AutoMapper/Handlers/FunctionHandler.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Handlers/FunctionHandler.cs rename to src/AutoMapper/Handlers/FunctionHandler.cs diff --git a/.Net Framework/src/AutoMapper/Handlers/ITransformationHandler.cs b/src/AutoMapper/Handlers/ITransformationHandler.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Handlers/ITransformationHandler.cs rename to src/AutoMapper/Handlers/ITransformationHandler.cs diff --git a/.Net Framework/src/AutoMapper/Handlers/RoslynScriptHandler.cs b/src/AutoMapper/Handlers/RoslynScriptHandler.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Handlers/RoslynScriptHandler.cs rename to src/AutoMapper/Handlers/RoslynScriptHandler.cs diff --git a/.Net Framework/src/AutoMapper/Handlers/TransformationFactory.cs b/src/AutoMapper/Handlers/TransformationFactory.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Handlers/TransformationFactory.cs rename to src/AutoMapper/Handlers/TransformationFactory.cs diff --git a/.Net Framework/src/AutoMapper/Handlers/TransposeHandler.cs b/src/AutoMapper/Handlers/TransposeHandler.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Handlers/TransposeHandler.cs rename to src/AutoMapper/Handlers/TransposeHandler.cs diff --git a/.Net Framework/src/AutoMapper/Handlers/TypeConverterHandler.cs b/src/AutoMapper/Handlers/TypeConverterHandler.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Handlers/TypeConverterHandler.cs rename to src/AutoMapper/Handlers/TypeConverterHandler.cs diff --git a/.Net Framework/src/AutoMapper/Handlers/ValueMappingHandler.cs b/src/AutoMapper/Handlers/ValueMappingHandler.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Handlers/ValueMappingHandler.cs rename to src/AutoMapper/Handlers/ValueMappingHandler.cs diff --git a/.Net Framework/src/AutoMapper/JsonToJsonMapper.Core.csproj b/src/AutoMapper/JsonToJsonMapper.Core.csproj similarity index 100% rename from .Net Framework/src/AutoMapper/JsonToJsonMapper.Core.csproj rename to src/AutoMapper/JsonToJsonMapper.Core.csproj diff --git a/.Net Framework/src/AutoMapper/JsonToJsonMapper.nuspec b/src/AutoMapper/JsonToJsonMapper.nuspec similarity index 100% rename from .Net Framework/src/AutoMapper/JsonToJsonMapper.nuspec rename to src/AutoMapper/JsonToJsonMapper.nuspec diff --git a/.Net Framework/src/AutoMapper/JsonTransform.cs b/src/AutoMapper/JsonTransform.cs similarity index 100% rename from .Net Framework/src/AutoMapper/JsonTransform.cs rename to src/AutoMapper/JsonTransform.cs diff --git a/.Net Framework/src/AutoMapper/MappingRule.cs b/src/AutoMapper/MappingRule.cs similarity index 100% rename from .Net Framework/src/AutoMapper/MappingRule.cs rename to src/AutoMapper/MappingRule.cs diff --git a/.Net Framework/src/AutoMapper/Properties/AssemblyInfo.cs b/src/AutoMapper/Properties/AssemblyInfo.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Properties/AssemblyInfo.cs rename to src/AutoMapper/Properties/AssemblyInfo.cs diff --git a/.Net Framework/src/AutoMapper/Reference.cs b/src/AutoMapper/Reference.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Reference.cs rename to src/AutoMapper/Reference.cs diff --git a/.Net Framework/src/AutoMapper/Rule.cs b/src/AutoMapper/Rule.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Rule.cs rename to src/AutoMapper/Rule.cs diff --git a/.Net Framework/src/AutoMapper/ScriptDefinitions.cs b/src/AutoMapper/ScriptDefinitions.cs similarity index 100% rename from .Net Framework/src/AutoMapper/ScriptDefinitions.cs rename to src/AutoMapper/ScriptDefinitions.cs diff --git a/.Net Framework/src/AutoMapper/ScriptHost.cs b/src/AutoMapper/ScriptHost.cs similarity index 100% rename from .Net Framework/src/AutoMapper/ScriptHost.cs rename to src/AutoMapper/ScriptHost.cs diff --git a/.Net Framework/src/AutoMapper/Transform.cs b/src/AutoMapper/Transform.cs similarity index 100% rename from .Net Framework/src/AutoMapper/Transform.cs rename to src/AutoMapper/Transform.cs diff --git a/.Net Framework/src/AutoMapper/app.config b/src/AutoMapper/app.config similarity index 100% rename from .Net Framework/src/AutoMapper/app.config rename to src/AutoMapper/app.config diff --git a/.Net Framework/src/AutoMapper/nuget.exe b/src/AutoMapper/nuget.exe similarity index 100% rename from .Net Framework/src/AutoMapper/nuget.exe rename to src/AutoMapper/nuget.exe diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/AutoMapperTest.cs rename to test/JsonToJsonMapper.Tests/AutoMapperTest.cs diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj b/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj rename to test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/OneToOneMappingRules.json b/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/OneToOneMappingRules.json similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/OneToOneMappingRules.json rename to test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/OneToOneMappingRules.json diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/Transformation_Input.json b/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/Transformation_Input.json similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/Transformation_Input.json rename to test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/Transformation_Input.json diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/RangeMappingRules.json b/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/RangeMappingRules.json similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/RangeMappingRules.json rename to test/JsonToJsonMapper.Tests/Jsons/RangeMapping/RangeMappingRules.json diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/Transformation_Input.json b/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/Transformation_Input.json similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/Jsons/RangeMapping/Transformation_Input.json rename to test/JsonToJsonMapper.Tests/Jsons/RangeMapping/Transformation_Input.json diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Transformation_Input.json b/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Transformation_Input.json similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Transformation_Input.json rename to test/JsonToJsonMapper.Tests/Jsons/ToUpper/Transformation_Input.json diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Upper_Mapping.json b/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Upper_Mapping.json similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/Jsons/ToUpper/Upper_Mapping.json rename to test/JsonToJsonMapper.Tests/Jsons/ToUpper/Upper_Mapping.json diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/LeadRecord.cs b/test/JsonToJsonMapper.Tests/LeadRecord.cs similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/LeadRecord.cs rename to test/JsonToJsonMapper.Tests/LeadRecord.cs diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/Properties/AssemblyInfo.cs b/test/JsonToJsonMapper.Tests/Properties/AssemblyInfo.cs similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/Properties/AssemblyInfo.cs rename to test/JsonToJsonMapper.Tests/Properties/AssemblyInfo.cs diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/TestRunSettings.runsettings b/test/JsonToJsonMapper.Tests/TestRunSettings.runsettings similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/TestRunSettings.runsettings rename to test/JsonToJsonMapper.Tests/TestRunSettings.runsettings diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/app.config b/test/JsonToJsonMapper.Tests/app.config similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/app.config rename to test/JsonToJsonMapper.Tests/app.config diff --git a/.Net Framework/test/JsonToJsonMapper.Tests/packages.config b/test/JsonToJsonMapper.Tests/packages.config similarity index 100% rename from .Net Framework/test/JsonToJsonMapper.Tests/packages.config rename to test/JsonToJsonMapper.Tests/packages.config From 29f48de527bd439c90e221daef7a38e7ff0f4a4a Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:16:21 +0100 Subject: [PATCH 08/37] - moved --- JsonToJsonMapper.Core.sln | 2 +- src/{AutoMapper => JsonToJsonMapper}/AutoMapper.cs | 0 .../AutoMapperConfig.cs | 0 .../ConvertValue.cs | 0 .../ExtensionMethods.cs | 0 .../Handlers/FunctionHandler.cs | 0 .../Handlers/ITransformationHandler.cs | 0 .../Handlers/RoslynScriptHandler.cs | 0 .../Handlers/TransformationFactory.cs | 0 .../Handlers/TransposeHandler.cs | 0 .../Handlers/TypeConverterHandler.cs | 0 .../Handlers/ValueMappingHandler.cs | 0 .../JsonToJsonMapper.Core.csproj | 0 .../JsonToJsonMapper.nuspec | 0 .../JsonTransform.cs | 0 src/{AutoMapper => JsonToJsonMapper}/MappingRule.cs | 0 .../Properties/AssemblyInfo.cs | 0 src/{AutoMapper => JsonToJsonMapper}/Reference.cs | 0 src/{AutoMapper => JsonToJsonMapper}/Rule.cs | 0 .../ScriptDefinitions.cs | 0 src/{AutoMapper => JsonToJsonMapper}/ScriptHost.cs | 0 src/{AutoMapper => JsonToJsonMapper}/Transform.cs | 0 src/{AutoMapper => JsonToJsonMapper}/app.config | 0 src/{AutoMapper => JsonToJsonMapper}/nuget.exe | Bin .../JsonToJsonMapper.Core.Tests.csproj | 2 +- 25 files changed, 2 insertions(+), 2 deletions(-) rename src/{AutoMapper => JsonToJsonMapper}/AutoMapper.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/AutoMapperConfig.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/ConvertValue.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/ExtensionMethods.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Handlers/FunctionHandler.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Handlers/ITransformationHandler.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Handlers/RoslynScriptHandler.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Handlers/TransformationFactory.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Handlers/TransposeHandler.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Handlers/TypeConverterHandler.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Handlers/ValueMappingHandler.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/JsonToJsonMapper.Core.csproj (100%) rename src/{AutoMapper => JsonToJsonMapper}/JsonToJsonMapper.nuspec (100%) rename src/{AutoMapper => JsonToJsonMapper}/JsonTransform.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/MappingRule.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Properties/AssemblyInfo.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Reference.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Rule.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/ScriptDefinitions.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/ScriptHost.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/Transform.cs (100%) rename src/{AutoMapper => JsonToJsonMapper}/app.config (100%) rename src/{AutoMapper => JsonToJsonMapper}/nuget.exe (100%) diff --git a/JsonToJsonMapper.Core.sln b/JsonToJsonMapper.Core.sln index a7d575c..8afae2a 100644 --- a/JsonToJsonMapper.Core.sln +++ b/JsonToJsonMapper.Core.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9181289D-E1A0-4294-86C3-000A3DB40611}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonToJsonMapper.Core", "src\AutoMapper\JsonToJsonMapper.Core.csproj", "{4620C9BA-6A5E-4B38-A3E3-6394AA94D06C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonToJsonMapper.Core", "src\JsonToJsonMapper\JsonToJsonMapper.Core.csproj", "{4620C9BA-6A5E-4B38-A3E3-6394AA94D06C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{5925B6A8-817B-4767-AFF8-12A593C7A3AB}" EndProject diff --git a/src/AutoMapper/AutoMapper.cs b/src/JsonToJsonMapper/AutoMapper.cs similarity index 100% rename from src/AutoMapper/AutoMapper.cs rename to src/JsonToJsonMapper/AutoMapper.cs diff --git a/src/AutoMapper/AutoMapperConfig.cs b/src/JsonToJsonMapper/AutoMapperConfig.cs similarity index 100% rename from src/AutoMapper/AutoMapperConfig.cs rename to src/JsonToJsonMapper/AutoMapperConfig.cs diff --git a/src/AutoMapper/ConvertValue.cs b/src/JsonToJsonMapper/ConvertValue.cs similarity index 100% rename from src/AutoMapper/ConvertValue.cs rename to src/JsonToJsonMapper/ConvertValue.cs diff --git a/src/AutoMapper/ExtensionMethods.cs b/src/JsonToJsonMapper/ExtensionMethods.cs similarity index 100% rename from src/AutoMapper/ExtensionMethods.cs rename to src/JsonToJsonMapper/ExtensionMethods.cs diff --git a/src/AutoMapper/Handlers/FunctionHandler.cs b/src/JsonToJsonMapper/Handlers/FunctionHandler.cs similarity index 100% rename from src/AutoMapper/Handlers/FunctionHandler.cs rename to src/JsonToJsonMapper/Handlers/FunctionHandler.cs diff --git a/src/AutoMapper/Handlers/ITransformationHandler.cs b/src/JsonToJsonMapper/Handlers/ITransformationHandler.cs similarity index 100% rename from src/AutoMapper/Handlers/ITransformationHandler.cs rename to src/JsonToJsonMapper/Handlers/ITransformationHandler.cs diff --git a/src/AutoMapper/Handlers/RoslynScriptHandler.cs b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs similarity index 100% rename from src/AutoMapper/Handlers/RoslynScriptHandler.cs rename to src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs diff --git a/src/AutoMapper/Handlers/TransformationFactory.cs b/src/JsonToJsonMapper/Handlers/TransformationFactory.cs similarity index 100% rename from src/AutoMapper/Handlers/TransformationFactory.cs rename to src/JsonToJsonMapper/Handlers/TransformationFactory.cs diff --git a/src/AutoMapper/Handlers/TransposeHandler.cs b/src/JsonToJsonMapper/Handlers/TransposeHandler.cs similarity index 100% rename from src/AutoMapper/Handlers/TransposeHandler.cs rename to src/JsonToJsonMapper/Handlers/TransposeHandler.cs diff --git a/src/AutoMapper/Handlers/TypeConverterHandler.cs b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs similarity index 100% rename from src/AutoMapper/Handlers/TypeConverterHandler.cs rename to src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs diff --git a/src/AutoMapper/Handlers/ValueMappingHandler.cs b/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs similarity index 100% rename from src/AutoMapper/Handlers/ValueMappingHandler.cs rename to src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs diff --git a/src/AutoMapper/JsonToJsonMapper.Core.csproj b/src/JsonToJsonMapper/JsonToJsonMapper.Core.csproj similarity index 100% rename from src/AutoMapper/JsonToJsonMapper.Core.csproj rename to src/JsonToJsonMapper/JsonToJsonMapper.Core.csproj diff --git a/src/AutoMapper/JsonToJsonMapper.nuspec b/src/JsonToJsonMapper/JsonToJsonMapper.nuspec similarity index 100% rename from src/AutoMapper/JsonToJsonMapper.nuspec rename to src/JsonToJsonMapper/JsonToJsonMapper.nuspec diff --git a/src/AutoMapper/JsonTransform.cs b/src/JsonToJsonMapper/JsonTransform.cs similarity index 100% rename from src/AutoMapper/JsonTransform.cs rename to src/JsonToJsonMapper/JsonTransform.cs diff --git a/src/AutoMapper/MappingRule.cs b/src/JsonToJsonMapper/MappingRule.cs similarity index 100% rename from src/AutoMapper/MappingRule.cs rename to src/JsonToJsonMapper/MappingRule.cs diff --git a/src/AutoMapper/Properties/AssemblyInfo.cs b/src/JsonToJsonMapper/Properties/AssemblyInfo.cs similarity index 100% rename from src/AutoMapper/Properties/AssemblyInfo.cs rename to src/JsonToJsonMapper/Properties/AssemblyInfo.cs diff --git a/src/AutoMapper/Reference.cs b/src/JsonToJsonMapper/Reference.cs similarity index 100% rename from src/AutoMapper/Reference.cs rename to src/JsonToJsonMapper/Reference.cs diff --git a/src/AutoMapper/Rule.cs b/src/JsonToJsonMapper/Rule.cs similarity index 100% rename from src/AutoMapper/Rule.cs rename to src/JsonToJsonMapper/Rule.cs diff --git a/src/AutoMapper/ScriptDefinitions.cs b/src/JsonToJsonMapper/ScriptDefinitions.cs similarity index 100% rename from src/AutoMapper/ScriptDefinitions.cs rename to src/JsonToJsonMapper/ScriptDefinitions.cs diff --git a/src/AutoMapper/ScriptHost.cs b/src/JsonToJsonMapper/ScriptHost.cs similarity index 100% rename from src/AutoMapper/ScriptHost.cs rename to src/JsonToJsonMapper/ScriptHost.cs diff --git a/src/AutoMapper/Transform.cs b/src/JsonToJsonMapper/Transform.cs similarity index 100% rename from src/AutoMapper/Transform.cs rename to src/JsonToJsonMapper/Transform.cs diff --git a/src/AutoMapper/app.config b/src/JsonToJsonMapper/app.config similarity index 100% rename from src/AutoMapper/app.config rename to src/JsonToJsonMapper/app.config diff --git a/src/AutoMapper/nuget.exe b/src/JsonToJsonMapper/nuget.exe similarity index 100% rename from src/AutoMapper/nuget.exe rename to src/JsonToJsonMapper/nuget.exe diff --git a/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj b/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj index de0a553..ba17127 100644 --- a/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj +++ b/test/JsonToJsonMapper.Tests/JsonToJsonMapper.Core.Tests.csproj @@ -1,7 +1,7 @@ - + From 709eab5ba329e75bfe7335fc2eeab37df2cb47b2 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:22:05 +0100 Subject: [PATCH 09/37] - reSharper guided code cleanup --- src/JsonToJsonMapper/AutoMapper.cs | 22 +- src/JsonToJsonMapper/ExtensionMethods.cs | 2 +- .../Handlers/FunctionHandler.cs | 32 +- .../Handlers/RoslynScriptHandler.cs | 6 +- .../Handlers/TransposeHandler.cs | 12 +- .../Handlers/TypeConverterHandler.cs | 34 +- test/JsonToJsonMapper.Tests/AutoMapperTest.cs | 346 +++++++++--------- 7 files changed, 227 insertions(+), 227 deletions(-) diff --git a/src/JsonToJsonMapper/AutoMapper.cs b/src/JsonToJsonMapper/AutoMapper.cs index d2ad749..4acc79b 100644 --- a/src/JsonToJsonMapper/AutoMapper.cs +++ b/src/JsonToJsonMapper/AutoMapper.cs @@ -36,7 +36,7 @@ public AutoMapper(string autoMapperConfig) if (script.Reference != null) { // With assembly import - ScriptOptions options = ScriptOptions.Default.AddReferences(script.Reference.Assembly).WithImports(script.Reference.NameSpace); + var options = ScriptOptions.Default.AddReferences(script.Reference.Assembly).WithImports(script.Reference.NameSpace); scripts.Add(script.Name, CSharpScript.Create(script.Code, options, globalsType: typeof(ScriptHost))); } else @@ -82,7 +82,7 @@ public object Transform(JObject jObj) /// private object Execute(JObject jsonObject, MappingRule mapping) { - Type type = Type.GetType(mapping.DestinationType, true); + var type = Type.GetType(mapping.DestinationType, true); var entity = Activator.CreateInstance(type); // Set the value for each item in destinationType @@ -169,7 +169,7 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) { // Handle Jvalue string valueType; - string destinationValue = rule.DestinationColumn.StartsWith("$") ? jsonObject.SelectToken(rule.DestinationColumn).ToString() : rule.DestinationColumn; + var destinationValue = rule.DestinationColumn.StartsWith("$") ? jsonObject.SelectToken(rule.DestinationColumn).ToString() : rule.DestinationColumn; var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); if (rule.DataType == null) @@ -208,14 +208,14 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ignoreNullVaue) { var tokens = jsonObject.SelectTokens(mapping.Node); - JArray array = new JArray(); - bool hasToken = false; + var array = new JArray(); + var hasToken = false; foreach (var item in tokens) { hasToken = true; if (string.Equals(item.GetType().Name, "jarray", StringComparison.OrdinalIgnoreCase)) { - JArray itemJArray = (JArray)item; + var itemJArray = (JArray)item; if (itemJArray.Any()) { foreach (var a in itemJArray) @@ -258,16 +258,16 @@ private string GetValue(JObject jsonObject, string key, Transform transform, out { if (!key.ToUpperInvariant().Contains("[{PARENT}]")) { - JToken token = jsonObject.SelectToken(key); + var token = jsonObject.SelectToken(key); if (token != null && token.Value() != null) { valueType = token.Type.ToString(); - string tokenValue = token.ToString(); + var tokenValue = token.ToString(); if (token.GetType().Name.Equals("JVALUE", StringComparison.OrdinalIgnoreCase) && token.Type == JTokenType.Null) value = null; else if (valueType.Equals("Date", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) { - string val = (token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries).Length > 1) ? token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries)[1] : tokenValue; + var val = (token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries).Length > 1) ? token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries)[1] : tokenValue; value = val.Replace("\"", "").Trim(); } else if (valueType.Equals("Boolean", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) @@ -286,12 +286,12 @@ private string GetValue(JObject jsonObject, string key, Transform transform, out { JContainer json; json = jsonObject.Parent; - for (int i = 2; i < key.Split(new string[] { "[{parent}]" }, StringSplitOptions.None).Length; i++) + for (var i = 2; i < key.Split(new string[] { "[{parent}]" }, StringSplitOptions.None).Length; i++) { json = json.Parent; } - JToken valueToken = json.SelectToken(key.Replace("[{parent}].", "").Replace("$.", "")); + var valueToken = json.SelectToken(key.Replace("[{parent}].", "").Replace("$.", "")); if (valueToken != null) { valueType = valueToken.Type.ToString(); diff --git a/src/JsonToJsonMapper/ExtensionMethods.cs b/src/JsonToJsonMapper/ExtensionMethods.cs index e455bf7..c9e4853 100644 --- a/src/JsonToJsonMapper/ExtensionMethods.cs +++ b/src/JsonToJsonMapper/ExtensionMethods.cs @@ -6,7 +6,7 @@ public static class ExtensionMethods { public static void AddRange(this Dictionary dictA, Dictionary dictB) { - foreach (KeyValuePair pair in dictB) + foreach (var pair in dictB) { dictA[pair.Key] = pair.Value; } diff --git a/src/JsonToJsonMapper/Handlers/FunctionHandler.cs b/src/JsonToJsonMapper/Handlers/FunctionHandler.cs index ab80e2c..6437f1d 100644 --- a/src/JsonToJsonMapper/Handlers/FunctionHandler.cs +++ b/src/JsonToJsonMapper/Handlers/FunctionHandler.cs @@ -17,7 +17,7 @@ public dynamic Run(JObject transform, JObject input) string nullString = null; var parameters = transform["Params"].ToObject>(); var function = transform["Function"].Value(); - string ignoreEmptyValue = transform["IgnoreEmptyParams"] != null ? transform["IgnoreEmptyParams"].Value() : string.Empty; + var ignoreEmptyValue = transform["IgnoreEmptyParams"] != null ? transform["IgnoreEmptyParams"].Value() : string.Empty; if (!string.IsNullOrWhiteSpace(function) && function.Equals("URIESCAPEDATASTRING", StringComparison.OrdinalIgnoreCase) == false) { if (parameters != null) @@ -60,7 +60,7 @@ public dynamic Run(JObject transform, JObject input) { JContainer json; json = input.Parent; - for (int i = 2; i < item.Split(new string[] { "[{parent}]" }, System.StringSplitOptions.None).Length; i++) + for (var i = 2; i < item.Split(new string[] { "[{parent}]" }, System.StringSplitOptions.None).Length; i++) { json = json.Parent; } @@ -103,9 +103,9 @@ public dynamic Run(JObject transform, JObject input) return ConCat(inputParam, transform["Delimeter"].Value()); case "REPLACEVALUE": { - string compareToValue = transform["CompareToValue"].Value(); - string returnValue = transform["ReturnValue"].Value(); - string defaultValue = transform["DefaultValue"].Value(); + var compareToValue = transform["CompareToValue"].Value(); + var returnValue = transform["ReturnValue"].Value(); + var defaultValue = transform["DefaultValue"].Value(); compareToValue = GetCompareValue(input, nullString, compareToValue); returnValue = GetTokenValue(input, nullString, returnValue); @@ -114,9 +114,9 @@ public dynamic Run(JObject transform, JObject input) } case "REPLACEVALUEWITHREGEXCOMPARISON": { - string compareToValue = transform["CompareToValue"].Value(); - string returnValue = transform["ReturnValue"].Value(); - string defaultValue = transform["DefaultValue"].Value(); + var compareToValue = transform["CompareToValue"].Value(); + var returnValue = transform["ReturnValue"].Value(); + var defaultValue = transform["DefaultValue"].Value(); compareToValue = GetCompareValue(input, nullString, compareToValue); returnValue = GetTokenValue(input, nullString, returnValue); @@ -126,10 +126,10 @@ public dynamic Run(JObject transform, JObject input) } case "SPLIT": { - char delimeter = transform["Delimeter"].Value(); - int index = transform["Index"].Value(); + var delimeter = transform["Delimeter"].Value(); + var index = transform["Index"].Value(); var positionToken = transform["Position"]; - string position = positionToken != null ? positionToken.ToString() : string.Empty; + var position = positionToken != null ? positionToken.ToString() : string.Empty; return Split(inputParam, delimeter, index, position); } case "TOUPPERCASE": @@ -219,8 +219,8 @@ private void UriEscapeDataString(JObject input, IList parameters) { if (token.Type != JTokenType.Null) { - string data = token.ToString(); - string uriEscapedData = Uri.EscapeDataString(data); + var data = token.ToString(); + var uriEscapedData = Uri.EscapeDataString(data); token.Replace(uriEscapedData); } } @@ -259,19 +259,19 @@ private string Split(List args, char delimeter, int index, string positi { if (string.IsNullOrEmpty(position)) { - char[] delimiters = new char[] { delimeter }; + var delimiters = new char[] { delimeter }; return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries)[index]; } else { if (position.Equals("FIRST", StringComparison.OrdinalIgnoreCase)) { - char[] delimiters = new char[] { delimeter }; + var delimiters = new char[] { delimeter }; return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); } else if (position.Equals("LAST", StringComparison.OrdinalIgnoreCase)) { - char[] delimiters = new char[] { delimeter }; + var delimiters = new char[] { delimeter }; return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); } else diff --git a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs index a894a25..3481a81 100644 --- a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs +++ b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs @@ -23,9 +23,9 @@ public RoslynScriptHandler(Dictionary scripts) /// public dynamic Run(JObject transform, JObject input) { - StringBuilder inputParam = new StringBuilder(); - List parameters = transform["Params"].ToObject>(); - string scriptName = transform["ScriptName"].Value(); + var inputParam = new StringBuilder(); + var parameters = transform["Params"].ToObject>(); + var scriptName = transform["ScriptName"].Value(); foreach (var item in parameters) { diff --git a/src/JsonToJsonMapper/Handlers/TransposeHandler.cs b/src/JsonToJsonMapper/Handlers/TransposeHandler.cs index 459a840..a8d436b 100644 --- a/src/JsonToJsonMapper/Handlers/TransposeHandler.cs +++ b/src/JsonToJsonMapper/Handlers/TransposeHandler.cs @@ -13,16 +13,16 @@ public class TransposeHandler : ITransformationHandler /// public dynamic Run(JObject rule, JObject input) { - string sourceColumn = rule["SourceColumn"].Value(); - string transformValueKey = rule["TransformValue"]["KeyLookupField"].Value(); - string transformValuePrependText = rule["TransformValue"]["PrependKeyText"].Value(); - string transformValue = rule["TransformValue"]["ValueLookupField"].Value(); + var sourceColumn = rule["SourceColumn"].Value(); + var transformValueKey = rule["TransformValue"]["KeyLookupField"].Value(); + var transformValuePrependText = rule["TransformValue"]["PrependKeyText"].Value(); + var transformValue = rule["TransformValue"]["ValueLookupField"].Value(); var tokens = input.SelectTokens(sourceColumn); - Dictionary array = new Dictionary(); + var array = new Dictionary(); foreach (var i in tokens) { - string key = string.Empty; + var key = string.Empty; var token = i.SelectToken(transformValueKey); if (token != null) key = transformValuePrependText + token.ToString().Replace(" ", string.Empty); diff --git a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs index f457219..8452db1 100644 --- a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs +++ b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs @@ -17,9 +17,9 @@ internal class TypeConverterHandler : ITransformationHandler /// public dynamic Run(JObject config, JObject input) { - object value = input["value"].Value(); - string dataType = config["DataType"].Value(); - string format = config["Format"].Value(); + var value = input["value"].Value(); + var dataType = config["DataType"].Value(); + var format = config["Format"].Value(); if (value == null || ((JToken)value).Type == JTokenType.Null) return value; @@ -33,7 +33,7 @@ public dynamic Run(JObject config, JObject input) return Convert.ToInt64(value); case "JOBJECT": { - JToken Jtokenvalue = (JToken)value; + var Jtokenvalue = (JToken)value; if (Jtokenvalue.Type == JTokenType.Object) return (JObject)Jtokenvalue; else @@ -41,7 +41,7 @@ public dynamic Run(JObject config, JObject input) } case "JARRAY": { - JToken Jtokenvalue = (JToken)value; + var Jtokenvalue = (JToken)value; if (Jtokenvalue.Type == JTokenType.Array) { if (Jtokenvalue.Any()) @@ -72,8 +72,8 @@ public dynamic Run(JObject config, JObject input) return new Guid(value.ToString()); case "DATETIME": { - string valueType = value.ToString(); - Regex x = new Regex(@".*[+-][0-9][0-9][:]"); + var valueType = value.ToString(); + var x = new Regex(@".*[+-][0-9][0-9][:]"); if (x.IsMatch(valueType)) return DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture); else @@ -81,12 +81,12 @@ public dynamic Run(JObject config, JObject input) } case "CUSTOMDATETIME": { - string valueType = value.ToString(); - Regex x = new Regex(@".[+-][0-9]{4}"); + var valueType = value.ToString(); + var x = new Regex(@".[+-][0-9]{4}"); if (x.IsMatch(valueType)) { - int pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - String datetime = valueType.Substring(0, pos); + var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + var datetime = valueType.Substring(0, pos); return datetime; } else @@ -108,7 +108,7 @@ public dynamic Run(JObject config, JObject input) } case "INT?": { - decimal dval = Convert.ToDecimal(value.ToString()); + var dval = Convert.ToDecimal(value.ToString()); return Decimal.ToInt32(dval); } case "GUID?": @@ -130,7 +130,7 @@ public dynamic Run(JObject config, JObject input) DateTime dateTime; if (DateTime.TryParse(value.ToString(), out dateTime)) { - string utcDateTime = dateTime.ToString("s"); + var utcDateTime = dateTime.ToString("s"); var zone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); utcDateTime = utcDateTime + "+" + zone.BaseUtcOffset.ToString(); return utcDateTime; @@ -145,7 +145,7 @@ public dynamic Run(JObject config, JObject input) DateTime dateTime; if (DateTime.TryParse(value.ToString(), out dateTime)) { - string timeInUTCFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); + var timeInUTCFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); return timeInUTCFormat; } @@ -153,11 +153,11 @@ public dynamic Run(JObject config, JObject input) } case "REMOVEDATETIMEOFFSET": { - string valueType = value.ToString(); + var valueType = value.ToString(); if (valueType.Contains("Z")) { - int pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - string datetime = valueType.Substring(0, pos + 1); //including 'Z' in the output + var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + var datetime = valueType.Substring(0, pos + 1); //including 'Z' in the output return datetime; } diff --git a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index 4eb3f01..10f9447 100644 --- a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -15,10 +15,10 @@ public class AutoMapperTest public void Validate_AutoMapper_ExceptionThrownByInvalidMappingJson() { // Arrange - string mappingJson = + var mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - string inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; + var inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; //Act try @@ -38,10 +38,10 @@ public void Validate_AutoMapper_ExceptionThrownByInvalidMappingJson() public void Validate_AutoMapper_InvalidDatatype() { // Arrange - string mappingJson = + var mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - string inputJson = + var inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100a}"; try @@ -62,10 +62,10 @@ public void Validate_AutoMapper_InvalidDatatype() public void Validate_AutoMapper_NullValue() { // Arrange - string mappingJson = + var mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - string inputJson = + var inputJson = "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; //Act @@ -85,10 +85,10 @@ public void Validate_AutoMapper_NullValue() public void Validate_AutoMapper_EmptyString() { // Arrange - string mappingJson = + var mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - string inputJson = + var inputJson = "{\"name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"101\"}"; //Act @@ -109,10 +109,10 @@ public void Validate_AutoMapper_EmptyString() public void Validate_AutoMapper_DateTimeValidation() { // Arrange - string mappingJson = + var mappingJson = @"{ ""MappingRuleConfig"": { ""TruthTable"": [ { ""SourceColumn"": """", ""DestinationColumn"": ""EventId"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""-1"" } }, { ""SourceColumn"": ""$.MifContext.correlationId"", ""DestinationColumn"": ""Token"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""SchemaName"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""JournalEvents.EventCore.SessionScanData"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""Content"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""ContentObject"", ""DataType"": ""string"", ""ComplexType"": { ""DataType"": ""JArray"", ""Node"": ""$.GetReportResponse[*].GetReportResult[*].diffgr:diffgram[*].DocumentElement[*].['Session Scan Data']"", ""TruthTable"": [ { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.id"", ""DestinationColumn"": ""EventKey"", ""DataType"": ""string"" }, { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.name"", ""DestinationColumn"": ""EventName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Event ID"", ""DestinationColumn"": ""EventID"", ""DataType"": ""int"" }, { ""SourceColumn"": ""RegStatusID"", ""DestinationColumn"": ""RegStatusID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Registrant ID"", ""DestinationColumn"": ""RegistrantID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Type"", ""DestinationColumn"": ""Type"", ""DataType"": ""string"" }, { ""SourceColumn"": ""First Name"", ""DestinationColumn"": ""FirstName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Last Name"", ""DestinationColumn"": ""LastName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Email"", ""DestinationColumn"": ""Email"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignedUp"", ""DestinationColumn"": ""SignedUp"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignupInsertDate"", ""DestinationColumn"": ""SignupInsertDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationSignupModifiedDate"", ""DestinationColumn"": ""PresentationSignupModifiedDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Code"", ""DestinationColumn"": ""SessionCode"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Title"", ""DestinationColumn"": ""SessionTitle"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Start Time"", ""DestinationColumn"": ""StartTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""End Time"", ""DestinationColumn"": ""EndTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Track"", ""DestinationColumn"": ""Track"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationCheckedInDate"", ""DestinationColumn"": ""PresentationCheckedInDate"", ""DataType"": ""string"" } ] } }, { ""SourceColumn"": """", ""DestinationColumn"": ""EventDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""CreatedDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } } ] }}"; - string inputJson = + var inputJson = @"{ ""GetReportResponse"": [ { ""@xmlns"": ""https://api.eventcore.com/"", ""GetReportResult"": [ { ""diffgr:diffgram"": [ { ""@xmlns:msdata"": ""urn:schemas-microsoft-com:xml-msdata"", ""@xmlns:diffgr"": ""urn:schemas-microsoft-com:xml-diffgram-v1"", ""DocumentElement"": [ { ""@xmlns"": """", ""Session Scan Data"": [ { ""@diffgr:id"": ""Session Scan Data1"", ""@msdata:rowOrder"": ""0"", ""@diffgr:hasChanges"": ""inserted"", ""Event ID"": ""14337"", ""RegStatusID"": ""7"", ""Registrant ID"": ""2017054"", ""Type"": ""General Attendee"", ""First Name"": ""emad"", ""Last Name"": ""AbuAljazer "", ""Email"": ""jazer313@hotmail.com"", ""SignedUp"": ""true"", ""SignupInsertDate"": ""2015-10-29T07:48:27.767-07:00"", ""PresentationSignupModifiedDate"": ""2015-10-29T07:48:27.767-07:00"", ""Session Code"": ""ITPRO17"", ""Session Title"": ""Deploy virtual machines in the cloud part II"", ""Start Time"": ""11/02/2015 15:15:00 -08:00"", ""End Time"": ""11/02/2015 16:30:00 -08:00"", ""Track"": ""IT Professional"" } ] } ] } ] } ], ""recordCount"": ""-1"" } ], ""MifContext"": { ""runImmediate"": true, ""runId"": ""b8cb0be4-2375-4de2-9781-15dbbf8bc9b3"", ""TrackingEnabled"": false, ""WorkFlowName"": ""EventCoreSessionScanDataToEDP"", ""moreData"": ""true"", ""start_Index"": 501, ""end_Index"": 1000, ""correlationId"": ""8ab25b61-ec8a-4b40-8189-4b77f4f3cbf5"" }, ""ForEachContext"": { ""id"": ""8707"", ""name"": ""MGX FY14"" }}"; @@ -135,10 +135,10 @@ public void Validate_AutoMapper_DateTimeValidation() public void Validate_AutoMapper_DefaultValue1() { // Arrange - string mappingJson = + var mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":null,\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - string inputJson = + var inputJson = "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; //Act @@ -158,10 +158,10 @@ public void Validate_AutoMapper_DefaultValue1() public void Validate_AutoMapper_DefaultValue2() { // Arrange - string mappingJson = + var mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - string inputJson = + var inputJson = "{\"Name\": \"1\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; //Act @@ -181,10 +181,10 @@ public void Validate_AutoMapper_DefaultValue2() public void Validate_AutoMapper_DefaultValue3() { // Arrange - string mappingJson = + var mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - string inputJson = + var inputJson = "{\"Name\": \"22\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; //Act @@ -204,10 +204,10 @@ public void Validate_AutoMapper_DefaultValue3() public void Validate_AutoMapper_EmptyValue() { // Arrange - string mappingJson = + var mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": false},{\"ExistingValue\": \"\",\"NewValue\": true}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - string inputJson = + var inputJson = "{\"Name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; //Act @@ -227,9 +227,9 @@ public void Validate_AutoMapper_EmptyValue() public void Complex2FlatTransformationTest() { //Arrange - Certain input json with complex object - string inputJson = + var inputJson = "{\"dateCreated\": \"2015-08-31T14:30:00\", \"accountCode\": \"Cross-Product\", \"isActive\": true, \"isHotel\": false, \"isPreferred\": false, \"brandFrnId\": null, \"chainFrnId\": null, \"locationType\": \"Venue\", \"largestSpace\": null, \"numberOfMeetRooms\": null, \"numberOfRooms\": null, \"totalSpace\": null, \"address\": { \"line1\": \"750 Main Street\", \"line2\": null, \"line3\": null, \"line4\": null, \"city\": \"Moncton\", \"state\": \"New Brunswick\", \"postalCode\": \"E1C 1E6\", \"country\": \"Canada\", \"intlState\": null }, \"locationThirdParty\": null, \"locationCode\": \"msft_can_delta_monc\", \"desc\": \"\", \"directions\": \"\", \"email\": \"\", \"externalFrnKey\": null, \"fax\": \"\", \"imgAttributes\": \"\", \"imgSrc\": null, \"label\": \"\", \"name\": \"Delta Beausejour Hotel\", \"notes\": \"\", \"organization\": null, \"phone\": \"\", \"tollfree\": \"\", \"url\": \"http://binged.it/1O4l53S\" } "; - string mapping = "{\"MappingRuleConfig\":{\"DestinationType\":\"\",\"SourceObject\":\"\",\"DestinationObject\":\"\",\"TruthTable\":[{\"SourceColumn\":\"$.address['city']\",\"DestinationColumn\":\"City\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['state']\",\"DestinationColumn\":\"State\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['postalCode']\",\"DestinationColumn\":\"PostalCode\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['country']\",\"DestinationColumn\":\"Country\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null}]}}"; + var mapping = "{\"MappingRuleConfig\":{\"DestinationType\":\"\",\"SourceObject\":\"\",\"DestinationObject\":\"\",\"TruthTable\":[{\"SourceColumn\":\"$.address['city']\",\"DestinationColumn\":\"City\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['state']\",\"DestinationColumn\":\"State\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['postalCode']\",\"DestinationColumn\":\"PostalCode\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['country']\",\"DestinationColumn\":\"Country\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null}]}}"; var mapper = new AutoMapper(mapping); @@ -245,9 +245,9 @@ public void Complex2FlatTransformationTest() public void PromoteAttributesToPropertyTestWithoutPrependKeyText() { //Arrange - Certain input json with complex object - string inputJson = + var inputJson = "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; - string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; + var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -263,9 +263,9 @@ public void PromoteAttributesToPropertyTestWithoutPrependKeyText() public void PromoteAttributesToPropertyTestWithPrependKeyText() { //Arrange - Certain input json with complex object - string inputJson = + var inputJson = "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; - string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"PrependKeyText\":\"Attribute\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; + var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"PrependKeyText\":\"Attribute\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -282,9 +282,9 @@ public void PromoteAttributesToPropertyTestWithPrependKeyText() public void RoslynTest() { //Arrange - Certain input json with complex object - string inputJson = + var inputJson = "{\r\n \"eventCode\": \"APAC-1PWBNR3-0331-16-HQ\",\r\n \"pkEventId\": \"0x449740001\",\r\n \"eventId\": \"2353\",\r\n \"externalKey\": \"AP-Azure-WBNR-FY16-03Mar-31-Win10_Device_Management\",\r\n \"accountCode\": \"C-and-E\",\r\n \"eventName\": \"Windows 10 for device management\",\r\n \"url\": null,\r\n \"autoCalcCode\": false,\r\n \"isTestMode\": false,\r\n \"isActive\": true,\r\n \"isTemplate\": false,\r\n \"isLocked\": true,\r\n \"isClassic\": true,\r\n \"eventStatus\": \"Live\",\r\n \"isPending\": false,\r\n \"isDesign\": false,\r\n \"isTesting\": false,\r\n \"isOnsite\": false,\r\n \"isOffline\": false,\r\n \"isClosed\": false,\r\n \"isNotificationEnabled\": false,\r\n \"notes\": \"\",\r\n \"contact\": {\r\n \"contactName\": \"Microsoft SQL Team\",\r\n \"organization\": \"\",\r\n \"email\": \"b-dikurn@microsoft.com\",\r\n \"phone\": \"\",\r\n \"tollfree\": \"\",\r\n \"fax\": \"\",\r\n \"url\": \"\",\r\n \"notes\": \"\"\r\n },\r\n \"location\": {\r\n \"locationName\": \"Webinar\",\r\n \"locationCode\": \"Webinar\",\r\n \"email\": null,\r\n \"phone\": null,\r\n \"tollfree\": null,\r\n \"fax\": null,\r\n \"url\": null,\r\n \"notes\": null\r\n },\r\n \"dateCreated\": \"2016-02-17T15:59:42\",\r\n \"dateModified\": \"2016-02-19T14:21:21\",\r\n \"startDate\": \"2016-03-31T08:00:00\",\r\n \"endDate\": \"2016-03-31T16:00:00\",\r\n \"dateClosed\": null,\r\n \"txtEvtCreatedBy\": \"Samuel Pak\",\r\n \"txtEvtModifiedBy\": \"Maha Pasha\",\r\n \"glNumber\": \"\",\r\n \"timezone\": \"(GMT+05:00) Islamabad, Karachi, Tashkent\",\r\n \"timezoneMapping\": \"Asia/Karachi\",\r\n \"timezoneId\": 85,\r\n \"proposedLocation\": null,\r\n \"plannedAttendance\": null,\r\n \"proposedBudget\": null,\r\n \"plannedCurrency\": null,\r\n \"travelAccoCurrency\": null,\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionField\": \"evt_ans_field19\",\r\n \"questionId\": 638,\r\n \"questionCode\": \"Design-LPHeroImg\",\r\n \"questionName\": \"Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"https://info.microsoft.com/rs/157-GQE-382/images/ms-win10-webinar-banners-3000x300-04.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field24\",\r\n \"questionId\": 996,\r\n \"questionCode\": \"Design-EmailBannerImg\",\r\n \"questionName\": \"Design-EmailBannerImg \",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field16\",\r\n \"questionId\": 398,\r\n \"questionCode\": \"Program-BannerText\",\r\n \"questionName\": \"Program-BannerText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Microsft Event Banner Title\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field20\",\r\n \"questionId\": 639,\r\n \"questionCode\": \"Design-BannerTextColor\",\r\n \"questionName\": \"Design-BannerTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field17\",\r\n \"questionId\": 633,\r\n \"questionCode\": \"Design-HeaderTextColor\",\r\n \"questionName\": \"Design-HeaderTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#333333\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field06\",\r\n \"questionId\": 152,\r\n \"questionCode\": \"Program-HeaderText\",\r\n \"questionName\": \"Program-HeaderText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Windows 10 for device management\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field07\",\r\n \"questionId\": 153,\r\n \"questionCode\": \"Program-Description\",\r\n \"questionName\": \"Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"A\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field09\",\r\n \"questionId\": 229,\r\n \"questionCode\": \"Program-AdditionalInfo\",\r\n \"questionName\": \"Program-AdditionalInfo\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"B\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field21\",\r\n \"questionId\": 640,\r\n \"questionCode\": \"Design-HighlightColor\",\r\n \"questionName\": \"Design-HighlightColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field22\",\r\n \"questionId\": 641,\r\n \"questionCode\": \"Design-HighlightTextColor\",\r\n \"questionName\": \"Design-HighlightTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field01\",\r\n \"questionId\": 147,\r\n \"questionCode\": \"Hero Banner Image\",\r\n \"questionName\": \"Hero Banner Image\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"EN-BASICE-Banner-PeopleWithDevices.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field02\",\r\n \"questionId\": 37143,\r\n \"questionCode\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"questionName\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field30\",\r\n \"questionId\": 649,\r\n \"questionCode\": \"DELETED-Program-Description\",\r\n \"questionName\": \"DELETED-Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n \"groups\": null,\r\n \"rotations\": null,\r\n \"forms\": null,\r\n \"websites\": null,\r\n \"primaryFormURL\": \"/profile/form/index.cfm?PKformID=0x1084150001\",\r\n \"questionAssignments\": null\r\n}"; - string mapping = + var mapping = "{\r\n \"Scripts\": [\r\n {\r\n \"Name\": \"GetTitle\",\r\n \"Code\": \"string GetTitle(string args){string[] input = args.Split(new string[] {\\\"[delimiter]\\\"}, System.StringSplitOptions.None);string[] data = null; var title = string.Empty;for (int i = 0; i < input.Length; i++){if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")){title = input[i];break;}if (input[i].Contains(\\\"tokenDelimiter\\\") == true){data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None);for (int x = 0; x < data.Length; x++){if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])){title = data[x].ToString();break;}}}else{continue;}} return title;}GetTitle(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetDescription\",\r\n \"Code\": \"string GetEventDesc(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventDesc = string.Empty; for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventDesc = input[i]; eventDesc = System.Text.RegularExpressions.Regex.Replace(input[i], @\\\"<(.|\\n)*?>\\\", string.Empty); break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] {\\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventDesc = data[x].ToString(); eventDesc = System.Text.RegularExpressions.Regex.Replace(data[x], @\\\"<(.|\\n)*?>\\\", string.Empty); break;} } } else { continue; }} return eventDesc;}GetEventDesc(Args)\",\r\n \"Reference\": {\r\n \"Assembly\": \"System\",\r\n \"NameSpace\": \"System.Text.RegularExpressions\"\r\n }\r\n },\r\n {\r\n \"Name\": \"GetURL\",\r\n \"Code\": \"string GetURL(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventURL = string.Empty;for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventURL = input[i]; break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventURL = data[x].ToString(); break; } } } else { continue; } } if (string.IsNullOrEmpty(eventURL)) return eventURL = \\\"www.microsoft.com\\\"; else return eventURL; }GetURL(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetJsonArray\",\r\n \"Code\": \"string GetJsonArray(string args) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(\\\"[\\\"); foreach (var item in args.Split(',')) { sb.Append(@\\\"\\\"\\\"\\\" + item + @\\\"\\\"\\\",\\\"); } sb.Remove(sb.Length - 1, 1); sb.Append(\\\"]\\\"); return sb.ToString();}GetJsonArray(Args)\"\r\n }\r\n ],\r\n \"MappingRuleConfig\": {\r\n \"DestinationType\": \"EventInformation\",\r\n \"SourceObject\": \"CertainEvents\",\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventList\",\r\n \"DataType\": \"jarray\",\r\n \"ComplexType\": {\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"title\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetTitle\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-HeaderText')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-BannerText')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"accountCode\",\r\n \"DestinationColumn\": \"accountCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventCode\",\r\n \"DestinationColumn\": \"Id\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventStatus\",\r\n \"DestinationColumn\": \"Status\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"timezone\",\r\n \"DestinationColumn\": \"timezone\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"source\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Certain\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventCategory\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Onsite Event\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"startDate\",\r\n \"DestinationColumn\": \"StartDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"endDate\",\r\n \"DestinationColumn\": \"EndDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"$.location['locationName']\",\r\n \"DestinationColumn\": \"locationCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Description\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetDescription\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventAbstract')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-Description')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryLanguage\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Localization-Form-and-Email-Language')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryTargetAudience\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventsFor')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Product\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventProduct')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"EventSource\",\r\n \"DestinationColumn\": \"EventSource\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"$.eventQuestions.question[?(@.questionCode == 'Search-EventIcon')].answers.answer.[0].value\",\r\n \"DestinationColumn\": \"EventIcon\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Category\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"TBD\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"URL\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetURL\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-AlternateRegURL')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'primaryFormURL')].answers.answer.[0].value\"\r\n ]\r\n }\r\n\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"RequestId\",\r\n \"DataType\": \"guid\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"4bfaac9c-1e0d-4620-b9e6-66095376e99a\"\r\n }\r\n }\r\n ]\r\n }\r\n}"; var mapper = new AutoMapper(mapping); @@ -301,9 +301,9 @@ public void RoslynTest() public void ParentDataTest() { //Arrange - Certain input json with complex object - string inputJson = + var inputJson = "{\r\n \"events\": [\r\n {\r\n \"eventId\": \"100\",\r\n \"eventName\": \"A\",\r\n \"location\": {\r\n \"locationName\": \"Lincoln Square\",\r\n \"locationCode\": \"Lincoln Square\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q1\", \r\n \"questionName\": \"1Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n },\r\n{\r\n \"answerId\": null,\r\n \"value\": \"2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q2\", \r\n \"questionName\": \"2Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"3Consumers,Partners\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n{\r\n \"eventId\": \"200\",\r\n \"eventName\": \"B\",\r\n \"location\": {\r\n \"locationName\": \"Bel\",\r\n \"locationCode\": \"Bel\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q3\", \r\n \"questionName\": \"3Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n \r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q4\", \r\n \"questionName\": \"4Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"4Klo\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n}"; - string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Answers\",\"DataType\":\"string\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.events[*].eventQuestions.question[*].answers.answer\",\"TruthTable\":[{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].eventId\",\"DestinationColumn\":\"eventId\",\"DataType\":\"string\"},{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].questionId\",\"DestinationColumn\":\"questionId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerId\",\"DestinationColumn\":\"answerId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerCode\",\"DestinationColumn\":\"answerCode\",\"DataType\":\"string\"},{\"SourceColumn\":\"value\",\"DestinationColumn\":\"value\",\"DataType\":\"string\"}]}}]}}"; + var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Answers\",\"DataType\":\"string\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.events[*].eventQuestions.question[*].answers.answer\",\"TruthTable\":[{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].eventId\",\"DestinationColumn\":\"eventId\",\"DataType\":\"string\"},{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].questionId\",\"DestinationColumn\":\"questionId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerId\",\"DestinationColumn\":\"answerId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerCode\",\"DestinationColumn\":\"answerCode\",\"DataType\":\"string\"},{\"SourceColumn\":\"value\",\"DestinationColumn\":\"value\",\"DataType\":\"string\"}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -319,8 +319,8 @@ public void ParentDataTest() public void Validate_ValueMappingHandler_DefaultValue() { // Arrange - string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"Certain\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - string input = "{\"value\":null}"; + var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"Certain\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + var input = "{\"value\":null}"; //Act ITransformationHandler handler = new ValueMappingHandler(); @@ -339,8 +339,8 @@ public void Validate_ValueMappingHandler_DefaultValue() public void Validate_ValueMappingHandler_DefaultValue_UtcNow() { // Arrange - string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - string input = "{\"value\":null}"; + var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + var input = "{\"value\":null}"; //Act ITransformationHandler handler = new ValueMappingHandler(); @@ -360,8 +360,8 @@ public void Validate_ValueMappingHandler_DefaultValue_UtcNow() public void Validate_ValueMappingHandler_DefaultValue_Guid() { // Arrange - string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"NewGuid\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - string input = "{\"value\":null}"; + var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"NewGuid\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + var input = "{\"value\":null}"; //Act ITransformationHandler handler = new ValueMappingHandler(); @@ -381,8 +381,8 @@ public void Validate_ValueMappingHandler_DefaultValue_Guid() public void Validate_ValueMappingHandler_DefaultValue_Mapping() { // Arrange - string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": 1},{\"ExistingValue\": \"1\",\"NewValue\": 2}, {\"ExistingValue\": \"0\",\"NewValue\": -1}],\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - string input = "{\"value\":\"1\"}"; + var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": 1},{\"ExistingValue\": \"1\",\"NewValue\": 2}, {\"ExistingValue\": \"0\",\"NewValue\": -1}],\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + var input = "{\"value\":\"1\"}"; //Act ITransformationHandler handler = new ValueMappingHandler(); @@ -401,8 +401,8 @@ public void Validate_ValueMappingHandler_DefaultValue_Mapping() public void FunctionTest_ConCat() { //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": [{""questionField"": ""evt_ans_field19"",""questionId"": 638,""questionCode"": ""Design-LPHeroImg"",""questionName"": ""Design-LPHeroImg"",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""https://info.microsoft.com""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""First answer""},{""answerId"": null,""answerCode"": null,""value"": ""Last answer""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": """"}]}}]}}"; - string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": [{""questionField"": ""evt_ans_field19"",""questionId"": 638,""questionCode"": ""Design-LPHeroImg"",""questionName"": ""Design-LPHeroImg"",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""https://info.microsoft.com""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""First answer""},{""answerId"": null,""answerCode"": null,""value"": ""Last answer""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": """"}]}}]}}"; + var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -418,8 +418,8 @@ public void FunctionTest_ConCat() public void FunctionTest_ConCat_WithoutDelimeter() { //Arrange - Certain input json with complex object - string inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; - string mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value','Hello world!']}}]}}]}}"; + var inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; + var mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value','Hello world!']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -435,8 +435,8 @@ public void FunctionTest_ConCat_WithoutDelimeter() public void FunctionTest_ConCat_EmptyParamCollection() { //Arrange - Certain input json with complex object - string inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; - string mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value1','Hello world!']}}]}}]}}"; + var inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; + var mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value1','Hello world!']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -452,8 +452,8 @@ public void FunctionTest_ConCat_EmptyParamCollection() public void IgnoreEmptyArrayTest_True() { //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":true, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":true, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -469,8 +469,8 @@ public void IgnoreEmptyArrayTest_True() public void IgnoreEmptyArrayTest_False() { //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":false, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":false, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -486,8 +486,8 @@ public void IgnoreEmptyArrayTest_False() public void IgnoreEmptyArrayTest_NotSet() { //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"", ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"", ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -503,8 +503,8 @@ public void IgnoreEmptyArrayTest_NotSet() public void Automapper_EmptyDefaultValueTest() { //Arrange - Certain input json with complex object - string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - string mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"__meta__Entity\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"GenericPresales\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"EncryptedFields\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \" \" } } ] } } "; + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + var mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"__meta__Entity\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"GenericPresales\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"EncryptedFields\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \" \" } } ] } } "; var mapper = new AutoMapper(mapping); @@ -520,8 +520,8 @@ public void Automapper_EmptyDefaultValueTest() public void FunctionTest_ReplaceValue() { //Arrange - Certain input json with complex object - string inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'httPS://info.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValue','Params':['$.answers.answer[*].value']}}]}}]}}"; + var inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'httPS://info.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValue','Params':['$.answers.answer[*].value']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -538,9 +538,9 @@ public void FunctionTest_ReplaceValueNode_Failure() { //Arrange - Certain input json with complex object - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'CNE','ReturnValue':'','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'CNE','ReturnValue':'','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -557,9 +557,9 @@ public void FunctionTest_ReplaceValueNode_Sucess() { //Arrange - Certain input json with complex object - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'Topic','ReturnValue':'RV','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'Topic','ReturnValue':'RV','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -576,9 +576,9 @@ public void FunctionTest_ReplaceValueNode_JsonPath() { //Arrange - Certain input json with complex object - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -595,9 +595,9 @@ public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() { //Arrange - Certain input json with complex object - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": null, }"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": null, }"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -614,9 +614,9 @@ public void FunctionTest_ReplaceValue_ReturnValue_Node() { //Arrange - Certain input json with complex object - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -633,9 +633,9 @@ public void FunctionTest_ReplaceValueNodeTwo() { //Arrange - Certain input json with complex object - string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": \"+1234565430\", \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Mswide\", }"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": \"+1234565430\", \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Mswide\", }"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'MSWide','ReturnValue':'','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'MSWide','ReturnValue':'','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -651,8 +651,8 @@ public void FunctionTest_ReplaceValueNodeTwo() public void FunctionTest_ReplaceValue_NullCompareToValueAndInputValue_RegexTest() { //Arrange - Certain input json - string inputJson = @"{'MessageBody': {'address': null}}"; - string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': 'def' ,'DefaultValue': 'fgh','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + var inputJson = @"{'MessageBody': {'address': null}}"; + var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': 'def' ,'DefaultValue': 'fgh','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; var mapper = new AutoMapper(mapping); @@ -668,8 +668,8 @@ public void FunctionTest_ReplaceValue_NullCompareToValueAndInputValue_RegexTest( public void FunctionTest_ReplaceValue_NulllCompareToValue_RegexTest() { //Arrange - Certain input json - string inputJson = @"{'MessageBody': {'address': 'abc'}}"; - string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': null ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + var inputJson = @"{'MessageBody': {'address': 'abc'}}"; + var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': null ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; var mapper = new AutoMapper(mapping); @@ -685,8 +685,8 @@ public void FunctionTest_ReplaceValue_NulllCompareToValue_RegexTest() public void FunctionTest_ReplaceValue_EmptyCompareToValue_RegexTest() { //Arrange - Certain input json - string inputJson = @"{'MessageBody': {'address': 'abc'}}"; - string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': '' ,'ReturnValue': 'def' ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + var inputJson = @"{'MessageBody': {'address': 'abc'}}"; + var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': '' ,'ReturnValue': 'def' ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; var mapper = new AutoMapper(mapping); @@ -702,8 +702,8 @@ public void FunctionTest_ReplaceValue_EmptyCompareToValue_RegexTest() public void FunctionTest_ReplaceValue_RegexTest() { //Arrange - Certain input json with complex object - string inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; - string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'[a-z]+.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValueWithRegexComparison','Params':['$.answers.answer[*].value']}}]}}]}}"; + var inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'[a-z]+.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValueWithRegexComparison','Params':['$.answers.answer[*].value']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -719,15 +719,15 @@ public void FunctionTest_ReplaceValue_RegexTest() public void Automapper_IgnoreNullFalseTest() { //Arrange - Certain input json with complex object - string inputJson = "{ \"etag\": \"1-null\", \"transactionId\": null, \"completeCollectionSize\": 25, \"size\": 3, \"startingIndex\": 1, \"maxResults\": 3, \"questions\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answer\": [ { \"answerName\": \"answerNameXYZ\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\" } ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answer\": [ ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answer\": [ ] } ] }"; - string mapping = + var inputJson = "{ \"etag\": \"1-null\", \"transactionId\": null, \"completeCollectionSize\": 25, \"size\": 3, \"startingIndex\": 1, \"maxResults\": 3, \"questions\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answer\": [ { \"answerName\": \"answerNameXYZ\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\" } ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answer\": [ ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answer\": [ ] } ] }"; + var mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"EventId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"-1\" } }, { \"SourceColumn\": \"$.MifContext.BatchId\", \"DestinationColumn\": \"BatchId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.correlationId\", \"DestinationColumn\": \"RequestId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.moreEventQuestions\", \"DestinationColumn\": \"MoreResults\", \"DataType\": \"bool\", \"ComplexType\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"SchemaName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"JournalEvents.Certain.EventQuestionAnswersDetail\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Content\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"ContentObject\", \"DataType\": \"string\", \"ComplexType\": { \"DataType\": \"JArray\", \"IgnoreNullValue\": false, \"Node\": \"$.questions[*].answer\", \"TruthTable\": [ { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].accountCode\", \"DestinationColumn\": \"accountCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].eventCode\", \"DestinationColumn\": \"eventCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionName\", \"DestinationColumn\": \"questionName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionLabel\", \"DestinationColumn\": \"questionLabel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionCode\", \"DestinationColumn\": \"questionCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionType\", \"DestinationColumn\": \"questionType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"answerLabel\", \"DestinationColumn\": \"answerLabel\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerCode\", \"DestinationColumn\": \"answerCode\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerName\", \"DestinationColumn\": \"answerName\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } } ] } } ] } }"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(JObject.Parse(inputJson), true); - string expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; + var expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; //Assert Assert.IsTrue(JToken.DeepEquals(response, JObject.Parse(expectedResponse))); } @@ -736,8 +736,8 @@ public void Automapper_IgnoreNullFalseTest() public void FunctionTest_SplitWithOneIndex() { //Arrange - Certain input json with complex object - string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; + var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -753,8 +753,8 @@ public void FunctionTest_SplitWithOneIndex() public void FunctionTest_SplitWithTwoIndex() { //Arrange - Certain input json with complex object - string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}},{""SourceColumn"":"""",""DestinationColumn"":""Message"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":1,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; + var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}},{""SourceColumn"":"""",""DestinationColumn"":""Message"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":1,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -770,8 +770,8 @@ public void FunctionTest_SplitWithTwoIndex() public void FunctionTest_TransformToUpperCase() { //Arrange - Certain input json with complex object - string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOUPPERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; + var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOUPPERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -788,13 +788,13 @@ public void FunctionTest_TransformToUpperCaseParent() { //Arrange - Certain input json with complex object string mapping; - using (StreamReader r = new StreamReader(@"Jsons\ToUpper\Upper_Mapping.json")) + using (var r = new StreamReader(@"Jsons\ToUpper\Upper_Mapping.json")) { mapping = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } string inputJson; - using (StreamReader r = new StreamReader(@"Jsons\ToUpper\Transformation_Input.json")) + using (var r = new StreamReader(@"Jsons\ToUpper\Transformation_Input.json")) { inputJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } @@ -813,8 +813,8 @@ public void FunctionTest_TransformToUpperCaseParent() public void FunctionTest_TransformToLowerCase() { //Arrange - Certain input json with complex object - string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOLOWERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; + var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOLOWERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -830,17 +830,17 @@ public void FunctionTest_TransformToLowerCase() public void Validate_AutoMapper_NullDataType() { // Arrange - string mappingJson = + var mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"$.AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null}]}}"; - string inputJson = + var inputJson = "{\"Name\": \"22\",\"AllowEmail\": false,\"CrmId\": null,\"LeadScore\":100}"; //Act var mapper = new AutoMapper(mappingJson); try { - LeadRecord lead = (LeadRecord)mapper.Transform(inputJson); + var lead = (LeadRecord)mapper.Transform(inputJson); Assert.IsTrue(lead.LeadScore == 100); } catch (Exception ex) @@ -853,10 +853,10 @@ public void Validate_AutoMapper_NullDataType() public void AutoMappperMappingForJObjectAndJarray() { // Arrange - string inputJson = + var inputJson = "{ \"ProgramName\": \"test4\", \"ProgramFolderId\": \"49\", \"ProgramFolderType\": \"Folder\", \"ProgramDescription\": \"xcvxbv\", \"ProgramType\": \"Default\", \"ProgramChannel\": \"Email Blast\", \"ProgramCosts\": \"8360\", \"ProgramStartDate\": \"2015-01-01\" }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"DestinationType\": \"JObject\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramName\", \"DestinationColumn\": \"ProgramName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Folder\", \"DataType\": \"JObject\", \"ComplexType\": { \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramFolderId\", \"DestinationColumn\": \"id\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramFolderType\", \"DestinationColumn\": \"type\", \"DataType\": \"string\" } ] } }, { \"SourceColumn\": \"$.ProgramDescription\", \"DestinationColumn\": \"ProgramDescription\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramType\", \"DestinationColumn\": \"ProgramType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramChannel\", \"DestinationColumn\": \"ProgramChannel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Costs\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"IgnoreEmptyArray\": true, \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramStartDate\", \"DestinationColumn\": \"startDate\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramCosts\", \"DestinationColumn\": \"cost\", \"DataType\": \"string\" } ] } } ] } }"; @@ -865,7 +865,7 @@ public void AutoMappperMappingForJObjectAndJarray() try { var output = mapper.TransformIntoJson(inputJson); - string expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; + var expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; Assert.AreEqual(output, expectedOutput); } @@ -879,10 +879,10 @@ public void AutoMappperMappingForJObjectAndJarray() public void AutoMappperMapping_ValidateDateTimeFormat() { // Arrange - string inputJson = + var inputJson = "{'Content':[{'Date':'2015-11-30T00:00:00','LongFormattedDate':'Monday,November30','ShortFormattedDate':'11/30/2015','DateString':null,'DateIndex':1}],'MifContext':{'runImmediate':true,'runId':'97216631-3453-4326-9a83-d5c83c62c2e6','TrackingEnabled':false,'WorkFlowName':'EPDaysToEDP','programId':'52aa95a6-831a-e511-ab0e-00155d5066d7','programCode':'conv2015emea','correlationId':'e62812d0-7d19-4496-bd9a-8a5202fa8750'},'ForEachContext':{'Url':'https://eventpoint-conv2015emea-services.azurewebsites.net','APIKey':'050e1a02033e48319ac9fd051452a484'}"; - string mappingJson = + var mappingJson = "{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventId','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': '-1'}},{'SourceColumn': '$.MifContext.correlationId','DestinationColumn': 'BatchId','DataType': 'guid','ComplexType': null,'TransformValue': null},{'SourceColumn': '','DestinationColumn': 'RequestId','DataType': 'guid','ComplexType': null,'TransformValue': {'DefaultValue': 'newGuid'}},{'SourceColumn': '','DestinationColumn': 'MoreResults','DataType': 'bool','ComplexType': null,'TransformValue': {'DefaultValue': 'false'}},{'SourceColumn': '','DestinationColumn': 'SchemaName','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': 'JournalEvents.EventPoint.ProgramDay'}},{'SourceColumn': '','DestinationColumn': 'ContentObject','DataType': 'JArray','ComplexType': {'DataType': 'JArray','Node': '$.Content[*]','TruthTable': [{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programId','DestinationColumn': 'ProgramId','DataType': 'string'},{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programCode','DestinationColumn': 'ProgramCode','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'ProgramDayDate','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'LongFormattedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ',},{'SourceColumn': '$.ShortFormattedDate','DestinationColumn': 'ShortFormattedDate','DataType': 'string'},{'SourceColumn': '$.DateString','DestinationColumn': 'DateString','DataType': 'string'},{'SourceColumn': '$.DateIndex','DestinationColumn': 'DateIndex','DataType': 'string'}]}},{'SourceColumn': '','DestinationColumn': 'CreatedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}},{'SourceColumn': '','DestinationColumn': 'EventDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}}]}}"; @@ -905,10 +905,10 @@ public void AutoMappperMapping_ValidateDateTimeFormat() public void AutoMappperMapping_ConcatWithNull() { // Arrange - string inputJson = + var inputJson = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ { \"message\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; @@ -917,7 +917,7 @@ public void AutoMappperMapping_ConcatWithNull() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; + var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -930,10 +930,10 @@ public void AutoMappperMapping_ConcatWithNull() public void AutoMappperMapping_ConcatWithEmptyList() { // Arrange - string inputJson = + var inputJson = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors1\": [ { \"message1\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; @@ -942,7 +942,7 @@ public void AutoMappperMapping_ConcatWithEmptyList() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; + var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -956,10 +956,10 @@ public void AutoMappperMapping_ConcatWithEmptyList() public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithOffset() { // Arrange - string inputJson = + var inputJson = "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000Z+0000\", \"endDate\": \"2015-06-26T15:55:00.000Z-0000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; @@ -968,8 +968,8 @@ public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithOffset() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -982,10 +982,10 @@ public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithOffset() public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithoutOffset() { // Arrange - string inputJson = + var inputJson = "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000\", \"endDate\": \"2015-06-26T15:55:00.000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; @@ -994,8 +994,8 @@ public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithoutOffset() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1008,10 +1008,10 @@ public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithoutOffset() public void AutoMappperMapping_ReplaceValueFunction_HappyPath() { // Arrange - string inputJson = + var inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"12345\", \"phone\": \"67890\" } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; @@ -1020,8 +1020,8 @@ public void AutoMappperMapping_ReplaceValueFunction_HappyPath() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1034,10 +1034,10 @@ public void AutoMappperMapping_ReplaceValueFunction_HappyPath() public void AutoMappperMapping_ReplaceValueFunction_ParamNull() { // Arrange - string inputJson = + var inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"67890\" } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; @@ -1046,8 +1046,8 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamNull() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1060,10 +1060,10 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamNull() public void AutoMappperMapping_ReplaceValueFunction_ParamNotPresent() { // Arrange - string inputJson = + var inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"phone\": \"67890\" } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; @@ -1072,8 +1072,8 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamNotPresent() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1086,10 +1086,10 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamNotPresent() public void AutoMappperMapping_ReplaceValueFunction_ReturnValueNullParamNull() { // Arrange - string inputJson = + var inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\":null } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; @@ -1098,8 +1098,8 @@ public void AutoMappperMapping_ReplaceValueFunction_ReturnValueNullParamNull() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\" }"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{ \"LeadId\":\"leadId1\" }"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1112,10 +1112,10 @@ public void AutoMappperMapping_ReplaceValueFunction_ReturnValueNullParamNull() public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyString() { // Arrange - string inputJson = + var inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; @@ -1124,8 +1124,8 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyString() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1138,10 +1138,10 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyString() public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpace() { // Arrange - string inputJson = + var inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; @@ -1150,8 +1150,8 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpace() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1164,10 +1164,10 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpace() public void AutoMappperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() { // Arrange - string inputJson = + var inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"\" } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; @@ -1176,8 +1176,8 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1190,10 +1190,10 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEmptyParamEnabled() { // Arrange - string inputJson = + var inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; @@ -1202,8 +1202,8 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEm try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1216,10 +1216,10 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEm public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgnoreEmptyParamEnabled() { // Arrange - string inputJson = + var inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; - string mappingJson = + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; @@ -1228,8 +1228,8 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgn try { var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - JObject j = JObject.Parse(expectedOutput); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var j = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } catch (Exception ex) @@ -1243,13 +1243,13 @@ public void OneToOneMappingTest() { //Arrange string mappingJson; - using (StreamReader r = new StreamReader(@"Jsons\OneToOneMapping\OneToOneMappingRules.json")) + using (var r = new StreamReader(@"Jsons\OneToOneMapping\OneToOneMappingRules.json")) { mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } string input; - using (StreamReader r = new StreamReader(@"Jsons\OneToOneMapping\Transformation_Input.json")) + using (var r = new StreamReader(@"Jsons\OneToOneMapping\Transformation_Input.json")) { input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } @@ -1267,13 +1267,13 @@ public void RangeMappingTest() { //Arrange string mappingJson; - using (StreamReader r = new StreamReader(@"Jsons\RangeMapping\RangeMappingRules.json")) + using (var r = new StreamReader(@"Jsons\RangeMapping\RangeMappingRules.json")) { mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } string input; - using (StreamReader r = new StreamReader(@"Jsons\RangeMapping\Transformation_Input.json")) + using (var r = new StreamReader(@"Jsons\RangeMapping\Transformation_Input.json")) { input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } @@ -1290,13 +1290,13 @@ public void RangeMappingTest() public void FunctionHanlder_UriEscapeDataString_HappyPath_Ampersand() { // Arrange - string inputJson = + var inputJson = "{ \"data\": { \"companyName\": \"Procter & Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1304,13 +1304,13 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Ampersand() public void FunctionHanlder_UriEscapeDataString_HappyPath_Dollar() { // Arrange - string inputJson = + var inputJson = "{ \"data\": { \"companyName\": \"Procter $ Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1318,13 +1318,13 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Dollar() public void FunctionHanlder_UriEscapeDataString_HappyPath_Plus() { // Arrange - string inputJson = + var inputJson = "{ \"data\": { \"companyName\": \"Procter + Gamble Company\", \"countryName\": \"Bulgaria+\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1332,13 +1332,13 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Plus() public void FunctionHanlder_UriEscapeDataString_HappyPath_Space() { // Arrange - string inputJson = + var inputJson = "{ \"data\": { \"companyName\": \"Procter Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1346,13 +1346,13 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Space() public void FunctionHanlder_UriEscapeDataString_HappyPath_Percent() { // Arrange - string inputJson = + var inputJson = "{ \"data\": { \"companyName\": \"Procter%Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1360,13 +1360,13 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Percent() public void FunctionHanlder_UriEscapeDataString_HappyPath_Exclamation() { // Arrange - string inputJson = + var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1374,9 +1374,9 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Exclamation() public void FunctionHanlder_UriEscapeDataString_Null_Parameters() { // Arrange - string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": null } } ] } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": null } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); @@ -1388,13 +1388,13 @@ public void FunctionHanlder_UriEscapeDataString_Null_Parameters() public void FunctionHanlder_UriEscapeDataString_One_Null_Parameter() { // Arrange - string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", null, \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", null, \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1402,13 +1402,13 @@ public void FunctionHanlder_UriEscapeDataString_One_Null_Parameter() public void FunctionHanlder_UriEscapeDataString_Invalid_Parameter_Field() { // Arrange - string inputJson = + var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state1\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state1\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } } From 050087eacb6d84dc8deefcf659fa9779fb6e510e Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:33:56 +0100 Subject: [PATCH 10/37] - reSharper guided code cleanup --- src/JsonToJsonMapper/AutoMapper.cs | 518 ++-- src/JsonToJsonMapper/AutoMapperConfig.cs | 11 +- src/JsonToJsonMapper/ConvertValue.cs | 19 +- src/JsonToJsonMapper/ExtensionMethods.cs | 13 +- .../Handlers/FunctionHandler.cs | 401 ++- .../Handlers/ITransformationHandler.cs | 11 +- .../Handlers/RoslynScriptHandler.cs | 73 +- .../Handlers/TransformationFactory.cs | 45 +- .../Handlers/TransposeHandler.cs | 64 +- .../Handlers/TypeConverterHandler.cs | 309 ++- .../Handlers/ValueMappingHandler.cs | 54 +- src/JsonToJsonMapper/JsonTransform.cs | 18 +- src/JsonToJsonMapper/MappingRule.cs | 25 +- src/JsonToJsonMapper/Reference.cs | 11 +- src/JsonToJsonMapper/Rule.cs | 115 +- src/JsonToJsonMapper/ScriptDefinitions.cs | 17 +- src/JsonToJsonMapper/ScriptHost.cs | 9 +- src/JsonToJsonMapper/Transform.cs | 35 +- test/JsonToJsonMapper.Tests/AutoMapperTest.cs | 2267 ++++++++--------- .../OneToOneMapping/OneToOneMappingRules.json | 12 - test/JsonToJsonMapper.Tests/LeadRecord.cs | 17 +- 21 files changed, 1990 insertions(+), 2054 deletions(-) diff --git a/src/JsonToJsonMapper/AutoMapper.cs b/src/JsonToJsonMapper/AutoMapper.cs index 4acc79b..8a53c5e 100644 --- a/src/JsonToJsonMapper/AutoMapper.cs +++ b/src/JsonToJsonMapper/AutoMapper.cs @@ -1,346 +1,342 @@ -using System; -using System.Collections.Generic; -using System.Linq; +namespace JsonToJsonMapper; + using Microsoft.CodeAnalysis.CSharp.Scripting; using Microsoft.CodeAnalysis.Scripting; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -namespace JsonToJsonMapper +public class AutoMapper : IDisposable { - public class AutoMapper : IDisposable - { - public MappingRule Mapping { get; set; } - private JsonSerializerSettings JsonConvertSettings { get; set; } - private readonly TransformationFactory handler; + public MappingRule Mapping { get; set; } + private JsonSerializerSettings JsonConvertSettings { get; set; } + private readonly TransformationFactory handler; - public AutoMapper(string autoMapperConfig) - { - JsonConvertSettings = new JsonSerializerSettings(); - JsonConvertSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; - JsonConvertSettings.DateParseHandling = DateParseHandling.None; - handler = new TransformationFactory(); - var config = JsonConvert.DeserializeObject(autoMapperConfig); - Mapping = config.MappingRuleConfig; + public AutoMapper(string autoMapperConfig) + { + JsonConvertSettings = new JsonSerializerSettings(); + JsonConvertSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; + JsonConvertSettings.DateParseHandling = DateParseHandling.None; + handler = new TransformationFactory(); + var config = JsonConvert.DeserializeObject(autoMapperConfig); + Mapping = config.MappingRuleConfig; - if (Mapping == null || !Mapping.TruthTable.Any()) - throw new Exception("Invalid mapping json"); + if (Mapping == null || !Mapping.TruthTable.Any()) + throw new Exception("Invalid mapping json"); - var scripts = new Dictionary(); + var scripts = new Dictionary(); - // Compile and Load all the scripts in memory - if (config.Scripts != null) + // Compile and Load all the scripts in memory + if (config.Scripts != null) + { + foreach (var script in config.Scripts) { - foreach (var script in config.Scripts) + if (script.Reference != null) { - if (script.Reference != null) - { - // With assembly import - var options = ScriptOptions.Default.AddReferences(script.Reference.Assembly).WithImports(script.Reference.NameSpace); - scripts.Add(script.Name, CSharpScript.Create(script.Code, options, globalsType: typeof(ScriptHost))); - } - else - scripts.Add(script.Name, CSharpScript.Create(script.Code, globalsType: typeof(ScriptHost))); + // With assembly import + var options = ScriptOptions.Default.AddReferences(script.Reference.Assembly).WithImports(script.Reference.NameSpace); + scripts.Add(script.Name, CSharpScript.Create(script.Code, options, globalsType: typeof(ScriptHost))); } + else + scripts.Add(script.Name, CSharpScript.Create(script.Code, globalsType: typeof(ScriptHost))); } + } - // Load all the handlers + // Load all the handlers - handler.AddHandlers(new TransposeHandler()); - handler.AddHandlers(new TypeConverterHandler()); - handler.AddHandlers(new ValueMappingHandler()); - handler.AddHandlers(new RoslynScriptHandler(scripts)); - handler.AddHandlers(new FunctionHandler()); - } + handler.AddHandlers(new TransposeHandler()); + handler.AddHandlers(new TypeConverterHandler()); + handler.AddHandlers(new ValueMappingHandler()); + handler.AddHandlers(new RoslynScriptHandler(scripts)); + handler.AddHandlers(new FunctionHandler()); + } - /// - /// Transforms into a type - /// - /// - /// - public object Transform(string inputJson) - { - if (Mapping.DestinationType == null) - throw new Exception("Invalid mapping json"); + /// + /// Transforms into a type + /// + /// + /// + public object Transform(string inputJson) + { + if (Mapping.DestinationType == null) + throw new Exception("Invalid mapping json"); - return Execute((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping); - } + return Execute((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping); + } - public object Transform(JObject jObj) - { - if (Mapping.DestinationType == null) - throw new Exception("Invalid mapping json"); + public object Transform(JObject jObj) + { + if (Mapping.DestinationType == null) + throw new Exception("Invalid mapping json"); - return Execute(jObj, Mapping); - } + return Execute(jObj, Mapping); + } - /// - /// Creates an intance of destination type and sets the properties - /// - /// - /// - /// - private object Execute(JObject jsonObject, MappingRule mapping) - { - var type = Type.GetType(mapping.DestinationType, true); - var entity = Activator.CreateInstance(type); + /// + /// Creates an intance of destination type and sets the properties + /// + /// + /// + /// + private object Execute(JObject jsonObject, MappingRule mapping) + { + var type = Type.GetType(mapping.DestinationType, true); + var entity = Activator.CreateInstance(type); - // Set the value for each item in destinationType - foreach (var rule in mapping.TruthTable) + // Set the value for each item in destinationType + foreach (var rule in mapping.TruthTable) + { + var propertyInfo = entity.GetType().GetProperty(rule.DestinationColumn); + if (propertyInfo != null) { - var propertyInfo = entity.GetType().GetProperty(rule.DestinationColumn); - if (propertyInfo != null) + if (rule.ComplexType == null) { - if (rule.ComplexType == null) + string valueType; + var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); + + if (value != null) { - string valueType; - var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); - - if (value != null) - { - if (rule.DataType == null) - rule.DataType = valueType; - var finalValue = handler.GetHandler() - .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); - propertyInfo.SetValue(entity, finalValue, null); - } - else - propertyInfo.SetValue(entity, value, null); + if (rule.DataType == null) + rule.DataType = valueType; + var finalValue = handler.GetHandler() + .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); + propertyInfo.SetValue(entity, finalValue, null); } else - { - propertyInfo.SetValue(entity, Execute(jsonObject, rule.ComplexType), null); - } + propertyInfo.SetValue(entity, value, null); + } + else + { + propertyInfo.SetValue(entity, Execute(jsonObject, rule.ComplexType), null); } } - - return entity; } - /// - /// Transforms into Json - /// - /// - /// - /// - public string TransformIntoJson(string inputJson, bool ignoreNullValue) - { - Mapping.IgnoreNullValue = ignoreNullValue; - return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); - } + return entity; + } - public JObject TransformIntoJson(JObject jObj, bool ignoreNullValue) - { - Mapping.IgnoreNullValue = ignoreNullValue; - return ExecuteToJson(jObj, Mapping); - } + /// + /// Transforms into Json + /// + /// + /// + /// + public string TransformIntoJson(string inputJson, bool ignoreNullValue) + { + Mapping.IgnoreNullValue = ignoreNullValue; + return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); + } - /// - /// Transforms into json. Uses the IgnoreNullValue from the config, default is true. - /// - /// - /// - public string TransformIntoJson(string inputJson) - { - return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); - } + public JObject TransformIntoJson(JObject jObj, bool ignoreNullValue) + { + Mapping.IgnoreNullValue = ignoreNullValue; + return ExecuteToJson(jObj, Mapping); + } - public string TransformIntoJson(JObject jObj) - { - return JsonConvert.SerializeObject(ExecuteToJson(jObj, Mapping)); - } + /// + /// Transforms into json. Uses the IgnoreNullValue from the config, default is true. + /// + /// + /// + public string TransformIntoJson(string inputJson) + { + return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); + } + + public string TransformIntoJson(JObject jObj) + { + return JsonConvert.SerializeObject(ExecuteToJson(jObj, Mapping)); + } - protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) + protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) + { + var jsonString = new JsonTransform(); + foreach (var rule in mapping.TruthTable) { - var jsonString = new JsonTransform(); - foreach (var rule in mapping.TruthTable) + // handle transpose + if (rule.TransformValue != null && rule.TransformValue.Type != null && string.Equals(rule.TransformValue.Type, "promoteArrayToProperty", StringComparison.OrdinalIgnoreCase)) + { + Dictionary transposeResponse = handler.GetHandler() + .Run(JObject.FromObject(rule), jsonObject); + if (transposeResponse != null) + jsonString.Json.AddRange(transposeResponse); + } + else if (!string.IsNullOrEmpty(rule.DestinationColumn)) { - // handle transpose - if (rule.TransformValue != null && rule.TransformValue.Type != null && string.Equals(rule.TransformValue.Type, "promoteArrayToProperty", StringComparison.OrdinalIgnoreCase)) + if (rule.ComplexType == null) { - Dictionary transposeResponse = handler.GetHandler() - .Run(JObject.FromObject(rule), jsonObject); - if (transposeResponse != null) - jsonString.Json.AddRange(transposeResponse); + // Handle Jvalue + string valueType; + var destinationValue = rule.DestinationColumn.StartsWith("$") ? jsonObject.SelectToken(rule.DestinationColumn).ToString() : rule.DestinationColumn; + + var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); + if (rule.DataType == null) + rule.DataType = valueType; + var finalValue = handler.GetHandler() + .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); + if (finalValue != null || finalValue.Type != JTokenType.Null || (finalValue == null && !mapping.IgnoreNullValue) || (finalValue.Type == JTokenType.Null && !mapping.IgnoreNullValue)) + jsonString.Json.Add(destinationValue, finalValue); } - else if (!string.IsNullOrEmpty(rule.DestinationColumn)) + else if (rule.ComplexType.DataType != null && rule.ComplexType.DataType.ToUpperInvariant().Equals("JARRAY")) { - if (rule.ComplexType == null) + var result = TransformJArray(jsonObject, rule.ComplexType, mapping.IgnoreNullValue); + if (result != null) + jsonString.Json.Add(rule.DestinationColumn, result); + } + else + { + // Recursive call to handle complex type + var result = ExecuteToJson(jsonObject, rule.ComplexType); + if (result != null) { - // Handle Jvalue - string valueType; - var destinationValue = rule.DestinationColumn.StartsWith("$") ? jsonObject.SelectToken(rule.DestinationColumn).ToString() : rule.DestinationColumn; + if (!string.IsNullOrWhiteSpace(rule.DataType)) + jsonString.Json.Add(rule.DestinationColumn, handler.GetHandler() + .Run(JObject.FromObject(rule), JObject.FromObject(new { value = result }))); - var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); - if (rule.DataType == null) - rule.DataType = valueType; - var finalValue = handler.GetHandler() - .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); - if (finalValue != null || finalValue.Type != JTokenType.Null || (finalValue == null && !mapping.IgnoreNullValue) || (finalValue.Type == JTokenType.Null && !mapping.IgnoreNullValue)) - jsonString.Json.Add(destinationValue, finalValue); - } - else if (rule.ComplexType.DataType != null && rule.ComplexType.DataType.ToUpperInvariant().Equals("JARRAY")) - { - var result = TransformJArray(jsonObject, rule.ComplexType, mapping.IgnoreNullValue); - if (result != null) + else jsonString.Json.Add(rule.DestinationColumn, result); } - else - { - // Recursive call to handle complex type - var result = ExecuteToJson(jsonObject, rule.ComplexType); - if (result != null) - { - if (!string.IsNullOrWhiteSpace(rule.DataType)) - jsonString.Json.Add(rule.DestinationColumn, handler.GetHandler() - .Run(JObject.FromObject(rule), JObject.FromObject(new { value = result }))); - - else - jsonString.Json.Add(rule.DestinationColumn, result); - } - } } } - - return JObject.FromObject(jsonString); } - private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ignoreNullVaue) + return JObject.FromObject(jsonString); + } + + private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ignoreNullVaue) + { + var tokens = jsonObject.SelectTokens(mapping.Node); + var array = new JArray(); + var hasToken = false; + foreach (var item in tokens) { - var tokens = jsonObject.SelectTokens(mapping.Node); - var array = new JArray(); - var hasToken = false; - foreach (var item in tokens) + hasToken = true; + if (string.Equals(item.GetType().Name, "jarray", StringComparison.OrdinalIgnoreCase)) { - hasToken = true; - if (string.Equals(item.GetType().Name, "jarray", StringComparison.OrdinalIgnoreCase)) + var itemJArray = (JArray)item; + if (itemJArray.Any()) { - var itemJArray = (JArray)item; - if (itemJArray.Any()) - { - foreach (var a in itemJArray) - { - var o = (JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)a, mapping)), JsonConvertSettings); - array.Add(o); - } - } - else + foreach (var a in itemJArray) { - itemJArray.Add(new JObject(new JProperty("temp", ""))); - array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item.FirstOrDefault(), mapping)))); + var o = (JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)a, mapping)), JsonConvertSettings); + array.Add(o); } } else { - array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item, mapping)), JsonConvertSettings)); + itemJArray.Add(new JObject(new JProperty("temp", ""))); + array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item.FirstOrDefault(), mapping)))); } } - - if (!hasToken && mapping.IgnoreEmptyArray) - return null; - return array; + else + { + array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item, mapping)), JsonConvertSettings)); + } } - private string GetValue(JObject jsonObject, string key, Transform transform, out string valueType) - { - string value = null; - valueType = "string"; + if (!hasToken && mapping.IgnoreEmptyArray) + return null; + return array; + } - if (transform != null && transform.Type != null && transform.Type.Equals("SCRIPT", StringComparison.OrdinalIgnoreCase)) - { - return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); - } - else if (transform != null && transform.Type != null && transform.Type.Equals("FUNCTION", StringComparison.OrdinalIgnoreCase)) - { - return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); - } - else if (!string.IsNullOrEmpty(key) && key.StartsWith("$")) + private string GetValue(JObject jsonObject, string key, Transform transform, out string valueType) + { + string value = null; + valueType = "string"; + + if (transform != null && transform.Type != null && transform.Type.Equals("SCRIPT", StringComparison.OrdinalIgnoreCase)) + { + return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); + } + else if (transform != null && transform.Type != null && transform.Type.Equals("FUNCTION", StringComparison.OrdinalIgnoreCase)) + { + return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); + } + else if (!string.IsNullOrEmpty(key) && key.StartsWith("$")) + { + if (!key.ToUpperInvariant().Contains("[{PARENT}]")) { - if (!key.ToUpperInvariant().Contains("[{PARENT}]")) + var token = jsonObject.SelectToken(key); + if (token != null && token.Value() != null) { - var token = jsonObject.SelectToken(key); - if (token != null && token.Value() != null) + valueType = token.Type.ToString(); + var tokenValue = token.ToString(); + if (token.GetType().Name.Equals("JVALUE", StringComparison.OrdinalIgnoreCase) && token.Type == JTokenType.Null) + value = null; + else if (valueType.Equals("Date", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) { - valueType = token.Type.ToString(); - var tokenValue = token.ToString(); - if (token.GetType().Name.Equals("JVALUE", StringComparison.OrdinalIgnoreCase) && token.Type == JTokenType.Null) - value = null; - else if (valueType.Equals("Date", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) - { - var val = (token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries).Length > 1) ? token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries)[1] : tokenValue; - value = val.Replace("\"", "").Trim(); - } - else if (valueType.Equals("Boolean", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) - { - value = tokenValue.ToLowerInvariant(); - } - else - { - value = tokenValue; - } + var val = (token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries).Length > 1) ? token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries)[1] : tokenValue; + value = val.Replace("\"", "").Trim(); + } + else if (valueType.Equals("Boolean", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) + { + value = tokenValue.ToLowerInvariant(); } else - value = null; + { + value = tokenValue; + } } else + value = null; + } + else + { + JContainer json; + json = jsonObject.Parent; + for (var i = 2; i < key.Split(new string[] { "[{parent}]" }, StringSplitOptions.None).Length; i++) { - JContainer json; - json = jsonObject.Parent; - for (var i = 2; i < key.Split(new string[] { "[{parent}]" }, StringSplitOptions.None).Length; i++) - { - json = json.Parent; - } + json = json.Parent; + } - var valueToken = json.SelectToken(key.Replace("[{parent}].", "").Replace("$.", "")); - if (valueToken != null) + var valueToken = json.SelectToken(key.Replace("[{parent}].", "").Replace("$.", "")); + if (valueToken != null) + { + valueType = valueToken.Type.ToString(); + if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) + value = valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", ""); + else if (valueToken.Value() != null) { - valueType = valueToken.Type.ToString(); - if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) - value = valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", ""); - else if (valueToken.Value() != null) - { - value = valueToken.ToString(); - } - else - value = null; + value = valueToken.ToString(); } else value = null; } + else + value = null; } + } + else + { + var jsonobjectvalue = jsonObject.GetValue(key, StringComparison.OrdinalIgnoreCase); + if (jsonobjectvalue == null || jsonobjectvalue.Type == JTokenType.Null) + value = null; else { - var jsonobjectvalue = jsonObject.GetValue(key, StringComparison.OrdinalIgnoreCase); - if (jsonobjectvalue == null || jsonobjectvalue.Type == JTokenType.Null) - value = null; - else - { - valueType = jsonobjectvalue.Type.ToString(); - value = jsonobjectvalue.ToString(); - if (value.StartsWith("\"")) - value = value.Substring(1); - if (value.EndsWith("\"")) - value = value.Substring(0, value.Length - 1); - } + valueType = jsonobjectvalue.Type.ToString(); + value = jsonobjectvalue.ToString(); + if (value.StartsWith("\"")) + value = value.Substring(1); + if (value.EndsWith("\"")) + value = value.Substring(0, value.Length - 1); } + } - if (transform != null) - value = handler.GetHandler() - .Run(JObject.FromObject(transform), JObject.FromObject(new { value = value })); + if (transform != null) + value = handler.GetHandler() + .Run(JObject.FromObject(transform), JObject.FromObject(new { value = value })); - return value; - } + return value; + } - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } - // Protected implementation of Dispose pattern. - protected virtual void Dispose(bool disposing) - { - Mapping = null; - } + // Protected implementation of Dispose pattern. + protected virtual void Dispose(bool disposing) + { + Mapping = null; } } diff --git a/src/JsonToJsonMapper/AutoMapperConfig.cs b/src/JsonToJsonMapper/AutoMapperConfig.cs index 1da2fb5..41745ed 100644 --- a/src/JsonToJsonMapper/AutoMapperConfig.cs +++ b/src/JsonToJsonMapper/AutoMapperConfig.cs @@ -1,10 +1,7 @@ -using System.Collections.Generic; +namespace JsonToJsonMapper; -namespace JsonToJsonMapper +public class AutoMapperConfig { - public class AutoMapperConfig - { - public List Scripts { get; set; } - public MappingRule MappingRuleConfig { get; set; } - } + public List Scripts { get; set; } + public MappingRule MappingRuleConfig { get; set; } } diff --git a/src/JsonToJsonMapper/ConvertValue.cs b/src/JsonToJsonMapper/ConvertValue.cs index 350a548..2abafce 100644 --- a/src/JsonToJsonMapper/ConvertValue.cs +++ b/src/JsonToJsonMapper/ConvertValue.cs @@ -1,14 +1,13 @@ -namespace JsonToJsonMapper +namespace JsonToJsonMapper; + +public class ConvertValue { - public class ConvertValue - { - public string ExistingValue { get; set; } - public string NewValue { get; set; } + public string ExistingValue { get; set; } + public string NewValue { get; set; } - public ConvertValue(string existingValue, string newValue) - { - ExistingValue = existingValue; - NewValue = newValue; - } + public ConvertValue(string existingValue, string newValue) + { + ExistingValue = existingValue; + NewValue = newValue; } } diff --git a/src/JsonToJsonMapper/ExtensionMethods.cs b/src/JsonToJsonMapper/ExtensionMethods.cs index c9e4853..44fffa8 100644 --- a/src/JsonToJsonMapper/ExtensionMethods.cs +++ b/src/JsonToJsonMapper/ExtensionMethods.cs @@ -1,15 +1,12 @@ -using System.Collections.Generic; +namespace JsonToJsonMapper; -namespace JsonToJsonMapper +public static class ExtensionMethods { - public static class ExtensionMethods + public static void AddRange(this Dictionary dictA, Dictionary dictB) { - public static void AddRange(this Dictionary dictA, Dictionary dictB) + foreach (var pair in dictB) { - foreach (var pair in dictB) - { - dictA[pair.Key] = pair.Value; - } + dictA[pair.Key] = pair.Value; } } } diff --git a/src/JsonToJsonMapper/Handlers/FunctionHandler.cs b/src/JsonToJsonMapper/Handlers/FunctionHandler.cs index 6437f1d..82456a9 100644 --- a/src/JsonToJsonMapper/Handlers/FunctionHandler.cs +++ b/src/JsonToJsonMapper/Handlers/FunctionHandler.cs @@ -1,228 +1,221 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json; +namespace JsonToJsonMapper; + using System.Text.RegularExpressions; +using Newtonsoft.Json.Linq; -namespace JsonToJsonMapper +public class FunctionHandler : ITransformationHandler { - public class FunctionHandler : ITransformationHandler + public dynamic Run(JObject transform, JObject input) { - public dynamic Run(JObject transform, JObject input) + var inputParam = new List(); + string nullString = null; + var parameters = transform["Params"].ToObject>(); + var function = transform["Function"].Value(); + var ignoreEmptyValue = transform["IgnoreEmptyParams"] != null ? transform["IgnoreEmptyParams"].Value() : string.Empty; + if (!string.IsNullOrWhiteSpace(function) && function.Equals("URIESCAPEDATASTRING", StringComparison.OrdinalIgnoreCase) == false) { - var inputParam = new List(); - string nullString = null; - var parameters = transform["Params"].ToObject>(); - var function = transform["Function"].Value(); - var ignoreEmptyValue = transform["IgnoreEmptyParams"] != null ? transform["IgnoreEmptyParams"].Value() : string.Empty; - if (!string.IsNullOrWhiteSpace(function) && function.Equals("URIESCAPEDATASTRING", StringComparison.OrdinalIgnoreCase) == false) + if (parameters != null) { - if (parameters != null) + foreach (var item in parameters) { - foreach (var item in parameters) - { - if (!(item is JToken)) - if (item.StartsWith("$")) + if (!(item is JToken)) + if (item.StartsWith("$")) + { + if (!item.ToUpperInvariant().Contains("[{PARENT}]")) { - if (!item.ToUpperInvariant().Contains("[{PARENT}]")) + var tokens = input.SelectTokens((string)item); + if (tokens != null && tokens.Any()) { - var tokens = input.SelectTokens((string)item); - if (tokens != null && tokens.Any()) + foreach (var i in tokens) { - foreach (var i in tokens) + if (i.Type == JTokenType.Null) + { + inputParam.Add(nullString); + } + else if (string.IsNullOrWhiteSpace(i.ToString())) { - if (i.Type == JTokenType.Null) - { + if (Convert.ToBoolean(ignoreEmptyValue)) inputParam.Add(nullString); - } - else if (string.IsNullOrWhiteSpace(i.ToString())) - { - if (Convert.ToBoolean(ignoreEmptyValue)) - inputParam.Add(nullString); - else - inputParam.Add(i.ToString()); - } else - { inputParam.Add(i.ToString()); - } } - } - else - { - inputParam.Add(nullString); + else + { + inputParam.Add(i.ToString()); + } } } else { - JContainer json; - json = input.Parent; - for (var i = 2; i < item.Split(new string[] { "[{parent}]" }, System.StringSplitOptions.None).Length; i++) - { - json = json.Parent; - } + inputParam.Add(nullString); + } + } + else + { + JContainer json; + json = input.Parent; + for (var i = 2; i < item.Split(new string[] { "[{parent}]" }, StringSplitOptions.None).Length; i++) + { + json = json.Parent; + } - JToken valueToken = json.SelectToken(item.Replace("[{parent}].", "").Replace("$.", "")); - if (valueToken != null) + JToken valueToken = json.SelectToken(item.Replace("[{parent}].", "").Replace("$.", "")); + if (valueToken != null) + { + if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) + inputParam.Add(valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); + else if (valueToken.Value() != null) { - if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) - inputParam.Add(valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); - else if (valueToken.Value() != null) + if (string.IsNullOrWhiteSpace(valueToken.ToString())) { - if (string.IsNullOrWhiteSpace(valueToken.ToString())) - { - if (Convert.ToBoolean(ignoreEmptyValue)) - inputParam.Add(nullString); - else - inputParam.Add(valueToken.ToString()); - } + if (Convert.ToBoolean(ignoreEmptyValue)) + inputParam.Add(nullString); else - { inputParam.Add(valueToken.ToString()); - } } else - inputParam.Add(nullString); + { + inputParam.Add(valueToken.ToString()); + } } else inputParam.Add(nullString); } + else + inputParam.Add(nullString); } - else - inputParam.Add(item); - } + } + else + inputParam.Add(item); } } + } - switch (function.ToUpperInvariant()) + switch (function.ToUpperInvariant()) + { + case "CONCAT": + return ConCat(inputParam, transform["Delimeter"].Value()); + case "REPLACEVALUE": { - case "CONCAT": - return ConCat(inputParam, transform["Delimeter"].Value()); - case "REPLACEVALUE": - { - var compareToValue = transform["CompareToValue"].Value(); - var returnValue = transform["ReturnValue"].Value(); - var defaultValue = transform["DefaultValue"].Value(); + var compareToValue = transform["CompareToValue"].Value(); + var returnValue = transform["ReturnValue"].Value(); + var defaultValue = transform["DefaultValue"].Value(); - compareToValue = GetCompareValue(input, nullString, compareToValue); - returnValue = GetTokenValue(input, nullString, returnValue); - defaultValue = GetTokenValue(input, nullString, defaultValue); - return ReplaceValue(inputParam, compareToValue, returnValue, defaultValue); - } - case "REPLACEVALUEWITHREGEXCOMPARISON": - { - var compareToValue = transform["CompareToValue"].Value(); - var returnValue = transform["ReturnValue"].Value(); - var defaultValue = transform["DefaultValue"].Value(); - compareToValue = GetCompareValue(input, nullString, compareToValue); + compareToValue = GetCompareValue(input, nullString, compareToValue); + returnValue = GetTokenValue(input, nullString, returnValue); + defaultValue = GetTokenValue(input, nullString, defaultValue); + return ReplaceValue(inputParam, compareToValue, returnValue, defaultValue); + } + case "REPLACEVALUEWITHREGEXCOMPARISON": + { + var compareToValue = transform["CompareToValue"].Value(); + var returnValue = transform["ReturnValue"].Value(); + var defaultValue = transform["DefaultValue"].Value(); + compareToValue = GetCompareValue(input, nullString, compareToValue); - returnValue = GetTokenValue(input, nullString, returnValue); - defaultValue = GetTokenValue(input, nullString, defaultValue); + returnValue = GetTokenValue(input, nullString, returnValue); + defaultValue = GetTokenValue(input, nullString, defaultValue); - return ReplaceValueWithRegexComparison(inputParam, compareToValue, returnValue, defaultValue); - } - case "SPLIT": - { - var delimeter = transform["Delimeter"].Value(); - var index = transform["Index"].Value(); - var positionToken = transform["Position"]; - var position = positionToken != null ? positionToken.ToString() : string.Empty; - return Split(inputParam, delimeter, index, position); - } - case "TOUPPERCASE": - { - return inputParam[0] != null ? inputParam[0].ToUpperInvariant() : string.Empty; - } - case "TOLOWERCASE": - { - return inputParam[0] != null ? inputParam[0].ToLowerInvariant() : string.Empty; - } - case "RANGEMAPPING": - { - return mapRange((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); - } - case "ONETOONEMAPPING": - { - return mapOneToOne((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); - } - case "URIESCAPEDATASTRING": - { - UriEscapeDataString(input, parameters); - break; - } + return ReplaceValueWithRegexComparison(inputParam, compareToValue, returnValue, defaultValue); + } + case "SPLIT": + { + var delimeter = transform["Delimeter"].Value(); + var index = transform["Index"].Value(); + var positionToken = transform["Position"]; + var position = positionToken != null ? positionToken.ToString() : string.Empty; + return Split(inputParam, delimeter, index, position); + } + case "TOUPPERCASE": + { + return inputParam[0] != null ? inputParam[0].ToUpperInvariant() : string.Empty; + } + case "TOLOWERCASE": + { + return inputParam[0] != null ? inputParam[0].ToLowerInvariant() : string.Empty; + } + case "RANGEMAPPING": + { + return mapRange((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); + } + case "ONETOONEMAPPING": + { + return mapOneToOne((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); + } + case "URIESCAPEDATASTRING": + { + UriEscapeDataString(input, parameters); + break; } - - return null; } - private string GetTokenValue(JObject input, string nullString, string Value) + return null; + } + + private string GetTokenValue(JObject input, string nullString, string Value) + { + if (Value != null && Value.StartsWith("$.")) { - if (Value != null && Value.StartsWith("$.")) + var returnValueToken = input.SelectToken(Value); + if (returnValueToken == null) + { + Value = nullString; + } + else { - var returnValueToken = input.SelectToken(Value); - if (returnValueToken == null) + if (returnValueToken.Type == JTokenType.Null) { Value = nullString; } else { - if (returnValueToken.Type == JTokenType.Null) - { - Value = nullString; - } - else - { - Value = returnValueToken.ToString(); - } + Value = returnValueToken.ToString(); } } - - return Value; } - private string GetCompareValue(JObject input, string nullString, string compareToValue) + return Value; + } + + private string GetCompareValue(JObject input, string nullString, string compareToValue) + { + if (compareToValue != null && compareToValue.StartsWith("$.")) { - if (compareToValue != null && compareToValue.StartsWith("$.")) + var compareToValueToken = input.SelectToken(compareToValue); + if (compareToValueToken == null) { - var compareToValueToken = input.SelectToken(compareToValue); - if (compareToValueToken == null) - { - compareToValue = nullString; - } - else - { - compareToValue = compareToValueToken.ToString(); - } + compareToValue = nullString; + } + else + { + compareToValue = compareToValueToken.ToString(); } - - return compareToValue; } - private void UriEscapeDataString(JObject input, IList parameters) + return compareToValue; + } + + private void UriEscapeDataString(JObject input, IList parameters) + { + if (parameters != null) { - if (parameters != null) + foreach (var parameter in parameters) { - foreach (var parameter in parameters) + if (parameter != null) { - if (parameter != null) + string theParameter = parameter.ToString(); + if (theParameter.StartsWith("$")) { - string theParameter = parameter.ToString(); - if (theParameter.StartsWith("$")) + var parameterToken = input.SelectTokens(theParameter); + if (parameterToken != null && parameterToken.Any()) { - var parameterToken = input.SelectTokens(theParameter); - if (parameterToken != null && parameterToken.Any()) + foreach (var token in parameterToken) { - foreach (var token in parameterToken) + if (token.Type != JTokenType.Null) { - if (token.Type != JTokenType.Null) - { - var data = token.ToString(); - var uriEscapedData = Uri.EscapeDataString(data); - token.Replace(uriEscapedData); - } + var data = token.ToString(); + var uriEscapedData = Uri.EscapeDataString(data); + token.Replace(uriEscapedData); } } } @@ -230,63 +223,63 @@ private void UriEscapeDataString(JObject input, IList parameters) } } } + } - private string ConCat(List args, string delimeter) - { - return string.Join(delimeter, args.Where(value => value != null).ToList()); - } + private string ConCat(List args, string delimeter) + { + return string.Join(delimeter, args.Where(value => value != null).ToList()); + } - private string ReplaceValue(List args, string compareToValue, string returnValue, string defaultValue) - { - if (args[0] == null && compareToValue == null) - return returnValue; - if (args[0] != null && args[0].Equals(compareToValue, StringComparison.OrdinalIgnoreCase)) - return returnValue; + private string ReplaceValue(List args, string compareToValue, string returnValue, string defaultValue) + { + if (args[0] == null && compareToValue == null) + return returnValue; + if (args[0] != null && args[0].Equals(compareToValue, StringComparison.OrdinalIgnoreCase)) + return returnValue; - return defaultValue; - } + return defaultValue; + } + + private string ReplaceValueWithRegexComparison(List args, string compareToValue, string returnValue, string defaultValue) + { + if (args[0] == null && compareToValue == null) + return returnValue; + if (args[0] != null && compareToValue != null && Regex.IsMatch(args[0], compareToValue, RegexOptions.IgnoreCase)) + return returnValue; + return defaultValue; + } - private string ReplaceValueWithRegexComparison(List args, string compareToValue, string returnValue, string defaultValue) + private string Split(List args, char delimeter, int index, string position = "") + { + if (string.IsNullOrEmpty(position)) { - if (args[0] == null && compareToValue == null) - return returnValue; - if (args[0] != null && compareToValue != null && Regex.IsMatch(args[0], compareToValue, RegexOptions.IgnoreCase)) - return returnValue; - return defaultValue; + var delimiters = new char[] { delimeter }; + return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries)[index]; } - - private string Split(List args, char delimeter, int index, string position = "") + else { - if (string.IsNullOrEmpty(position)) + if (position.Equals("FIRST", StringComparison.OrdinalIgnoreCase)) { var delimiters = new char[] { delimeter }; - return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries)[index]; + return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); } - else + else if (position.Equals("LAST", StringComparison.OrdinalIgnoreCase)) { - if (position.Equals("FIRST", StringComparison.OrdinalIgnoreCase)) - { - var delimiters = new char[] { delimeter }; - return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); - } - else if (position.Equals("LAST", StringComparison.OrdinalIgnoreCase)) - { - var delimiters = new char[] { delimeter }; - return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); - } - else - return string.Empty; + var delimiters = new char[] { delimeter }; + return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); } + else + return string.Empty; } + } - private string mapRange(JArray truthTable, string value) - { - return Convert.ToString(truthTable.SelectToken($"$.[?(@.min<'{Convert.ToInt64(value)}' && @.max>'{Convert.ToInt64(value)}')].value")); - } + private string mapRange(JArray truthTable, string value) + { + return Convert.ToString(truthTable.SelectToken($"$.[?(@.min<'{Convert.ToInt64(value)}' && @.max>'{Convert.ToInt64(value)}')].value")); + } - private string mapOneToOne(JArray truthTable, string value) - { - return Convert.ToString(truthTable.SelectToken($"$.[?(@.key=='{value}')].value")); - } + private string mapOneToOne(JArray truthTable, string value) + { + return Convert.ToString(truthTable.SelectToken($"$.[?(@.key=='{value}')].value")); } } diff --git a/src/JsonToJsonMapper/Handlers/ITransformationHandler.cs b/src/JsonToJsonMapper/Handlers/ITransformationHandler.cs index ceedfc8..e9dde9b 100644 --- a/src/JsonToJsonMapper/Handlers/ITransformationHandler.cs +++ b/src/JsonToJsonMapper/Handlers/ITransformationHandler.cs @@ -1,9 +1,8 @@ -using Newtonsoft.Json.Linq; +namespace JsonToJsonMapper; -namespace JsonToJsonMapper +using Newtonsoft.Json.Linq; + +public interface ITransformationHandler { - public interface ITransformationHandler - { - dynamic Run(JObject config, JObject input); - } + dynamic Run(JObject config, JObject input); } diff --git a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs index 3481a81..46e7af8 100644 --- a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs +++ b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs @@ -1,56 +1,53 @@ -using System.Collections.Generic; -using System.Linq; +namespace JsonToJsonMapper; + using System.Text; using Microsoft.CodeAnalysis.Scripting; using Newtonsoft.Json.Linq; -namespace JsonToJsonMapper +internal class RoslynScriptHandler : ITransformationHandler { - internal class RoslynScriptHandler : ITransformationHandler + public Dictionary Scripts { get; set; } + + public RoslynScriptHandler(Dictionary scripts) { - public Dictionary Scripts { get; set; } + Scripts = scripts; + } - public RoslynScriptHandler(Dictionary scripts) - { - Scripts = scripts; - } + /// + /// Executes the script using Roslyn and returns the value. + /// + /// + /// + /// + public dynamic Run(JObject transform, JObject input) + { + var inputParam = new StringBuilder(); + var parameters = transform["Params"].ToObject>(); + var scriptName = transform["ScriptName"].Value(); - /// - /// Executes the script using Roslyn and returns the value. - /// - /// - /// - /// - public dynamic Run(JObject transform, JObject input) + foreach (var item in parameters) { - var inputParam = new StringBuilder(); - var parameters = transform["Params"].ToObject>(); - var scriptName = transform["ScriptName"].Value(); - - foreach (var item in parameters) + if (item.StartsWith("$")) { - if (item.StartsWith("$")) + if (input.SelectTokens(item) != null) { - if (input.SelectTokens(item) != null) + var tokens = input.SelectTokens(item); + foreach (var i in tokens) { - var tokens = input.SelectTokens(item); - foreach (var i in tokens) - { - inputParam.Append(i.ToString()); - if (tokens.Count() > 1) - inputParam.Append("[tokenDelimiter]"); - } + inputParam.Append(i.ToString()); + if (tokens.Count() > 1) + inputParam.Append("[tokenDelimiter]"); } - - if (parameters.Count > 1) - inputParam.Append(string.Empty + "[delimiter]"); } - else - inputParam.Append(item + "[delimiter]"); - } - var result = Scripts[scriptName].RunAsync(new ScriptHost { Args = inputParam.ToString() }); - return result.Result.ReturnValue.ToString(); + if (parameters.Count > 1) + inputParam.Append(string.Empty + "[delimiter]"); + } + else + inputParam.Append(item + "[delimiter]"); } + + var result = Scripts[scriptName].RunAsync(new ScriptHost { Args = inputParam.ToString() }); + return result.Result.ReturnValue.ToString(); } } diff --git a/src/JsonToJsonMapper/Handlers/TransformationFactory.cs b/src/JsonToJsonMapper/Handlers/TransformationFactory.cs index 4d3685f..0ebc7e6 100644 --- a/src/JsonToJsonMapper/Handlers/TransformationFactory.cs +++ b/src/JsonToJsonMapper/Handlers/TransformationFactory.cs @@ -1,31 +1,28 @@ -using System.Collections.Generic; +namespace JsonToJsonMapper; -namespace JsonToJsonMapper +internal class TransformationFactory { - internal class TransformationFactory - { - private readonly Dictionary registeredHandlers = new Dictionary(); + private readonly Dictionary registeredHandlers = new Dictionary(); - /// - /// Add handler to the dictionary - /// - /// - public void AddHandlers(ITransformationHandler handler) - { - registeredHandlers[handler.GetType().Name] = handler; - } + /// + /// Add handler to the dictionary + /// + /// + public void AddHandlers(ITransformationHandler handler) + { + registeredHandlers[handler.GetType().Name] = handler; + } - /// - /// Returns a handler based on the type - /// - /// - /// - public ITransformationHandler GetHandler() - { - if (!registeredHandlers.ContainsKey(typeof(T).Name)) - return null; + /// + /// Returns a handler based on the type + /// + /// + /// + public ITransformationHandler GetHandler() + { + if (!registeredHandlers.ContainsKey(typeof(T).Name)) + return null; - return registeredHandlers[typeof(T).Name]; - } + return registeredHandlers[typeof(T).Name]; } } diff --git a/src/JsonToJsonMapper/Handlers/TransposeHandler.cs b/src/JsonToJsonMapper/Handlers/TransposeHandler.cs index a8d436b..cb02c77 100644 --- a/src/JsonToJsonMapper/Handlers/TransposeHandler.cs +++ b/src/JsonToJsonMapper/Handlers/TransposeHandler.cs @@ -1,46 +1,44 @@ -using System.Collections.Generic; +namespace JsonToJsonMapper; + using Newtonsoft.Json.Linq; -namespace JsonToJsonMapper +public class TransposeHandler : ITransformationHandler { - public class TransposeHandler : ITransformationHandler + /// + /// Transposes an array into properties + /// + /// + /// + /// + public dynamic Run(JObject rule, JObject input) { - /// - /// Transposes an array into properties - /// - /// - /// - /// - public dynamic Run(JObject rule, JObject input) + var sourceColumn = rule["SourceColumn"].Value(); + var transformValueKey = rule["TransformValue"]["KeyLookupField"].Value(); + var transformValuePrependText = rule["TransformValue"]["PrependKeyText"].Value(); + var transformValue = rule["TransformValue"]["ValueLookupField"].Value(); + + var tokens = input.SelectTokens(sourceColumn); + var array = new Dictionary(); + foreach (var i in tokens) { - var sourceColumn = rule["SourceColumn"].Value(); - var transformValueKey = rule["TransformValue"]["KeyLookupField"].Value(); - var transformValuePrependText = rule["TransformValue"]["PrependKeyText"].Value(); - var transformValue = rule["TransformValue"]["ValueLookupField"].Value(); + var key = string.Empty; + var token = i.SelectToken(transformValueKey); + if (token != null) + key = transformValuePrependText + token.ToString().Replace(" ", string.Empty); - var tokens = input.SelectTokens(sourceColumn); - var array = new Dictionary(); - foreach (var i in tokens) + if (!string.IsNullOrWhiteSpace(key)) { - var key = string.Empty; - var token = i.SelectToken(transformValueKey); - if (token != null) - key = transformValuePrependText + token.ToString().Replace(" ", string.Empty); - - if (!string.IsNullOrWhiteSpace(key)) + var valueToken = i.SelectToken(transformValue); + if (valueToken != null) { - var valueToken = i.SelectToken(transformValue); - if (valueToken != null) - { - if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) - array.Add(key, valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); - else if (valueToken.Value() != null) - array.Add(key, valueToken); - } + if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) + array.Add(key, valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); + else if (valueToken.Value() != null) + array.Add(key, valueToken); } } - - return array; } + + return array; } } diff --git a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs index 8452db1..aa91ae2 100644 --- a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs +++ b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs @@ -1,199 +1,196 @@ -using System; +namespace JsonToJsonMapper; + using System.Globalization; -using System.Linq; using System.Text.RegularExpressions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -namespace JsonToJsonMapper +internal class TypeConverterHandler : ITransformationHandler { - internal class TypeConverterHandler : ITransformationHandler + /// + /// Converts value from one type to another + /// + /// + /// + /// + public dynamic Run(JObject config, JObject input) { - /// - /// Converts value from one type to another - /// - /// - /// - /// - public dynamic Run(JObject config, JObject input) - { - var value = input["value"].Value(); - var dataType = config["DataType"].Value(); - var format = config["Format"].Value(); + var value = input["value"].Value(); + var dataType = config["DataType"].Value(); + var format = config["Format"].Value(); - if (value == null || ((JToken)value).Type == JTokenType.Null) - return value; - try + if (value == null || ((JToken)value).Type == JTokenType.Null) + return value; + try + { + if (!string.IsNullOrWhiteSpace(dataType)) { - if (!string.IsNullOrWhiteSpace(dataType)) + switch (dataType.ToUpperInvariant()) { - switch (dataType.ToUpperInvariant()) + case "LONG": + return Convert.ToInt64(value); + case "JOBJECT": + { + var Jtokenvalue = (JToken)value; + if (Jtokenvalue.Type == JTokenType.Object) + return (JObject)Jtokenvalue; + else + return JsonConvert.DeserializeObject(Jtokenvalue.ToString()); + } + case "JARRAY": { - case "LONG": - return Convert.ToInt64(value); - case "JOBJECT": + var Jtokenvalue = (JToken)value; + if (Jtokenvalue.Type == JTokenType.Array) { - var Jtokenvalue = (JToken)value; - if (Jtokenvalue.Type == JTokenType.Object) - return (JObject)Jtokenvalue; + if (Jtokenvalue.Any()) + return (JArray)Jtokenvalue; else - return JsonConvert.DeserializeObject(Jtokenvalue.ToString()); - } - case "JARRAY": - { - var Jtokenvalue = (JToken)value; - if (Jtokenvalue.Type == JTokenType.Array) - { - if (Jtokenvalue.Any()) - return (JArray)Jtokenvalue; - else - return null; - } - else if (Jtokenvalue.Type == JTokenType.Object) - { - return new JArray(Jtokenvalue); - } - else - { - if (Jtokenvalue.ToString().StartsWith("[") && Jtokenvalue.ToString().EndsWith("]")) - { - return JArray.Parse(Jtokenvalue.ToString()); - } - else - return new JArray(Jtokenvalue); - } + return null; } - case "SHORT": - return Convert.ToInt16(value); - case "INT": - case "INTEGER": - return Convert.ToInt32(value); - case "GUID": - return new Guid(value.ToString()); - case "DATETIME": + else if (Jtokenvalue.Type == JTokenType.Object) { - var valueType = value.ToString(); - var x = new Regex(@".*[+-][0-9][0-9][:]"); - if (x.IsMatch(valueType)) - return DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture); - else - return DateTime.Parse(valueType, CultureInfo.InvariantCulture); + return new JArray(Jtokenvalue); } - case "CUSTOMDATETIME": + else { - var valueType = value.ToString(); - var x = new Regex(@".[+-][0-9]{4}"); - if (x.IsMatch(valueType)) + if (Jtokenvalue.ToString().StartsWith("[") && Jtokenvalue.ToString().EndsWith("]")) { - var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - var datetime = valueType.Substring(0, pos); - return datetime; + return JArray.Parse(Jtokenvalue.ToString()); } else - { - return null; - } - } - case "BOOL": - case "BOOLEAN": - return Convert.ToBoolean(value); - case "DECIMAL": - return Convert.ToDecimal(value); - case "DECIMAL?": - { - decimal decimalValue; - if (decimal.TryParse(value.ToString(), out decimalValue)) - return decimalValue; - return null; + return new JArray(Jtokenvalue); } - case "INT?": + } + case "SHORT": + return Convert.ToInt16(value); + case "INT": + case "INTEGER": + return Convert.ToInt32(value); + case "GUID": + return new Guid(value.ToString()); + case "DATETIME": + { + var valueType = value.ToString(); + var x = new Regex(@".*[+-][0-9][0-9][:]"); + if (x.IsMatch(valueType)) + return DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture); + else + return DateTime.Parse(valueType, CultureInfo.InvariantCulture); + } + case "CUSTOMDATETIME": + { + var valueType = value.ToString(); + var x = new Regex(@".[+-][0-9]{4}"); + if (x.IsMatch(valueType)) { - var dval = Convert.ToDecimal(value.ToString()); - return Decimal.ToInt32(dval); + var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + var datetime = valueType.Substring(0, pos); + return datetime; } - case "GUID?": + else { - Guid guid; - if (Guid.TryParse(value.ToString(), out guid)) - return guid; return null; } - case "DATETIME?": + } + case "BOOL": + case "BOOLEAN": + return Convert.ToBoolean(value); + case "DECIMAL": + return Convert.ToDecimal(value); + case "DECIMAL?": + { + decimal decimalValue; + if (decimal.TryParse(value.ToString(), out decimalValue)) + return decimalValue; + return null; + } + case "INT?": + { + var dval = Convert.ToDecimal(value.ToString()); + return Decimal.ToInt32(dval); + } + case "GUID?": + { + Guid guid; + if (Guid.TryParse(value.ToString(), out guid)) + return guid; + return null; + } + case "DATETIME?": + { + DateTime datetime; + if (DateTime.TryParse(value.ToString(), out datetime)) + return datetime; + return null; + } + case "UTCDATETIME": + { + DateTime dateTime; + if (DateTime.TryParse(value.ToString(), out dateTime)) { - DateTime datetime; - if (DateTime.TryParse(value.ToString(), out datetime)) - return datetime; - return null; + var utcDateTime = dateTime.ToString("s"); + var zone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); + utcDateTime = utcDateTime + "+" + zone.BaseUtcOffset.ToString(); + return utcDateTime; } - case "UTCDATETIME": - { - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) - { - var utcDateTime = dateTime.ToString("s"); - var zone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); - utcDateTime = utcDateTime + "+" + zone.BaseUtcOffset.ToString(); - return utcDateTime; - } - return null; - } - case "STRINGTOUTCDATEFORMAT": + return null; + } + case "STRINGTOUTCDATEFORMAT": + { + //This block converts the given date into UTC formatted string, it will not change the TimeZone offset + //compared to previous block. + DateTime dateTime; + if (DateTime.TryParse(value.ToString(), out dateTime)) { - //This block converts the given date into UTC formatted string, it will not change the TimeZone offset - //compared to previous block. - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) - { - var timeInUTCFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); - return timeInUTCFormat; - } - - return null; + var timeInUTCFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); + return timeInUTCFormat; } - case "REMOVEDATETIMEOFFSET": - { - var valueType = value.ToString(); - if (valueType.Contains("Z")) - { - var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - var datetime = valueType.Substring(0, pos + 1); //including 'Z' in the output - return datetime; - } - return valueType; - } - case "FORMATTEDDATETIME": + return null; + } + case "REMOVEDATETIMEOFFSET": + { + var valueType = value.ToString(); + if (valueType.Contains("Z")) { - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) - { - string timeInUTCFormat; - if (!string.IsNullOrWhiteSpace(format)) - timeInUTCFormat = dateTime.ToString(format); - else - timeInUTCFormat = dateTime.ToString(null, CultureInfo.InvariantCulture); - return timeInUTCFormat; - } - - return null; + var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + var datetime = valueType.Substring(0, pos + 1); //including 'Z' in the output + return datetime; } - case "STRING": + + return valueType; + } + case "FORMATTEDDATETIME": + { + DateTime dateTime; + if (DateTime.TryParse(value.ToString(), out dateTime)) { - if (value.GetType().Equals("JValue")) - return ((JValue)value).Value(); + string timeInUTCFormat; + if (!string.IsNullOrWhiteSpace(format)) + timeInUTCFormat = dateTime.ToString(format); else - return value.ToString(); + timeInUTCFormat = dateTime.ToString(null, CultureInfo.InvariantCulture); + return timeInUTCFormat; } + + return null; + } + case "STRING": + { + if (value.GetType().Equals("JValue")) + return ((JValue)value).Value(); + else + return value.ToString(); } } } - catch (Exception ex) - { - throw new Exception("Failed while trying to cast value into " + dataType + ". " + ex.ToString()); - } - - return value; } + catch (Exception ex) + { + throw new Exception("Failed while trying to cast value into " + dataType + ". " + ex.ToString()); + } + + return value; } } diff --git a/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs b/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs index 4096a9e..e176ab4 100644 --- a/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs +++ b/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs @@ -1,37 +1,33 @@ -using System; -using System.Collections.Generic; -using System.Linq; +namespace JsonToJsonMapper; + using Newtonsoft.Json.Linq; -namespace JsonToJsonMapper +public class ValueMappingHandler : ITransformationHandler { - public class ValueMappingHandler : ITransformationHandler + /// + /// Returns value if matches the rule else returns default value. + /// + /// + /// + /// + public dynamic Run(JObject transform, JObject input) { - /// - /// Returns value if matches the rule else returns default value. - /// - /// - /// - /// - public dynamic Run(JObject transform, JObject input) - { - var valueMapping = transform["ValueMapping"].ToObject>(); - var defaultValue = transform["DefaultValue"].Value(); - var value = input["value"].Value(); - - if (transform != null && valueMapping != null && value != null) - value = (from item in valueMapping where item.ExistingValue.Equals(value, StringComparison.OrdinalIgnoreCase) select item.NewValue).FirstOrDefault(); - if (transform != null && string.IsNullOrWhiteSpace(value) && defaultValue != null) - { - if (defaultValue.Equals("UTCNOW", StringComparison.OrdinalIgnoreCase)) - return DateTime.UtcNow.ToString(); - else if (defaultValue.Equals("NEWGUID", StringComparison.OrdinalIgnoreCase)) - return Guid.NewGuid().ToString(); - else - return defaultValue; - } + var valueMapping = transform["ValueMapping"].ToObject>(); + var defaultValue = transform["DefaultValue"].Value(); + var value = input["value"].Value(); - return value; + if (transform != null && valueMapping != null && value != null) + value = (from item in valueMapping where item.ExistingValue.Equals(value, StringComparison.OrdinalIgnoreCase) select item.NewValue).FirstOrDefault(); + if (transform != null && string.IsNullOrWhiteSpace(value) && defaultValue != null) + { + if (defaultValue.Equals("UTCNOW", StringComparison.OrdinalIgnoreCase)) + return DateTime.UtcNow.ToString(); + else if (defaultValue.Equals("NEWGUID", StringComparison.OrdinalIgnoreCase)) + return Guid.NewGuid().ToString(); + else + return defaultValue; } + + return value; } } diff --git a/src/JsonToJsonMapper/JsonTransform.cs b/src/JsonToJsonMapper/JsonTransform.cs index c99bb50..25d32ed 100644 --- a/src/JsonToJsonMapper/JsonTransform.cs +++ b/src/JsonToJsonMapper/JsonTransform.cs @@ -1,16 +1,14 @@ -using System.Collections.Generic; +namespace JsonToJsonMapper; + using Newtonsoft.Json; -namespace JsonToJsonMapper +public class JsonTransform { - public class JsonTransform - { - [JsonExtensionData] - public Dictionary Json { get; set; } + [JsonExtensionData] + public Dictionary Json { get; set; } - public JsonTransform() - { - Json = new Dictionary(); - } + public JsonTransform() + { + Json = new Dictionary(); } } diff --git a/src/JsonToJsonMapper/MappingRule.cs b/src/JsonToJsonMapper/MappingRule.cs index ac275f6..12d3b2f 100644 --- a/src/JsonToJsonMapper/MappingRule.cs +++ b/src/JsonToJsonMapper/MappingRule.cs @@ -1,20 +1,17 @@ -using System.Collections.Generic; +namespace JsonToJsonMapper; -namespace JsonToJsonMapper +public class MappingRule { - public class MappingRule - { - public string DestinationType { get; set; } - public string DataType { get; set; } - public string Node { get; set; } - public bool IgnoreEmptyArray { get; set; } + public string DestinationType { get; set; } + public string DataType { get; set; } + public string Node { get; set; } + public bool IgnoreEmptyArray { get; set; } - public bool IgnoreNullValue { get; set; } = true; - public List TruthTable { get; set; } + public bool IgnoreNullValue { get; set; } = true; + public List TruthTable { get; set; } - public MappingRule() - { - TruthTable = new List(); - } + public MappingRule() + { + TruthTable = new List(); } } diff --git a/src/JsonToJsonMapper/Reference.cs b/src/JsonToJsonMapper/Reference.cs index 132837f..428028c 100644 --- a/src/JsonToJsonMapper/Reference.cs +++ b/src/JsonToJsonMapper/Reference.cs @@ -1,8 +1,7 @@ -namespace JsonToJsonMapper +namespace JsonToJsonMapper; + +public class Reference { - public class Reference - { - public string Assembly { get; set; } - public string NameSpace { get; set; } - } + public string Assembly { get; set; } + public string NameSpace { get; set; } } diff --git a/src/JsonToJsonMapper/Rule.cs b/src/JsonToJsonMapper/Rule.cs index 3d2ba5c..d53d2fd 100644 --- a/src/JsonToJsonMapper/Rule.cs +++ b/src/JsonToJsonMapper/Rule.cs @@ -1,68 +1,67 @@ -namespace JsonToJsonMapper +namespace JsonToJsonMapper; + +public class Rule { - public class Rule - { - public string SourceColumn { get; set; } - public string DestinationColumn { get; set; } - public string DataType { get; set; } - public string Format { get; set; } - public MappingRule ComplexType { get; set; } - public Transform TransformValue { get; set; } + public string SourceColumn { get; set; } + public string DestinationColumn { get; set; } + public string DataType { get; set; } + public string Format { get; set; } + public MappingRule ComplexType { get; set; } + public Transform TransformValue { get; set; } - public Rule(string sourceColumn, string destinationColumn, string dataType) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - } + public Rule(string sourceColumn, string destinationColumn, string dataType) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + } - public Rule(string sourceColumn, string destinationColumn, string dataType, string format) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - Format = format; - } + public Rule(string sourceColumn, string destinationColumn, string dataType, string format) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + Format = format; + } - public Rule(string sourceColumn, string destinationColumn, string dataType, MappingRule mappingRule) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - ComplexType = mappingRule; - } + public Rule(string sourceColumn, string destinationColumn, string dataType, MappingRule mappingRule) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + ComplexType = mappingRule; + } - public Rule(string sourceColumn, string destinationColumn, string dataType, MappingRule mappingRule, Transform transform) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - ComplexType = mappingRule; - TransformValue = transform; - } + public Rule(string sourceColumn, string destinationColumn, string dataType, MappingRule mappingRule, Transform transform) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + ComplexType = mappingRule; + TransformValue = transform; + } - public Rule(string sourceColumn, string destinationColumn, string dataType, Transform transform) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - TransformValue = transform; - } + public Rule(string sourceColumn, string destinationColumn, string dataType, Transform transform) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + TransformValue = transform; + } - public Rule(string sourceColumn, string destinationColumn, string dataType, string format, Transform transform) - { - SourceColumn = sourceColumn; - DestinationColumn = destinationColumn; - DataType = dataType; - Format = format; - TransformValue = transform; - } + public Rule(string sourceColumn, string destinationColumn, string dataType, string format, Transform transform) + { + SourceColumn = sourceColumn; + DestinationColumn = destinationColumn; + DataType = dataType; + Format = format; + TransformValue = transform; + } - public Rule() - { - SourceColumn = string.Empty; - DestinationColumn = string.Empty; - DataType = string.Empty; - } + public Rule() + { + SourceColumn = string.Empty; + DestinationColumn = string.Empty; + DataType = string.Empty; } } diff --git a/src/JsonToJsonMapper/ScriptDefinitions.cs b/src/JsonToJsonMapper/ScriptDefinitions.cs index e4b48bc..7c05bd6 100644 --- a/src/JsonToJsonMapper/ScriptDefinitions.cs +++ b/src/JsonToJsonMapper/ScriptDefinitions.cs @@ -1,12 +1,11 @@ -using Microsoft.CodeAnalysis.Scripting; +namespace JsonToJsonMapper; -namespace JsonToJsonMapper +using Microsoft.CodeAnalysis.Scripting; + +public class ScriptDefinitions { - public class ScriptDefinitions - { - public string Name { get; set; } - public string Code { get; set; } - public Script ScriptIL { get; set; } - public Reference Reference { get; set; } - } + public string Name { get; set; } + public string Code { get; set; } + public Script ScriptIL { get; set; } + public Reference Reference { get; set; } } diff --git a/src/JsonToJsonMapper/ScriptHost.cs b/src/JsonToJsonMapper/ScriptHost.cs index 1b26d86..a35ac4c 100644 --- a/src/JsonToJsonMapper/ScriptHost.cs +++ b/src/JsonToJsonMapper/ScriptHost.cs @@ -1,7 +1,6 @@ -namespace JsonToJsonMapper +namespace JsonToJsonMapper; + +public class ScriptHost { - public class ScriptHost - { - public string Args { get; set; } - } + public string Args { get; set; } } diff --git a/src/JsonToJsonMapper/Transform.cs b/src/JsonToJsonMapper/Transform.cs index dd92cfa..9353924 100644 --- a/src/JsonToJsonMapper/Transform.cs +++ b/src/JsonToJsonMapper/Transform.cs @@ -1,22 +1,19 @@ -using System.Collections.Generic; +namespace JsonToJsonMapper; -namespace JsonToJsonMapper +public class Transform { - public class Transform - { - public string Type { get; set; } - public string PrependKeyText { get; set; } - public List ValueMapping { get; set; } - public string DefaultValue { get; set; } - public string ScriptName { get; set; } - public List Params { get; set; } - public string KeyLookupField { get; set; } - public string ValueLookupField { get; set; } - public string Function { get; set; } - public string Delimeter { get; set; } - public string CompareToValue { get; set; } - public string ReturnValue { get; set; } - public string IgnoreEmptyParams { get; set; } - public int Index { get; set; } - } + public string Type { get; set; } + public string PrependKeyText { get; set; } + public List ValueMapping { get; set; } + public string DefaultValue { get; set; } + public string ScriptName { get; set; } + public List Params { get; set; } + public string KeyLookupField { get; set; } + public string ValueLookupField { get; set; } + public string Function { get; set; } + public string Delimeter { get; set; } + public string CompareToValue { get; set; } + public string ReturnValue { get; set; } + public string IgnoreEmptyParams { get; set; } + public int Index { get; set; } } diff --git a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index 10f9447..e76e076 100644 --- a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -1,1415 +1,1412 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Newtonsoft.Json.Linq; +namespace MipUnitTest; + using JsonToJsonMapper; -using System.IO; +using Microsoft.VisualStudio.TestTools.UnitTesting; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; -namespace MipUnitTest +[TestClass] +public class AutoMapperTest { - [TestClass] - public class AutoMapperTest - { - //Test - [TestMethod, Description("Validate that the exception is thrown by auto mapper if mapping json is invalid")] - public void Validate_AutoMapper_ExceptionThrownByInvalidMappingJson() - { - // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - var inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; - - //Act - try - { - var mapper = new AutoMapper(mappingJson); - var lead = mapper.TransformIntoJson(inputJson, true); - Assert.Fail(); - } - catch (Exception ex) - { - //Assert - Assert.IsTrue(string.Equals(ex.Message, string.Format("Invalid mapping json"))); - } - } - - [TestMethod, Description("Validate that the property is not set if value datatype is different that the datatype mentioned in the config.")] - public void Validate_AutoMapper_InvalidDatatype() - { - // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - var inputJson = - "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100a}"; - - try - { - //Act - var mapper = new AutoMapper(mappingJson); - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.Fail(); - } - catch (Exception ex) - { - //Assert - Assert.AreEqual(ex.Message, "Invalid mapping json"); - } - } - - [TestMethod, Description("Validate that the property is not set if the value is null")] - public void Validate_AutoMapper_NullValue() - { - // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - var inputJson = - "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; + //Test + [TestMethod, Description("Validate that the exception is thrown by auto mapper if mapping json is invalid")] + public void Validate_AutoMapper_ExceptionThrownByInvalidMappingJson() + { + // Arrange + var mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsNull(lead.Name); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } - } + var inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; - [TestMethod, Description("Validate that the property is not set if the value is empty string except if the datatype is string.")] - public void Validate_AutoMapper_EmptyString() + //Act + try { - // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - var inputJson = - "{\"name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"101\"}"; - - //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.AllowEmail == false); - Assert.IsTrue(lead.LeadScore == 101); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + var lead = mapper.TransformIntoJson(inputJson, true); + Assert.Fail(); } - - [TestMethod, Description("Validate that the datetime value is not modified due to transformation.")] - public void Validate_AutoMapper_DateTimeValidation() + catch (Exception ex) { - // Arrange - var mappingJson = - @"{ ""MappingRuleConfig"": { ""TruthTable"": [ { ""SourceColumn"": """", ""DestinationColumn"": ""EventId"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""-1"" } }, { ""SourceColumn"": ""$.MifContext.correlationId"", ""DestinationColumn"": ""Token"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""SchemaName"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""JournalEvents.EventCore.SessionScanData"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""Content"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""ContentObject"", ""DataType"": ""string"", ""ComplexType"": { ""DataType"": ""JArray"", ""Node"": ""$.GetReportResponse[*].GetReportResult[*].diffgr:diffgram[*].DocumentElement[*].['Session Scan Data']"", ""TruthTable"": [ { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.id"", ""DestinationColumn"": ""EventKey"", ""DataType"": ""string"" }, { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.name"", ""DestinationColumn"": ""EventName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Event ID"", ""DestinationColumn"": ""EventID"", ""DataType"": ""int"" }, { ""SourceColumn"": ""RegStatusID"", ""DestinationColumn"": ""RegStatusID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Registrant ID"", ""DestinationColumn"": ""RegistrantID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Type"", ""DestinationColumn"": ""Type"", ""DataType"": ""string"" }, { ""SourceColumn"": ""First Name"", ""DestinationColumn"": ""FirstName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Last Name"", ""DestinationColumn"": ""LastName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Email"", ""DestinationColumn"": ""Email"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignedUp"", ""DestinationColumn"": ""SignedUp"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignupInsertDate"", ""DestinationColumn"": ""SignupInsertDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationSignupModifiedDate"", ""DestinationColumn"": ""PresentationSignupModifiedDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Code"", ""DestinationColumn"": ""SessionCode"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Title"", ""DestinationColumn"": ""SessionTitle"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Start Time"", ""DestinationColumn"": ""StartTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""End Time"", ""DestinationColumn"": ""EndTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Track"", ""DestinationColumn"": ""Track"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationCheckedInDate"", ""DestinationColumn"": ""PresentationCheckedInDate"", ""DataType"": ""string"" } ] } }, { ""SourceColumn"": """", ""DestinationColumn"": ""EventDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""CreatedDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } } ] }}"; + //Assert + Assert.IsTrue(string.Equals(ex.Message, string.Format("Invalid mapping json"))); + } + } - var inputJson = - @"{ ""GetReportResponse"": [ { ""@xmlns"": ""https://api.eventcore.com/"", ""GetReportResult"": [ { ""diffgr:diffgram"": [ { ""@xmlns:msdata"": ""urn:schemas-microsoft-com:xml-msdata"", ""@xmlns:diffgr"": ""urn:schemas-microsoft-com:xml-diffgram-v1"", ""DocumentElement"": [ { ""@xmlns"": """", ""Session Scan Data"": [ { ""@diffgr:id"": ""Session Scan Data1"", ""@msdata:rowOrder"": ""0"", ""@diffgr:hasChanges"": ""inserted"", ""Event ID"": ""14337"", ""RegStatusID"": ""7"", ""Registrant ID"": ""2017054"", ""Type"": ""General Attendee"", ""First Name"": ""emad"", ""Last Name"": ""AbuAljazer "", ""Email"": ""jazer313@hotmail.com"", ""SignedUp"": ""true"", ""SignupInsertDate"": ""2015-10-29T07:48:27.767-07:00"", ""PresentationSignupModifiedDate"": ""2015-10-29T07:48:27.767-07:00"", ""Session Code"": ""ITPRO17"", ""Session Title"": ""Deploy virtual machines in the cloud part II"", ""Start Time"": ""11/02/2015 15:15:00 -08:00"", ""End Time"": ""11/02/2015 16:30:00 -08:00"", ""Track"": ""IT Professional"" } ] } ] } ] } ], ""recordCount"": ""-1"" } ], ""MifContext"": { ""runImmediate"": true, ""runId"": ""b8cb0be4-2375-4de2-9781-15dbbf8bc9b3"", ""TrackingEnabled"": false, ""WorkFlowName"": ""EventCoreSessionScanDataToEDP"", ""moreData"": ""true"", ""start_Index"": 501, ""end_Index"": 1000, ""correlationId"": ""8ab25b61-ec8a-4b40-8189-4b77f4f3cbf5"" }, ""ForEachContext"": { ""id"": ""8707"", ""name"": ""MGX FY14"" }}"; + [TestMethod, Description("Validate that the property is not set if value datatype is different that the datatype mentioned in the config.")] + public void Validate_AutoMapper_InvalidDatatype() + { + // Arrange + var mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + var inputJson = + "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100a}"; + try + { //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = mapper.TransformIntoJson(inputJson, true); - - Assert.IsTrue(lead.Contains("2015-10-29T07:48:27.767-07:00") && lead.Contains("2015-10-29T07:48:27.767-07:00") - && lead.Contains("11/02/2015 15:15:00 -08:00") && lead.Contains("11/02/2015 16:30:00 -08:00") && lead.Contains("8707")); - } - catch (Exception) - { - Assert.Fail(); - } + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.Fail(); } - - [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] - public void Validate_AutoMapper_DefaultValue1() + catch (Exception ex) { - // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":null,\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - var inputJson = - "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "NA"); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + //Assert + Assert.AreEqual(ex.Message, "Invalid mapping json"); } + } - [TestMethod, Description("Validate that the property is mapped according to input value.")] - public void Validate_AutoMapper_DefaultValue2() - { - // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + [TestMethod, Description("Validate that the property is not set if the value is null")] + public void Validate_AutoMapper_NullValue() + { + // Arrange + var mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = - "{\"Name\": \"1\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; + var inputJson = + "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "true"); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsNull(lead.Name); } - - [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] - public void Validate_AutoMapper_DefaultValue3() + catch (Exception ex) { - // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - - var inputJson = - "{\"Name\": \"22\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "NA"); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + Assert.Fail(ex.Message); } + } - [TestMethod, Description("Validate that the property is set to custom value if the value passed is empty.")] - public void Validate_AutoMapper_EmptyValue() - { - // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": false},{\"ExistingValue\": \"\",\"NewValue\": true}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + [TestMethod, Description("Validate that the property is not set if the value is empty string except if the datatype is string.")] + public void Validate_AutoMapper_EmptyString() + { + // Arrange + var mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = - "{\"Name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; + var inputJson = + "{\"name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"101\"}"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "true"); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.AllowEmail == false); + Assert.IsTrue(lead.LeadScore == 101); } - - [TestMethod, Description("Complex transformation test - Validate that the value returned is a complex type.")] - public void Complex2FlatTransformationTest() + catch (Exception ex) { - //Arrange - Certain input json with complex object - var inputJson = - "{\"dateCreated\": \"2015-08-31T14:30:00\", \"accountCode\": \"Cross-Product\", \"isActive\": true, \"isHotel\": false, \"isPreferred\": false, \"brandFrnId\": null, \"chainFrnId\": null, \"locationType\": \"Venue\", \"largestSpace\": null, \"numberOfMeetRooms\": null, \"numberOfRooms\": null, \"totalSpace\": null, \"address\": { \"line1\": \"750 Main Street\", \"line2\": null, \"line3\": null, \"line4\": null, \"city\": \"Moncton\", \"state\": \"New Brunswick\", \"postalCode\": \"E1C 1E6\", \"country\": \"Canada\", \"intlState\": null }, \"locationThirdParty\": null, \"locationCode\": \"msft_can_delta_monc\", \"desc\": \"\", \"directions\": \"\", \"email\": \"\", \"externalFrnKey\": null, \"fax\": \"\", \"imgAttributes\": \"\", \"imgSrc\": null, \"label\": \"\", \"name\": \"Delta Beausejour Hotel\", \"notes\": \"\", \"organization\": null, \"phone\": \"\", \"tollfree\": \"\", \"url\": \"http://binged.it/1O4l53S\" } "; - var mapping = "{\"MappingRuleConfig\":{\"DestinationType\":\"\",\"SourceObject\":\"\",\"DestinationObject\":\"\",\"TruthTable\":[{\"SourceColumn\":\"$.address['city']\",\"DestinationColumn\":\"City\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['state']\",\"DestinationColumn\":\"State\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['postalCode']\",\"DestinationColumn\":\"PostalCode\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['country']\",\"DestinationColumn\":\"Country\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null}]}}"; + Assert.Fail(ex.Message); + } + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Validate that the datetime value is not modified due to transformation.")] + public void Validate_AutoMapper_DateTimeValidation() + { + // Arrange + var mappingJson = + @"{ ""MappingRuleConfig"": { ""TruthTable"": [ { ""SourceColumn"": """", ""DestinationColumn"": ""EventId"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""-1"" } }, { ""SourceColumn"": ""$.MifContext.correlationId"", ""DestinationColumn"": ""Token"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""SchemaName"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""JournalEvents.EventCore.SessionScanData"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""Content"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""ContentObject"", ""DataType"": ""string"", ""ComplexType"": { ""DataType"": ""JArray"", ""Node"": ""$.GetReportResponse[*].GetReportResult[*].diffgr:diffgram[*].DocumentElement[*].['Session Scan Data']"", ""TruthTable"": [ { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.id"", ""DestinationColumn"": ""EventKey"", ""DataType"": ""string"" }, { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.name"", ""DestinationColumn"": ""EventName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Event ID"", ""DestinationColumn"": ""EventID"", ""DataType"": ""int"" }, { ""SourceColumn"": ""RegStatusID"", ""DestinationColumn"": ""RegStatusID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Registrant ID"", ""DestinationColumn"": ""RegistrantID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Type"", ""DestinationColumn"": ""Type"", ""DataType"": ""string"" }, { ""SourceColumn"": ""First Name"", ""DestinationColumn"": ""FirstName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Last Name"", ""DestinationColumn"": ""LastName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Email"", ""DestinationColumn"": ""Email"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignedUp"", ""DestinationColumn"": ""SignedUp"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignupInsertDate"", ""DestinationColumn"": ""SignupInsertDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationSignupModifiedDate"", ""DestinationColumn"": ""PresentationSignupModifiedDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Code"", ""DestinationColumn"": ""SessionCode"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Title"", ""DestinationColumn"": ""SessionTitle"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Start Time"", ""DestinationColumn"": ""StartTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""End Time"", ""DestinationColumn"": ""EndTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Track"", ""DestinationColumn"": ""Track"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationCheckedInDate"", ""DestinationColumn"": ""PresentationCheckedInDate"", ""DataType"": ""string"" } ] } }, { ""SourceColumn"": """", ""DestinationColumn"": ""EventDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""CreatedDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } } ] }}"; - //Act - var flatObject = JObject.Parse(mapper.TransformIntoJson(inputJson, false)); + var inputJson = + @"{ ""GetReportResponse"": [ { ""@xmlns"": ""https://api.eventcore.com/"", ""GetReportResult"": [ { ""diffgr:diffgram"": [ { ""@xmlns:msdata"": ""urn:schemas-microsoft-com:xml-msdata"", ""@xmlns:diffgr"": ""urn:schemas-microsoft-com:xml-diffgram-v1"", ""DocumentElement"": [ { ""@xmlns"": """", ""Session Scan Data"": [ { ""@diffgr:id"": ""Session Scan Data1"", ""@msdata:rowOrder"": ""0"", ""@diffgr:hasChanges"": ""inserted"", ""Event ID"": ""14337"", ""RegStatusID"": ""7"", ""Registrant ID"": ""2017054"", ""Type"": ""General Attendee"", ""First Name"": ""emad"", ""Last Name"": ""AbuAljazer "", ""Email"": ""jazer313@hotmail.com"", ""SignedUp"": ""true"", ""SignupInsertDate"": ""2015-10-29T07:48:27.767-07:00"", ""PresentationSignupModifiedDate"": ""2015-10-29T07:48:27.767-07:00"", ""Session Code"": ""ITPRO17"", ""Session Title"": ""Deploy virtual machines in the cloud part II"", ""Start Time"": ""11/02/2015 15:15:00 -08:00"", ""End Time"": ""11/02/2015 16:30:00 -08:00"", ""Track"": ""IT Professional"" } ] } ] } ] } ], ""recordCount"": ""-1"" } ], ""MifContext"": { ""runImmediate"": true, ""runId"": ""b8cb0be4-2375-4de2-9781-15dbbf8bc9b3"", ""TrackingEnabled"": false, ""WorkFlowName"": ""EventCoreSessionScanDataToEDP"", ""moreData"": ""true"", ""start_Index"": 501, ""end_Index"": 1000, ""correlationId"": ""8ab25b61-ec8a-4b40-8189-4b77f4f3cbf5"" }, ""ForEachContext"": { ""id"": ""8707"", ""name"": ""MGX FY14"" }}"; - //Assert - Assert.AreEqual(flatObject.HasValues, true); - Assert.AreEqual(flatObject.Count, 4); - } - [TestMethod, Description("Transpose handler test - Validate that the value returned is transposed.")] - public void PromoteAttributesToPropertyTestWithoutPrependKeyText() + //Act + var mapper = new AutoMapper(mappingJson); + try { - //Arrange - Certain input json with complex object - var inputJson = - "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; - var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; - - var mapper = new AutoMapper(mapping); + var lead = mapper.TransformIntoJson(inputJson, true); - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""SourceType"":""Webpagevisit"",""SourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""ClientIPAddress"":""203.141.7.100"",""UserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""WebpageID"":4,""WebpageURL"":""/anti-phishing.html""}]}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); - //Assert - Assert.AreEqual(value, expectedResponse); + Assert.IsTrue(lead.Contains("2015-10-29T07:48:27.767-07:00") && lead.Contains("2015-10-29T07:48:27.767-07:00") + && lead.Contains("11/02/2015 15:15:00 -08:00") && lead.Contains("11/02/2015 16:30:00 -08:00") && lead.Contains("8707")); } - - [TestMethod, Description("Transpose handler test - Validate that the value returned is transposed with prepend key text.")] - public void PromoteAttributesToPropertyTestWithPrependKeyText() + catch (Exception) { - //Arrange - Certain input json with complex object - var inputJson = - "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; - var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"PrependKeyText\":\"Attribute\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; + Assert.Fail(); + } + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] + public void Validate_AutoMapper_DefaultValue1() + { + // Arrange + var mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":null,\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""AttributeSourceType"":""Webpagevisit"",""AttributeSourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""AttributeClientIPAddress"":""203.141.7.100"",""AttributeUserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""AttributeWebpageID"":4,""AttributeWebpageURL"":""/anti-phishing.html""}]}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); - //Assert - Assert.IsTrue(value.Contains("AttributeWebpageURL")); - Assert.AreEqual(value, expectedResponse); - } + var inputJson = + "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - [TestMethod, Description("Roslyn script handler test - Validate that the value returned is after executing the script.")] - public void RoslynTest() + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.Name == "NA"); + } + catch (Exception ex) { - //Arrange - Certain input json with complex object - var inputJson = - "{\r\n \"eventCode\": \"APAC-1PWBNR3-0331-16-HQ\",\r\n \"pkEventId\": \"0x449740001\",\r\n \"eventId\": \"2353\",\r\n \"externalKey\": \"AP-Azure-WBNR-FY16-03Mar-31-Win10_Device_Management\",\r\n \"accountCode\": \"C-and-E\",\r\n \"eventName\": \"Windows 10 for device management\",\r\n \"url\": null,\r\n \"autoCalcCode\": false,\r\n \"isTestMode\": false,\r\n \"isActive\": true,\r\n \"isTemplate\": false,\r\n \"isLocked\": true,\r\n \"isClassic\": true,\r\n \"eventStatus\": \"Live\",\r\n \"isPending\": false,\r\n \"isDesign\": false,\r\n \"isTesting\": false,\r\n \"isOnsite\": false,\r\n \"isOffline\": false,\r\n \"isClosed\": false,\r\n \"isNotificationEnabled\": false,\r\n \"notes\": \"\",\r\n \"contact\": {\r\n \"contactName\": \"Microsoft SQL Team\",\r\n \"organization\": \"\",\r\n \"email\": \"b-dikurn@microsoft.com\",\r\n \"phone\": \"\",\r\n \"tollfree\": \"\",\r\n \"fax\": \"\",\r\n \"url\": \"\",\r\n \"notes\": \"\"\r\n },\r\n \"location\": {\r\n \"locationName\": \"Webinar\",\r\n \"locationCode\": \"Webinar\",\r\n \"email\": null,\r\n \"phone\": null,\r\n \"tollfree\": null,\r\n \"fax\": null,\r\n \"url\": null,\r\n \"notes\": null\r\n },\r\n \"dateCreated\": \"2016-02-17T15:59:42\",\r\n \"dateModified\": \"2016-02-19T14:21:21\",\r\n \"startDate\": \"2016-03-31T08:00:00\",\r\n \"endDate\": \"2016-03-31T16:00:00\",\r\n \"dateClosed\": null,\r\n \"txtEvtCreatedBy\": \"Samuel Pak\",\r\n \"txtEvtModifiedBy\": \"Maha Pasha\",\r\n \"glNumber\": \"\",\r\n \"timezone\": \"(GMT+05:00) Islamabad, Karachi, Tashkent\",\r\n \"timezoneMapping\": \"Asia/Karachi\",\r\n \"timezoneId\": 85,\r\n \"proposedLocation\": null,\r\n \"plannedAttendance\": null,\r\n \"proposedBudget\": null,\r\n \"plannedCurrency\": null,\r\n \"travelAccoCurrency\": null,\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionField\": \"evt_ans_field19\",\r\n \"questionId\": 638,\r\n \"questionCode\": \"Design-LPHeroImg\",\r\n \"questionName\": \"Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"https://info.microsoft.com/rs/157-GQE-382/images/ms-win10-webinar-banners-3000x300-04.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field24\",\r\n \"questionId\": 996,\r\n \"questionCode\": \"Design-EmailBannerImg\",\r\n \"questionName\": \"Design-EmailBannerImg \",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field16\",\r\n \"questionId\": 398,\r\n \"questionCode\": \"Program-BannerText\",\r\n \"questionName\": \"Program-BannerText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Microsft Event Banner Title\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field20\",\r\n \"questionId\": 639,\r\n \"questionCode\": \"Design-BannerTextColor\",\r\n \"questionName\": \"Design-BannerTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field17\",\r\n \"questionId\": 633,\r\n \"questionCode\": \"Design-HeaderTextColor\",\r\n \"questionName\": \"Design-HeaderTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#333333\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field06\",\r\n \"questionId\": 152,\r\n \"questionCode\": \"Program-HeaderText\",\r\n \"questionName\": \"Program-HeaderText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Windows 10 for device management\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field07\",\r\n \"questionId\": 153,\r\n \"questionCode\": \"Program-Description\",\r\n \"questionName\": \"Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"A\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field09\",\r\n \"questionId\": 229,\r\n \"questionCode\": \"Program-AdditionalInfo\",\r\n \"questionName\": \"Program-AdditionalInfo\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"B\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field21\",\r\n \"questionId\": 640,\r\n \"questionCode\": \"Design-HighlightColor\",\r\n \"questionName\": \"Design-HighlightColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field22\",\r\n \"questionId\": 641,\r\n \"questionCode\": \"Design-HighlightTextColor\",\r\n \"questionName\": \"Design-HighlightTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field01\",\r\n \"questionId\": 147,\r\n \"questionCode\": \"Hero Banner Image\",\r\n \"questionName\": \"Hero Banner Image\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"EN-BASICE-Banner-PeopleWithDevices.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field02\",\r\n \"questionId\": 37143,\r\n \"questionCode\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"questionName\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field30\",\r\n \"questionId\": 649,\r\n \"questionCode\": \"DELETED-Program-Description\",\r\n \"questionName\": \"DELETED-Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n \"groups\": null,\r\n \"rotations\": null,\r\n \"forms\": null,\r\n \"websites\": null,\r\n \"primaryFormURL\": \"/profile/form/index.cfm?PKformID=0x1084150001\",\r\n \"questionAssignments\": null\r\n}"; - var mapping = - "{\r\n \"Scripts\": [\r\n {\r\n \"Name\": \"GetTitle\",\r\n \"Code\": \"string GetTitle(string args){string[] input = args.Split(new string[] {\\\"[delimiter]\\\"}, System.StringSplitOptions.None);string[] data = null; var title = string.Empty;for (int i = 0; i < input.Length; i++){if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")){title = input[i];break;}if (input[i].Contains(\\\"tokenDelimiter\\\") == true){data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None);for (int x = 0; x < data.Length; x++){if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])){title = data[x].ToString();break;}}}else{continue;}} return title;}GetTitle(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetDescription\",\r\n \"Code\": \"string GetEventDesc(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventDesc = string.Empty; for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventDesc = input[i]; eventDesc = System.Text.RegularExpressions.Regex.Replace(input[i], @\\\"<(.|\\n)*?>\\\", string.Empty); break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] {\\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventDesc = data[x].ToString(); eventDesc = System.Text.RegularExpressions.Regex.Replace(data[x], @\\\"<(.|\\n)*?>\\\", string.Empty); break;} } } else { continue; }} return eventDesc;}GetEventDesc(Args)\",\r\n \"Reference\": {\r\n \"Assembly\": \"System\",\r\n \"NameSpace\": \"System.Text.RegularExpressions\"\r\n }\r\n },\r\n {\r\n \"Name\": \"GetURL\",\r\n \"Code\": \"string GetURL(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventURL = string.Empty;for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventURL = input[i]; break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventURL = data[x].ToString(); break; } } } else { continue; } } if (string.IsNullOrEmpty(eventURL)) return eventURL = \\\"www.microsoft.com\\\"; else return eventURL; }GetURL(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetJsonArray\",\r\n \"Code\": \"string GetJsonArray(string args) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(\\\"[\\\"); foreach (var item in args.Split(',')) { sb.Append(@\\\"\\\"\\\"\\\" + item + @\\\"\\\"\\\",\\\"); } sb.Remove(sb.Length - 1, 1); sb.Append(\\\"]\\\"); return sb.ToString();}GetJsonArray(Args)\"\r\n }\r\n ],\r\n \"MappingRuleConfig\": {\r\n \"DestinationType\": \"EventInformation\",\r\n \"SourceObject\": \"CertainEvents\",\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventList\",\r\n \"DataType\": \"jarray\",\r\n \"ComplexType\": {\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"title\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetTitle\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-HeaderText')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-BannerText')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"accountCode\",\r\n \"DestinationColumn\": \"accountCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventCode\",\r\n \"DestinationColumn\": \"Id\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventStatus\",\r\n \"DestinationColumn\": \"Status\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"timezone\",\r\n \"DestinationColumn\": \"timezone\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"source\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Certain\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventCategory\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Onsite Event\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"startDate\",\r\n \"DestinationColumn\": \"StartDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"endDate\",\r\n \"DestinationColumn\": \"EndDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"$.location['locationName']\",\r\n \"DestinationColumn\": \"locationCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Description\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetDescription\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventAbstract')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-Description')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryLanguage\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Localization-Form-and-Email-Language')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryTargetAudience\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventsFor')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Product\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventProduct')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"EventSource\",\r\n \"DestinationColumn\": \"EventSource\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"$.eventQuestions.question[?(@.questionCode == 'Search-EventIcon')].answers.answer.[0].value\",\r\n \"DestinationColumn\": \"EventIcon\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Category\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"TBD\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"URL\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetURL\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-AlternateRegURL')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'primaryFormURL')].answers.answer.[0].value\"\r\n ]\r\n }\r\n\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"RequestId\",\r\n \"DataType\": \"guid\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"4bfaac9c-1e0d-4620-b9e6-66095376e99a\"\r\n }\r\n }\r\n ]\r\n }\r\n}"; + Assert.Fail(ex.Message); + } + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Validate that the property is mapped according to input value.")] + public void Validate_AutoMapper_DefaultValue2() + { + // Arrange + var mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""EventList"":[{""title"":""Windows 10 for device management"",""accountCode"":""C-and-E"",""Id"":""APAC-1PWBNR3-0331-16-HQ"",""Status"":""Live"",""timezone"":""(GMT+05:00) Islamabad, Karachi, Tashkent"",""source"":""Certain"",""EventCategory"":""Onsite Event"",""StartDate"":""2016-03-31T08:00:00Z"",""EndDate"":""2016-03-31T16:00:00Z"",""locationCode"":""Webinar"",""Description"":""A"",""PrimaryLanguage"":[""""],""PrimaryTargetAudience"":[""""],""Product"":[""""],""Category"":""TBD"",""URL"":""www.microsoft.com""}],""RequestId"":""4bfaac9c-1e0d-4620-b9e6-66095376e99a""}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); - //Assert - Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); - } + var inputJson = + "{\"Name\": \"1\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - [TestMethod, Description("Parent data test - Validate that the value returned is from the parent JObject.")] - public void ParentDataTest() + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.Name == "true"); + } + catch (Exception ex) { - //Arrange - Certain input json with complex object - var inputJson = - "{\r\n \"events\": [\r\n {\r\n \"eventId\": \"100\",\r\n \"eventName\": \"A\",\r\n \"location\": {\r\n \"locationName\": \"Lincoln Square\",\r\n \"locationCode\": \"Lincoln Square\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q1\", \r\n \"questionName\": \"1Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n },\r\n{\r\n \"answerId\": null,\r\n \"value\": \"2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q2\", \r\n \"questionName\": \"2Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"3Consumers,Partners\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n{\r\n \"eventId\": \"200\",\r\n \"eventName\": \"B\",\r\n \"location\": {\r\n \"locationName\": \"Bel\",\r\n \"locationCode\": \"Bel\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q3\", \r\n \"questionName\": \"3Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n \r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q4\", \r\n \"questionName\": \"4Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"4Klo\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n}"; - var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Answers\",\"DataType\":\"string\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.events[*].eventQuestions.question[*].answers.answer\",\"TruthTable\":[{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].eventId\",\"DestinationColumn\":\"eventId\",\"DataType\":\"string\"},{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].questionId\",\"DestinationColumn\":\"questionId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerId\",\"DestinationColumn\":\"answerId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerCode\",\"DestinationColumn\":\"answerCode\",\"DataType\":\"string\"},{\"SourceColumn\":\"value\",\"DestinationColumn\":\"value\",\"DataType\":\"string\"}]}}]}}"; + Assert.Fail(ex.Message); + } + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] + public void Validate_AutoMapper_DefaultValue3() + { + // Arrange + var mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""Answers"":[{""eventId"":""100"",""questionId"":""Q1"",""value"":""1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q1"",""value"":""2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q2"",""value"":""3Consumers,Partners""},{""eventId"":""200"",""questionId"":""Q3""},{""eventId"":""200"",""questionId"":""Q4"",""value"":""4Klo""}]}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); - //Assert - Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); - } + var inputJson = + "{\"Name\": \"22\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned.")] - public void Validate_ValueMappingHandler_DefaultValue() + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"Certain\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - var input = "{\"value\":null}"; - - //Act - ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - Assert.IsTrue(response == "Certain"); - } - catch (Exception) - { - Assert.Fail(); - } + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.Name == "NA"); } - - [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is UTC now.")] - public void Validate_ValueMappingHandler_DefaultValue_UtcNow() + catch (Exception ex) { - // Arrange - var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - var input = "{\"value\":null}"; + Assert.Fail(ex.Message); + } + } - //Act - ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - DateTime date; - Assert.IsTrue(DateTime.TryParse(response, out date)); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is new Guid.")] - public void Validate_ValueMappingHandler_DefaultValue_Guid() - { - // Arrange - var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"NewGuid\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - var input = "{\"value\":null}"; + [TestMethod, Description("Validate that the property is set to custom value if the value passed is empty.")] + public void Validate_AutoMapper_EmptyValue() + { + // Arrange + var mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": false},{\"ExistingValue\": \"\",\"NewValue\": true}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - //Act - ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - Guid guid; - Assert.IsTrue(Guid.TryParse(response, out guid)); - } - catch (Exception) - { - Assert.Fail(); - } - } - - [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is mapped.")] - public void Validate_ValueMappingHandler_DefaultValue_Mapping() - { - // Arrange - var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": 1},{\"ExistingValue\": \"1\",\"NewValue\": 2}, {\"ExistingValue\": \"0\",\"NewValue\": -1}],\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - var input = "{\"value\":\"1\"}"; + var inputJson = + "{\"Name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; - //Act - ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - Assert.IsTrue(response == "2"); - } - catch (Exception) - { - Assert.Fail(); - } + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.Name == "true"); } - - [TestMethod, Description("Function handler test - Validate that the value returned is concatenated.")] - public void FunctionTest_ConCat() + catch (Exception ex) { - //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": [{""questionField"": ""evt_ans_field19"",""questionId"": 638,""questionCode"": ""Design-LPHeroImg"",""questionName"": ""Design-LPHeroImg"",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""https://info.microsoft.com""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""First answer""},{""answerId"": null,""answerCode"": null,""value"": ""Last answer""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": """"}]}}]}}"; - var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + Assert.Fail(ex.Message); + } + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Complex transformation test - Validate that the value returned is a complex type.")] + public void Complex2FlatTransformationTest() + { + //Arrange - Certain input json with complex object + var inputJson = + "{\"dateCreated\": \"2015-08-31T14:30:00\", \"accountCode\": \"Cross-Product\", \"isActive\": true, \"isHotel\": false, \"isPreferred\": false, \"brandFrnId\": null, \"chainFrnId\": null, \"locationType\": \"Venue\", \"largestSpace\": null, \"numberOfMeetRooms\": null, \"numberOfRooms\": null, \"totalSpace\": null, \"address\": { \"line1\": \"750 Main Street\", \"line2\": null, \"line3\": null, \"line4\": null, \"city\": \"Moncton\", \"state\": \"New Brunswick\", \"postalCode\": \"E1C 1E6\", \"country\": \"Canada\", \"intlState\": null }, \"locationThirdParty\": null, \"locationCode\": \"msft_can_delta_monc\", \"desc\": \"\", \"directions\": \"\", \"email\": \"\", \"externalFrnKey\": null, \"fax\": \"\", \"imgAttributes\": \"\", \"imgSrc\": null, \"label\": \"\", \"name\": \"Delta Beausejour Hotel\", \"notes\": \"\", \"organization\": null, \"phone\": \"\", \"tollfree\": \"\", \"url\": \"http://binged.it/1O4l53S\" } "; + var mapping = "{\"MappingRuleConfig\":{\"DestinationType\":\"\",\"SourceObject\":\"\",\"DestinationObject\":\"\",\"TruthTable\":[{\"SourceColumn\":\"$.address['city']\",\"DestinationColumn\":\"City\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['state']\",\"DestinationColumn\":\"State\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['postalCode']\",\"DestinationColumn\":\"PostalCode\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['country']\",\"DestinationColumn\":\"Country\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.com,Hello world!\"},{\"title\":\"First answer,Last answer,Hello world!\"},{\"title\":\",Hello world!\"}]}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var flatObject = JObject.Parse(mapper.TransformIntoJson(inputJson, false)); - [TestMethod, Description("Function handler test - Validate that the value returned is concatenated when delimeter is null.")] - public void FunctionTest_ConCat_WithoutDelimeter() - { - //Arrange - Certain input json with complex object - var inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; - var mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value','Hello world!']}}]}}]}}"; + //Assert + Assert.AreEqual(flatObject.HasValues, true); + Assert.AreEqual(flatObject.Count, 4); + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Transpose handler test - Validate that the value returned is transposed.")] + public void PromoteAttributesToPropertyTestWithoutPrependKeyText() + { + //Arrange - Certain input json with complex object + var inputJson = + "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; + var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""SourceType"":""Webpagevisit"",""SourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""ClientIPAddress"":""203.141.7.100"",""UserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""WebpageID"":4,""WebpageURL"":""/anti-phishing.html""}]}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert + Assert.AreEqual(value, expectedResponse); + } - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.comHello world!\"},{\"title\":\"First answerLast answerHello world!\"},{\"title\":\"Hello world!\"}]}"; + [TestMethod, Description("Transpose handler test - Validate that the value returned is transposed with prepend key text.")] + public void PromoteAttributesToPropertyTestWithPrependKeyText() + { + //Arrange - Certain input json with complex object + var inputJson = + "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; + var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"PrependKeyText\":\"Attribute\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""AttributeSourceType"":""Webpagevisit"",""AttributeSourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""AttributeClientIPAddress"":""203.141.7.100"",""AttributeUserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""AttributeWebpageID"":4,""AttributeWebpageURL"":""/anti-phishing.html""}]}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert + Assert.IsTrue(value.Contains("AttributeWebpageURL")); + Assert.AreEqual(value, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Roslyn script handler test - Validate that the value returned is after executing the script.")] + public void RoslynTest() + { + //Arrange - Certain input json with complex object + var inputJson = + "{\r\n \"eventCode\": \"APAC-1PWBNR3-0331-16-HQ\",\r\n \"pkEventId\": \"0x449740001\",\r\n \"eventId\": \"2353\",\r\n \"externalKey\": \"AP-Azure-WBNR-FY16-03Mar-31-Win10_Device_Management\",\r\n \"accountCode\": \"C-and-E\",\r\n \"eventName\": \"Windows 10 for device management\",\r\n \"url\": null,\r\n \"autoCalcCode\": false,\r\n \"isTestMode\": false,\r\n \"isActive\": true,\r\n \"isTemplate\": false,\r\n \"isLocked\": true,\r\n \"isClassic\": true,\r\n \"eventStatus\": \"Live\",\r\n \"isPending\": false,\r\n \"isDesign\": false,\r\n \"isTesting\": false,\r\n \"isOnsite\": false,\r\n \"isOffline\": false,\r\n \"isClosed\": false,\r\n \"isNotificationEnabled\": false,\r\n \"notes\": \"\",\r\n \"contact\": {\r\n \"contactName\": \"Microsoft SQL Team\",\r\n \"organization\": \"\",\r\n \"email\": \"b-dikurn@microsoft.com\",\r\n \"phone\": \"\",\r\n \"tollfree\": \"\",\r\n \"fax\": \"\",\r\n \"url\": \"\",\r\n \"notes\": \"\"\r\n },\r\n \"location\": {\r\n \"locationName\": \"Webinar\",\r\n \"locationCode\": \"Webinar\",\r\n \"email\": null,\r\n \"phone\": null,\r\n \"tollfree\": null,\r\n \"fax\": null,\r\n \"url\": null,\r\n \"notes\": null\r\n },\r\n \"dateCreated\": \"2016-02-17T15:59:42\",\r\n \"dateModified\": \"2016-02-19T14:21:21\",\r\n \"startDate\": \"2016-03-31T08:00:00\",\r\n \"endDate\": \"2016-03-31T16:00:00\",\r\n \"dateClosed\": null,\r\n \"txtEvtCreatedBy\": \"Samuel Pak\",\r\n \"txtEvtModifiedBy\": \"Maha Pasha\",\r\n \"glNumber\": \"\",\r\n \"timezone\": \"(GMT+05:00) Islamabad, Karachi, Tashkent\",\r\n \"timezoneMapping\": \"Asia/Karachi\",\r\n \"timezoneId\": 85,\r\n \"proposedLocation\": null,\r\n \"plannedAttendance\": null,\r\n \"proposedBudget\": null,\r\n \"plannedCurrency\": null,\r\n \"travelAccoCurrency\": null,\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionField\": \"evt_ans_field19\",\r\n \"questionId\": 638,\r\n \"questionCode\": \"Design-LPHeroImg\",\r\n \"questionName\": \"Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"https://info.microsoft.com/rs/157-GQE-382/images/ms-win10-webinar-banners-3000x300-04.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field24\",\r\n \"questionId\": 996,\r\n \"questionCode\": \"Design-EmailBannerImg\",\r\n \"questionName\": \"Design-EmailBannerImg \",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field16\",\r\n \"questionId\": 398,\r\n \"questionCode\": \"Program-BannerText\",\r\n \"questionName\": \"Program-BannerText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Microsft Event Banner Title\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field20\",\r\n \"questionId\": 639,\r\n \"questionCode\": \"Design-BannerTextColor\",\r\n \"questionName\": \"Design-BannerTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field17\",\r\n \"questionId\": 633,\r\n \"questionCode\": \"Design-HeaderTextColor\",\r\n \"questionName\": \"Design-HeaderTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#333333\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field06\",\r\n \"questionId\": 152,\r\n \"questionCode\": \"Program-HeaderText\",\r\n \"questionName\": \"Program-HeaderText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Windows 10 for device management\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field07\",\r\n \"questionId\": 153,\r\n \"questionCode\": \"Program-Description\",\r\n \"questionName\": \"Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"A\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field09\",\r\n \"questionId\": 229,\r\n \"questionCode\": \"Program-AdditionalInfo\",\r\n \"questionName\": \"Program-AdditionalInfo\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"B\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field21\",\r\n \"questionId\": 640,\r\n \"questionCode\": \"Design-HighlightColor\",\r\n \"questionName\": \"Design-HighlightColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field22\",\r\n \"questionId\": 641,\r\n \"questionCode\": \"Design-HighlightTextColor\",\r\n \"questionName\": \"Design-HighlightTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field01\",\r\n \"questionId\": 147,\r\n \"questionCode\": \"Hero Banner Image\",\r\n \"questionName\": \"Hero Banner Image\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"EN-BASICE-Banner-PeopleWithDevices.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field02\",\r\n \"questionId\": 37143,\r\n \"questionCode\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"questionName\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field30\",\r\n \"questionId\": 649,\r\n \"questionCode\": \"DELETED-Program-Description\",\r\n \"questionName\": \"DELETED-Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n \"groups\": null,\r\n \"rotations\": null,\r\n \"forms\": null,\r\n \"websites\": null,\r\n \"primaryFormURL\": \"/profile/form/index.cfm?PKformID=0x1084150001\",\r\n \"questionAssignments\": null\r\n}"; + var mapping = + "{\r\n \"Scripts\": [\r\n {\r\n \"Name\": \"GetTitle\",\r\n \"Code\": \"string GetTitle(string args){string[] input = args.Split(new string[] {\\\"[delimiter]\\\"}, System.StringSplitOptions.None);string[] data = null; var title = string.Empty;for (int i = 0; i < input.Length; i++){if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")){title = input[i];break;}if (input[i].Contains(\\\"tokenDelimiter\\\") == true){data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None);for (int x = 0; x < data.Length; x++){if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])){title = data[x].ToString();break;}}}else{continue;}} return title;}GetTitle(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetDescription\",\r\n \"Code\": \"string GetEventDesc(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventDesc = string.Empty; for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventDesc = input[i]; eventDesc = System.Text.RegularExpressions.Regex.Replace(input[i], @\\\"<(.|\\n)*?>\\\", string.Empty); break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] {\\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventDesc = data[x].ToString(); eventDesc = System.Text.RegularExpressions.Regex.Replace(data[x], @\\\"<(.|\\n)*?>\\\", string.Empty); break;} } } else { continue; }} return eventDesc;}GetEventDesc(Args)\",\r\n \"Reference\": {\r\n \"Assembly\": \"System\",\r\n \"NameSpace\": \"System.Text.RegularExpressions\"\r\n }\r\n },\r\n {\r\n \"Name\": \"GetURL\",\r\n \"Code\": \"string GetURL(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventURL = string.Empty;for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventURL = input[i]; break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventURL = data[x].ToString(); break; } } } else { continue; } } if (string.IsNullOrEmpty(eventURL)) return eventURL = \\\"www.microsoft.com\\\"; else return eventURL; }GetURL(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetJsonArray\",\r\n \"Code\": \"string GetJsonArray(string args) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(\\\"[\\\"); foreach (var item in args.Split(',')) { sb.Append(@\\\"\\\"\\\"\\\" + item + @\\\"\\\"\\\",\\\"); } sb.Remove(sb.Length - 1, 1); sb.Append(\\\"]\\\"); return sb.ToString();}GetJsonArray(Args)\"\r\n }\r\n ],\r\n \"MappingRuleConfig\": {\r\n \"DestinationType\": \"EventInformation\",\r\n \"SourceObject\": \"CertainEvents\",\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventList\",\r\n \"DataType\": \"jarray\",\r\n \"ComplexType\": {\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"title\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetTitle\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-HeaderText')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-BannerText')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"accountCode\",\r\n \"DestinationColumn\": \"accountCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventCode\",\r\n \"DestinationColumn\": \"Id\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventStatus\",\r\n \"DestinationColumn\": \"Status\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"timezone\",\r\n \"DestinationColumn\": \"timezone\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"source\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Certain\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventCategory\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Onsite Event\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"startDate\",\r\n \"DestinationColumn\": \"StartDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"endDate\",\r\n \"DestinationColumn\": \"EndDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"$.location['locationName']\",\r\n \"DestinationColumn\": \"locationCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Description\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetDescription\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventAbstract')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-Description')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryLanguage\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Localization-Form-and-Email-Language')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryTargetAudience\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventsFor')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Product\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventProduct')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"EventSource\",\r\n \"DestinationColumn\": \"EventSource\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"$.eventQuestions.question[?(@.questionCode == 'Search-EventIcon')].answers.answer.[0].value\",\r\n \"DestinationColumn\": \"EventIcon\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Category\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"TBD\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"URL\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetURL\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-AlternateRegURL')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'primaryFormURL')].answers.answer.[0].value\"\r\n ]\r\n }\r\n\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"RequestId\",\r\n \"DataType\": \"guid\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"4bfaac9c-1e0d-4620-b9e6-66095376e99a\"\r\n }\r\n }\r\n ]\r\n }\r\n}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = @"{""EventList"":[{""title"":""Windows 10 for device management"",""accountCode"":""C-and-E"",""Id"":""APAC-1PWBNR3-0331-16-HQ"",""Status"":""Live"",""timezone"":""(GMT+05:00) Islamabad, Karachi, Tashkent"",""source"":""Certain"",""EventCategory"":""Onsite Event"",""StartDate"":""2016-03-31T08:00:00Z"",""EndDate"":""2016-03-31T16:00:00Z"",""locationCode"":""Webinar"",""Description"":""A"",""PrimaryLanguage"":[""""],""PrimaryTargetAudience"":[""""],""Product"":[""""],""Category"":""TBD"",""URL"":""www.microsoft.com""}],""RequestId"":""4bfaac9c-1e0d-4620-b9e6-66095376e99a""}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert + Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); + } + + [TestMethod, Description("Parent data test - Validate that the value returned is from the parent JObject.")] + public void ParentDataTest() + { + //Arrange - Certain input json with complex object + var inputJson = + "{\r\n \"events\": [\r\n {\r\n \"eventId\": \"100\",\r\n \"eventName\": \"A\",\r\n \"location\": {\r\n \"locationName\": \"Lincoln Square\",\r\n \"locationCode\": \"Lincoln Square\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q1\", \r\n \"questionName\": \"1Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n },\r\n{\r\n \"answerId\": null,\r\n \"value\": \"2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q2\", \r\n \"questionName\": \"2Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"3Consumers,Partners\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n{\r\n \"eventId\": \"200\",\r\n \"eventName\": \"B\",\r\n \"location\": {\r\n \"locationName\": \"Bel\",\r\n \"locationCode\": \"Bel\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q3\", \r\n \"questionName\": \"3Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n \r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q4\", \r\n \"questionName\": \"4Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"4Klo\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n}"; + var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Answers\",\"DataType\":\"string\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.events[*].eventQuestions.question[*].answers.answer\",\"TruthTable\":[{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].eventId\",\"DestinationColumn\":\"eventId\",\"DataType\":\"string\"},{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].questionId\",\"DestinationColumn\":\"questionId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerId\",\"DestinationColumn\":\"answerId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerCode\",\"DestinationColumn\":\"answerCode\",\"DataType\":\"string\"},{\"SourceColumn\":\"value\",\"DestinationColumn\":\"value\",\"DataType\":\"string\"}]}}]}}"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = @"{""Answers"":[{""eventId"":""100"",""questionId"":""Q1"",""value"":""1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q1"",""value"":""2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q2"",""value"":""3Consumers,Partners""},{""eventId"":""200"",""questionId"":""Q3""},{""eventId"":""200"",""questionId"":""Q4"",""value"":""4Klo""}]}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert + Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); + } - [TestMethod, Description("Function handler test - Validate that the value returned is concatenated when params collection is null.")] - public void FunctionTest_ConCat_EmptyParamCollection() + [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned.")] + public void Validate_ValueMappingHandler_DefaultValue() + { + // Arrange + var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"Certain\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + var input = "{\"value\":null}"; + + //Act + ITransformationHandler handler = new ValueMappingHandler(); + try + { + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + Assert.IsTrue(response == "Certain"); + } + catch (Exception) { - //Arrange - Certain input json with complex object - var inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; - var mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value1','Hello world!']}}]}}]}}"; + Assert.Fail(); + } + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is UTC now.")] + public void Validate_ValueMappingHandler_DefaultValue_UtcNow() + { + // Arrange + var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + var input = "{\"value\":null}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"}]}"; + //Act + ITransformationHandler handler = new ValueMappingHandler(); + try + { + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + DateTime date; + Assert.IsTrue(DateTime.TryParse(response, out date)); + } + catch (Exception) + { + Assert.Fail(); + } + } - //Assert - Assert.AreEqual(response, expectedResponse); + [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is new Guid.")] + public void Validate_ValueMappingHandler_DefaultValue_Guid() + { + // Arrange + var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"NewGuid\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + var input = "{\"value\":null}"; + + //Act + ITransformationHandler handler = new ValueMappingHandler(); + try + { + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + Guid guid; + Assert.IsTrue(Guid.TryParse(response, out guid)); + } + catch (Exception) + { + Assert.Fail(); } + } + + [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is mapped.")] + public void Validate_ValueMappingHandler_DefaultValue_Mapping() + { + // Arrange + var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": 1},{\"ExistingValue\": \"1\",\"NewValue\": 2}, {\"ExistingValue\": \"0\",\"NewValue\": -1}],\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + var input = "{\"value\":\"1\"}"; - [TestMethod, Description("Function handler test - Validate that the value returned has no empty array.")] - public void IgnoreEmptyArrayTest_True() + //Act + ITransformationHandler handler = new ValueMappingHandler(); + try { - //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":true, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + Assert.IsTrue(response == "2"); + } + catch (Exception) + { + Assert.Fail(); + } + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Function handler test - Validate that the value returned is concatenated.")] + public void FunctionTest_ConCat() + { + //Arrange - Certain input json with complex object + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": [{""questionField"": ""evt_ans_field19"",""questionId"": 638,""questionCode"": ""Design-LPHeroImg"",""questionName"": ""Design-LPHeroImg"",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""https://info.microsoft.com""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""First answer""},{""answerId"": null,""answerCode"": null,""value"": ""Last answer""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": """"}]}}]}}"; + var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.com,Hello world!\"},{\"title\":\"First answer,Last answer,Hello world!\"},{\"title\":\",Hello world!\"}]}"; - [TestMethod, Description("Function handler test - Validate that the value returned is empty array.")] - public void IgnoreEmptyArrayTest_False() - { - //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":false, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Function handler test - Validate that the value returned is concatenated when delimeter is null.")] + public void FunctionTest_ConCat_WithoutDelimeter() + { + //Arrange - Certain input json with complex object + var inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; + var mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value','Hello world!']}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[]}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.comHello world!\"},{\"title\":\"First answerLast answerHello world!\"},{\"title\":\"Hello world!\"}]}"; - [TestMethod, Description("Function handler test - Validate that the value returned is empty array.")] - public void IgnoreEmptyArrayTest_NotSet() - { - //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"", ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Function handler test - Validate that the value returned is concatenated when params collection is null.")] + public void FunctionTest_ConCat_EmptyParamCollection() + { + //Arrange - Certain input json with complex object + var inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; + var mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value1','Hello world!']}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[]}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"}]}"; - [TestMethod, Description("Value handler test - Validate transformation if default value is empty.")] - public void Automapper_EmptyDefaultValueTest() - { - //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - var mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"__meta__Entity\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"GenericPresales\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"EncryptedFields\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \" \" } } ] } } "; + //Assert + Assert.AreEqual(response, expectedResponse); + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Function handler test - Validate that the value returned has no empty array.")] + public void IgnoreEmptyArrayTest_True() + { + //Arrange - Certain input json with complex object + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":true, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"__meta__Entity\":\"GenericPresales\",\"EncryptedFields\":\" \"}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(expectedResponse, response); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{}"; - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value.")] - public void FunctionTest_ReplaceValue() - { - //Arrange - Certain input json with complex object - var inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'httPS://info.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValue','Params':['$.answers.answer[*].value']}}]}}]}}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Function handler test - Validate that the value returned is empty array.")] + public void IgnoreEmptyArrayTest_False() + { + //Arrange - Certain input json with complex object + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":false, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[]}"; - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNode_Failure() - { - //Arrange - Certain input json with complex object + //Assert + Assert.AreEqual(response, expectedResponse); + } - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + [TestMethod, Description("Function handler test - Validate that the value returned is empty array.")] + public void IgnoreEmptyArrayTest_NotSet() + { + //Arrange - Certain input json with complex object + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"", ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'CNE','ReturnValue':'','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var mapper = new AutoMapper(mapping); - var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[]}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"NA\\\"\\r\\n}\"}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Value handler test - Validate transformation if default value is empty.")] + public void Automapper_EmptyDefaultValueTest() + { + //Arrange - Certain input json with complex object + var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + var mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"__meta__Entity\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"GenericPresales\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"EncryptedFields\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \" \" } } ] } } "; - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNode_Sucess() - { - //Arrange - Certain input json with complex object + var mapper = new AutoMapper(mapping); - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"__meta__Entity\":\"GenericPresales\",\"EncryptedFields\":\" \"}"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'Topic','ReturnValue':'RV','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + //Assert + Assert.AreEqual(expectedResponse, response); + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value.")] + public void FunctionTest_ReplaceValue() + { + //Arrange - Certain input json with complex object + var inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'httPS://info.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValue','Params':['$.answers.answer[*].value']}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"RV\\\"\\r\\n}\"}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNode_JsonPath() - { - //Arrange - Certain input json with complex object + //Assert + Assert.AreEqual(response, expectedResponse); + } - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNode_Failure() + { + //Arrange - Certain input json with complex object - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapper = new AutoMapper(mapping); + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'CNE','ReturnValue':'','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"NA\\\"\\r\\n}\"}"; - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() - { - //Arrange - Certain input json with complex object + //Assert + Assert.AreEqual(response, expectedResponse); + } - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": null, }"; + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNode_Sucess() + { + //Arrange - Certain input json with complex object - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapper = new AutoMapper(mapping); + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'Topic','ReturnValue':'RV','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"RV\\\"\\r\\n}\"}"; - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValue_ReturnValue_Node() - { - //Arrange - Certain input json with complex object + //Assert + Assert.AreEqual(response, expectedResponse); + } - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNode_JsonPath() + { + //Arrange - Certain input json with complex object - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapper = new AutoMapper(mapping); + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; - [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNodeTwo() - { - //Arrange - Certain input json with complex object + //Assert + Assert.AreEqual(response, expectedResponse); + } - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": \"+1234565430\", \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Mswide\", }"; + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() + { + //Arrange - Certain input json with complex object - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'MSWide','ReturnValue':'','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": null, }"; - var mapper = new AutoMapper(mapping); + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"\\\"\\r\\n}\"}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; - [TestMethod, Description("Function handler test - Validate the value returned when compareToValue and input value are both null.")] - public void FunctionTest_ReplaceValue_NullCompareToValueAndInputValue_RegexTest() - { - //Arrange - Certain input json - var inputJson = @"{'MessageBody': {'address': null}}"; - var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': 'def' ,'DefaultValue': 'fgh','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValue_ReturnValue_Node() + { + //Arrange - Certain input json with complex object - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"address\":\"def\"}"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - //Assert - Assert.AreEqual(response, expectedResponse); - } + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is null and inputvalue is not null.")] - public void FunctionTest_ReplaceValue_NulllCompareToValue_RegexTest() - { - //Arrange - Certain input json - var inputJson = @"{'MessageBody': {'address': 'abc'}}"; - var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': null ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + var mapper = new AutoMapper(mapping); - var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"address\":\"abc\"}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] + public void FunctionTest_ReplaceValueNodeTwo() + { + //Arrange - Certain input json with complex object - [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is empty.")] - public void FunctionTest_ReplaceValue_EmptyCompareToValue_RegexTest() - { - //Arrange - Certain input json - var inputJson = @"{'MessageBody': {'address': 'abc'}}"; - var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': '' ,'ReturnValue': 'def' ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": \"+1234565430\", \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Mswide\", }"; - var mapper = new AutoMapper(mapping); + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'MSWide','ReturnValue':'','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"address\":\"def\"}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"\\\"\\r\\n}\"}"; - [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is a nonempty,non null regex.")] - public void FunctionTest_ReplaceValue_RegexTest() - { - //Arrange - Certain input json with complex object - var inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'[a-z]+.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValueWithRegexComparison','Params':['$.answers.answer[*].value']}}]}}]}}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Function handler test - Validate the value returned when compareToValue and input value are both null.")] + public void FunctionTest_ReplaceValue_NullCompareToValueAndInputValue_RegexTest() + { + //Arrange - Certain input json + var inputJson = @"{'MessageBody': {'address': null}}"; + var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': 'def' ,'DefaultValue': 'fgh','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; + var mapper = new AutoMapper(mapping); - //Assert - Assert.AreEqual(response, expectedResponse); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"address\":\"def\"}"; - [TestMethod, Description("Value handler test - Validate transformation if ignoreNull is set as false.")] - public void Automapper_IgnoreNullFalseTest() - { - //Arrange - Certain input json with complex object - var inputJson = "{ \"etag\": \"1-null\", \"transactionId\": null, \"completeCollectionSize\": 25, \"size\": 3, \"startingIndex\": 1, \"maxResults\": 3, \"questions\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answer\": [ { \"answerName\": \"answerNameXYZ\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\" } ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answer\": [ ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answer\": [ ] } ] }"; - var mapping = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"EventId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"-1\" } }, { \"SourceColumn\": \"$.MifContext.BatchId\", \"DestinationColumn\": \"BatchId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.correlationId\", \"DestinationColumn\": \"RequestId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.moreEventQuestions\", \"DestinationColumn\": \"MoreResults\", \"DataType\": \"bool\", \"ComplexType\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"SchemaName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"JournalEvents.Certain.EventQuestionAnswersDetail\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Content\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"ContentObject\", \"DataType\": \"string\", \"ComplexType\": { \"DataType\": \"JArray\", \"IgnoreNullValue\": false, \"Node\": \"$.questions[*].answer\", \"TruthTable\": [ { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].accountCode\", \"DestinationColumn\": \"accountCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].eventCode\", \"DestinationColumn\": \"eventCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionName\", \"DestinationColumn\": \"questionName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionLabel\", \"DestinationColumn\": \"questionLabel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionCode\", \"DestinationColumn\": \"questionCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionType\", \"DestinationColumn\": \"questionType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"answerLabel\", \"DestinationColumn\": \"answerLabel\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerCode\", \"DestinationColumn\": \"answerCode\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerName\", \"DestinationColumn\": \"answerName\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } } ] } } ] } }"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - var mapper = new AutoMapper(mapping); + [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is null and inputvalue is not null.")] + public void FunctionTest_ReplaceValue_NulllCompareToValue_RegexTest() + { + //Arrange - Certain input json + var inputJson = @"{'MessageBody': {'address': 'abc'}}"; + var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': null ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; - //Act - var response = mapper.TransformIntoJson(JObject.Parse(inputJson), true); - var expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; - //Assert - Assert.IsTrue(JToken.DeepEquals(response, JObject.Parse(expectedResponse))); - } + var mapper = new AutoMapper(mapping); - [TestMethod, Description("Function handler test - Validate that the value returned is first index after split")] - public void FunctionTest_SplitWithOneIndex() - { - //Arrange - Certain input json with complex object - var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"address\":\"abc\"}"; - var mapper = new AutoMapper(mapping); + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Key\":[{\"Key\":\"12121212333\"}]}"; + [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is empty.")] + public void FunctionTest_ReplaceValue_EmptyCompareToValue_RegexTest() + { + //Arrange - Certain input json + var inputJson = @"{'MessageBody': {'address': 'abc'}}"; + var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': '' ,'ReturnValue': 'def' ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; - //Assert - Assert.AreEqual(response, expectedResponse); - } + var mapper = new AutoMapper(mapping); - [TestMethod, Description("Function handler test - Validate that the value returned is first and second index after split")] - public void FunctionTest_SplitWithTwoIndex() - { - //Arrange - Certain input json with complex object - var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}},{""SourceColumn"":"""",""DestinationColumn"":""Message"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":1,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"address\":\"def\"}"; - var mapper = new AutoMapper(mapping); + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"Key\":\"12121212333\",\"Message\":\"AKJKKAJDKAKJKKKDKSKAK\"}]}"; + [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is a nonempty,non null regex.")] + public void FunctionTest_ReplaceValue_RegexTest() + { + //Arrange - Certain input json with complex object + var inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; + var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'[a-z]+.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValueWithRegexComparison','Params':['$.answers.answer[*].value']}}]}}]}}"; - //Assert - Assert.AreEqual(response, expectedResponse); - } + var mapper = new AutoMapper(mapping); - [TestMethod, Description("Function handler test - Validate Upper case functionality")] - public void FunctionTest_TransformToUpperCase() - { - //Arrange - Certain input json with complex object - var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOUPPERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; - var mapper = new AutoMapper(mapping); + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\"}]}"; + [TestMethod, Description("Value handler test - Validate transformation if ignoreNull is set as false.")] + public void Automapper_IgnoreNullFalseTest() + { + //Arrange - Certain input json with complex object + var inputJson = "{ \"etag\": \"1-null\", \"transactionId\": null, \"completeCollectionSize\": 25, \"size\": 3, \"startingIndex\": 1, \"maxResults\": 3, \"questions\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answer\": [ { \"answerName\": \"answerNameXYZ\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\" } ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answer\": [ ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answer\": [ ] } ] }"; + var mapping = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"EventId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"-1\" } }, { \"SourceColumn\": \"$.MifContext.BatchId\", \"DestinationColumn\": \"BatchId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.correlationId\", \"DestinationColumn\": \"RequestId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.moreEventQuestions\", \"DestinationColumn\": \"MoreResults\", \"DataType\": \"bool\", \"ComplexType\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"SchemaName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"JournalEvents.Certain.EventQuestionAnswersDetail\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Content\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"ContentObject\", \"DataType\": \"string\", \"ComplexType\": { \"DataType\": \"JArray\", \"IgnoreNullValue\": false, \"Node\": \"$.questions[*].answer\", \"TruthTable\": [ { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].accountCode\", \"DestinationColumn\": \"accountCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].eventCode\", \"DestinationColumn\": \"eventCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionName\", \"DestinationColumn\": \"questionName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionLabel\", \"DestinationColumn\": \"questionLabel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionCode\", \"DestinationColumn\": \"questionCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionType\", \"DestinationColumn\": \"questionType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"answerLabel\", \"DestinationColumn\": \"answerLabel\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerCode\", \"DestinationColumn\": \"answerCode\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerName\", \"DestinationColumn\": \"answerName\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } } ] } } ] } }"; + + var mapper = new AutoMapper(mapping); + + //Act + var response = mapper.TransformIntoJson(JObject.Parse(inputJson), true); + var expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; + //Assert + Assert.IsTrue(JToken.DeepEquals(response, JObject.Parse(expectedResponse))); + } - //Assert - Assert.AreEqual(response, expectedResponse); - } + [TestMethod, Description("Function handler test - Validate that the value returned is first index after split")] + public void FunctionTest_SplitWithOneIndex() + { + //Arrange - Certain input json with complex object + var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; - [TestMethod, Description("Function handler test - Validate Upper case functionality in Parent Node")] - public void FunctionTest_TransformToUpperCaseParent() - { - //Arrange - Certain input json with complex object - string mapping; - using (var r = new StreamReader(@"Jsons\ToUpper\Upper_Mapping.json")) - { - mapping = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } + var mapper = new AutoMapper(mapping); - string inputJson; - using (var r = new StreamReader(@"Jsons\ToUpper\Transformation_Input.json")) - { - inputJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Key\":[{\"Key\":\"12121212333\"}]}"; - var mapper = new AutoMapper(mapping); + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\",\"FirstName\":\"AP - Azure\",\"LastName\":\"C - AND - E\"}]}"; + [TestMethod, Description("Function handler test - Validate that the value returned is first and second index after split")] + public void FunctionTest_SplitWithTwoIndex() + { + //Arrange - Certain input json with complex object + var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}},{""SourceColumn"":"""",""DestinationColumn"":""Message"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":1,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; - //Assert - Assert.AreEqual(response, expectedResponse); - } + var mapper = new AutoMapper(mapping); - [TestMethod, Description("Function handler test - Validate Upper case functionality")] - public void FunctionTest_TransformToLowerCase() - { - //Arrange - Certain input json with complex object - var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOLOWERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Data\":[{\"Key\":\"12121212333\",\"Message\":\"AKJKKAJDKAKJKKKDKSKAK\"}]}"; - var mapper = new AutoMapper(mapping); + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Act - var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"windows 10\"}]}"; + [TestMethod, Description("Function handler test - Validate Upper case functionality")] + public void FunctionTest_TransformToUpperCase() + { + //Arrange - Certain input json with complex object + var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOUPPERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; - //Assert - Assert.AreEqual(response, expectedResponse); - } + var mapper = new AutoMapper(mapping); - [TestMethod, Description("Validate that the datatype is set to input type if mapping datatype is set to null.")] - public void Validate_AutoMapper_NullDataType() - { - // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"$.AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null}]}}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\"}]}"; - var inputJson = - "{\"Name\": \"22\",\"AllowEmail\": false,\"CrmId\": null,\"LeadScore\":100}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.LeadScore == 100); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + [TestMethod, Description("Function handler test - Validate Upper case functionality in Parent Node")] + public void FunctionTest_TransformToUpperCaseParent() + { + //Arrange - Certain input json with complex object + string mapping; + using (var r = new StreamReader(@"Jsons\ToUpper\Upper_Mapping.json")) + { + mapping = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } - [TestMethod, Description("Validate that the JObject and JArray are created With same Flattene Object.")] - public void AutoMappperMappingForJObjectAndJarray() + string inputJson; + using (var r = new StreamReader(@"Jsons\ToUpper\Transformation_Input.json")) { - // Arrange - var inputJson = - "{ \"ProgramName\": \"test4\", \"ProgramFolderId\": \"49\", \"ProgramFolderType\": \"Folder\", \"ProgramDescription\": \"xcvxbv\", \"ProgramType\": \"Default\", \"ProgramChannel\": \"Email Blast\", \"ProgramCosts\": \"8360\", \"ProgramStartDate\": \"2015-01-01\" }"; + inputJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"DestinationType\": \"JObject\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramName\", \"DestinationColumn\": \"ProgramName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Folder\", \"DataType\": \"JObject\", \"ComplexType\": { \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramFolderId\", \"DestinationColumn\": \"id\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramFolderType\", \"DestinationColumn\": \"type\", \"DataType\": \"string\" } ] } }, { \"SourceColumn\": \"$.ProgramDescription\", \"DestinationColumn\": \"ProgramDescription\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramType\", \"DestinationColumn\": \"ProgramType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramChannel\", \"DestinationColumn\": \"ProgramChannel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Costs\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"IgnoreEmptyArray\": true, \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramStartDate\", \"DestinationColumn\": \"startDate\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramCosts\", \"DestinationColumn\": \"cost\", \"DataType\": \"string\" } ] } } ] } }"; + var mapper = new AutoMapper(mapping); + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\",\"FirstName\":\"AP - Azure\",\"LastName\":\"C - AND - E\"}]}"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(inputJson); - var expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - Assert.AreEqual(output, expectedOutput); - } - catch (Exception) - { - Assert.Fail(); - } - } + [TestMethod, Description("Function handler test - Validate Upper case functionality")] + public void FunctionTest_TransformToLowerCase() + { + //Arrange - Certain input json with complex object + var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOLOWERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; - [TestMethod, Description("Validate that the datetime format is not changed after transformation.")] - public void AutoMappperMapping_ValidateDateTimeFormat() - { - // Arrange - var inputJson = - "{'Content':[{'Date':'2015-11-30T00:00:00','LongFormattedDate':'Monday,November30','ShortFormattedDate':'11/30/2015','DateString':null,'DateIndex':1}],'MifContext':{'runImmediate':true,'runId':'97216631-3453-4326-9a83-d5c83c62c2e6','TrackingEnabled':false,'WorkFlowName':'EPDaysToEDP','programId':'52aa95a6-831a-e511-ab0e-00155d5066d7','programCode':'conv2015emea','correlationId':'e62812d0-7d19-4496-bd9a-8a5202fa8750'},'ForEachContext':{'Url':'https://eventpoint-conv2015emea-services.azurewebsites.net','APIKey':'050e1a02033e48319ac9fd051452a484'}"; + var mapper = new AutoMapper(mapping); - var mappingJson = - "{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventId','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': '-1'}},{'SourceColumn': '$.MifContext.correlationId','DestinationColumn': 'BatchId','DataType': 'guid','ComplexType': null,'TransformValue': null},{'SourceColumn': '','DestinationColumn': 'RequestId','DataType': 'guid','ComplexType': null,'TransformValue': {'DefaultValue': 'newGuid'}},{'SourceColumn': '','DestinationColumn': 'MoreResults','DataType': 'bool','ComplexType': null,'TransformValue': {'DefaultValue': 'false'}},{'SourceColumn': '','DestinationColumn': 'SchemaName','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': 'JournalEvents.EventPoint.ProgramDay'}},{'SourceColumn': '','DestinationColumn': 'ContentObject','DataType': 'JArray','ComplexType': {'DataType': 'JArray','Node': '$.Content[*]','TruthTable': [{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programId','DestinationColumn': 'ProgramId','DataType': 'string'},{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programCode','DestinationColumn': 'ProgramCode','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'ProgramDayDate','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'LongFormattedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ',},{'SourceColumn': '$.ShortFormattedDate','DestinationColumn': 'ShortFormattedDate','DataType': 'string'},{'SourceColumn': '$.DateString','DestinationColumn': 'DateString','DataType': 'string'},{'SourceColumn': '$.DateIndex','DestinationColumn': 'DateIndex','DataType': 'string'}]}},{'SourceColumn': '','DestinationColumn': 'CreatedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}},{'SourceColumn': '','DestinationColumn': 'EventDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}}]}}"; + //Act + var response = mapper.TransformIntoJson(inputJson, true); + var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"windows 10\"}]}"; + //Assert + Assert.AreEqual(response, expectedResponse); + } - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + [TestMethod, Description("Validate that the datatype is set to input type if mapping datatype is set to null.")] + public void Validate_AutoMapper_NullDataType() + { + // Arrange + var mappingJson = + "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"$.AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null}]}}"; - Assert.AreEqual(output["ContentObject"][0]["ProgramDayDate"].ToString(), "2015-11-30T00:00:00"); - Assert.AreEqual(output["ContentObject"][0]["ShortFormattedDate"].ToString(), "11/30/2015"); - } - catch (Exception) - { - Assert.Fail(); - } - } + var inputJson = + "{\"Name\": \"22\",\"AllowEmail\": false,\"CrmId\": null,\"LeadScore\":100}"; - [TestMethod, Description("Validate that the concatenation where nulls are present.")] - public void AutoMappperMapping_ConcatWithNull() + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var lead = (LeadRecord)mapper.Transform(inputJson); + Assert.IsTrue(lead.LeadScore == 100); + } + catch (Exception ex) { - // Arrange - var inputJson = - "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ { \"message\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; + Assert.Fail(ex.Message); + } + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; + [TestMethod, Description("Validate that the JObject and JArray are created With same Flattene Object.")] + public void AutoMappperMappingForJObjectAndJarray() + { + // Arrange + var inputJson = + "{ \"ProgramName\": \"test4\", \"ProgramFolderId\": \"49\", \"ProgramFolderType\": \"Folder\", \"ProgramDescription\": \"xcvxbv\", \"ProgramType\": \"Default\", \"ProgramChannel\": \"Email Blast\", \"ProgramCosts\": \"8360\", \"ProgramStartDate\": \"2015-01-01\" }"; + var mappingJson = + "{ \"MappingRuleConfig\": { \"DestinationType\": \"JObject\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramName\", \"DestinationColumn\": \"ProgramName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Folder\", \"DataType\": \"JObject\", \"ComplexType\": { \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramFolderId\", \"DestinationColumn\": \"id\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramFolderType\", \"DestinationColumn\": \"type\", \"DataType\": \"string\" } ] } }, { \"SourceColumn\": \"$.ProgramDescription\", \"DestinationColumn\": \"ProgramDescription\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramType\", \"DestinationColumn\": \"ProgramType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramChannel\", \"DestinationColumn\": \"ProgramChannel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Costs\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"IgnoreEmptyArray\": true, \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramStartDate\", \"DestinationColumn\": \"startDate\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramCosts\", \"DestinationColumn\": \"cost\", \"DataType\": \"string\" } ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Validate that the concatenation where nulls are present.")] - public void AutoMappperMapping_ConcatWithEmptyList() + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors1\": [ { \"message1\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; + var output = mapper.TransformIntoJson(inputJson); + var expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; + Assert.AreEqual(output, expectedOutput); + } + catch (Exception) + { + Assert.Fail(); + } + } + [TestMethod, Description("Validate that the datetime format is not changed after transformation.")] + public void AutoMappperMapping_ValidateDateTimeFormat() + { + // Arrange + var inputJson = + "{'Content':[{'Date':'2015-11-30T00:00:00','LongFormattedDate':'Monday,November30','ShortFormattedDate':'11/30/2015','DateString':null,'DateIndex':1}],'MifContext':{'runImmediate':true,'runId':'97216631-3453-4326-9a83-d5c83c62c2e6','TrackingEnabled':false,'WorkFlowName':'EPDaysToEDP','programId':'52aa95a6-831a-e511-ab0e-00155d5066d7','programCode':'conv2015emea','correlationId':'e62812d0-7d19-4496-bd9a-8a5202fa8750'},'ForEachContext':{'Url':'https://eventpoint-conv2015emea-services.azurewebsites.net','APIKey':'050e1a02033e48319ac9fd051452a484'}"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; + var mappingJson = + "{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventId','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': '-1'}},{'SourceColumn': '$.MifContext.correlationId','DestinationColumn': 'BatchId','DataType': 'guid','ComplexType': null,'TransformValue': null},{'SourceColumn': '','DestinationColumn': 'RequestId','DataType': 'guid','ComplexType': null,'TransformValue': {'DefaultValue': 'newGuid'}},{'SourceColumn': '','DestinationColumn': 'MoreResults','DataType': 'bool','ComplexType': null,'TransformValue': {'DefaultValue': 'false'}},{'SourceColumn': '','DestinationColumn': 'SchemaName','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': 'JournalEvents.EventPoint.ProgramDay'}},{'SourceColumn': '','DestinationColumn': 'ContentObject','DataType': 'JArray','ComplexType': {'DataType': 'JArray','Node': '$.Content[*]','TruthTable': [{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programId','DestinationColumn': 'ProgramId','DataType': 'string'},{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programCode','DestinationColumn': 'ProgramCode','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'ProgramDayDate','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'LongFormattedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ',},{'SourceColumn': '$.ShortFormattedDate','DestinationColumn': 'ShortFormattedDate','DataType': 'string'},{'SourceColumn': '$.DateString','DestinationColumn': 'DateString','DataType': 'string'},{'SourceColumn': '$.DateIndex','DestinationColumn': 'DateIndex','DataType': 'string'}]}},{'SourceColumn': '','DestinationColumn': 'CreatedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}},{'SourceColumn': '','DestinationColumn': 'EventDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}}]}}"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Validate that the DateTime offset is removed from the value to be returned.")] - public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithOffset() + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000Z+0000\", \"endDate\": \"2015-06-26T15:55:00.000Z-0000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; - - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; - + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + Assert.AreEqual(output["ContentObject"][0]["ProgramDayDate"].ToString(), "2015-11-30T00:00:00"); + Assert.AreEqual(output["ContentObject"][0]["ShortFormattedDate"].ToString(), "11/30/2015"); } - - [TestMethod, Description("Validate that the DateTime is sent as it is if no offset is present.")] - public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithoutOffset() + catch (Exception) { - // Arrange - var inputJson = - "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000\", \"endDate\": \"2015-06-26T15:55:00.000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; + Assert.Fail(); + } + } + + [TestMethod, Description("Validate that the concatenation where nulls are present.")] + public void AutoMappperMapping_ConcatWithNull() + { + // Arrange + var inputJson = + "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ { \"message\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_HappyPath() + catch (Exception ex) { - // Arrange - var inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"12345\", \"phone\": \"67890\" } }"; + Assert.Fail("Test failed: " + ex.Message); + } + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + [TestMethod, Description("Validate that the concatenation where nulls are present.")] + public void AutoMappperMapping_ConcatWithEmptyList() + { + // Arrange + var inputJson = + "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors1\": [ { \"message1\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamNull() + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"67890\" } }"; - - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } - - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamNotPresent() + catch (Exception ex) { - // Arrange - var inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"phone\": \"67890\" } }"; + Assert.Fail("Test failed: " + ex.Message); + } + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + [TestMethod, Description("Validate that the DateTime offset is removed from the value to be returned.")] + public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithOffset() + { + // Arrange + var inputJson = + "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000Z+0000\", \"endDate\": \"2015-06-26T15:55:00.000Z-0000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ReturnValueNullParamNull() + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\":null } }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + [TestMethod, Description("Validate that the DateTime is sent as it is if no offset is present.")] + public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithoutOffset() + { + // Arrange + var inputJson = + "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000\", \"endDate\": \"2015-06-26T15:55:00.000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyString() + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) { - // Arrange - var inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; + Assert.Fail("Test failed: " + ex.Message); + } + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_HappyPath() + { + // Arrange + var inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"12345\", \"phone\": \"67890\" } }"; + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpace() + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) { - // Arrange - var inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; + Assert.Fail("Test failed: " + ex.Message); + } + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamNull() + { + // Arrange + var inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"67890\" } }"; + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"\" } }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamNotPresent() + { + // Arrange + var inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"phone\": \"67890\" } }"; + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEmptyParamEnabled() + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) { - // Arrange - var inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; + Assert.Fail("Test failed: " + ex.Message); + } + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ReturnValueNullParamNull() + { + // Arrange + var inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\":null } }"; + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgnoreEmptyParamEnabled() + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\" }"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); + } + } - var mappingJson = - "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyString() + { + // Arrange + var inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act - var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } - } - - [TestMethod, Description("Test one to one mapping functionality")] - public void OneToOneMappingTest() - { - //Arrange - string mappingJson; - using (var r = new StreamReader(@"Jsons\OneToOneMapping\OneToOneMappingRules.json")) - { - mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - string input; - using (var r = new StreamReader(@"Jsons\OneToOneMapping\Transformation_Input.json")) - { - input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); - //Assert - Assert.AreEqual("Financial Services", output.SelectToken("$.Industry").ToString()); + //Act + var mapper = new AutoMapper(mappingJson); + try + { + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } - - [TestMethod, Description("Test range mapping functionality")] - public void RangeMappingTest() + catch (Exception ex) { - //Arrange - string mappingJson; - using (var r = new StreamReader(@"Jsons\RangeMapping\RangeMappingRules.json")) - { - mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } + Assert.Fail("Test failed: " + ex.Message); + } + } - string input; - using (var r = new StreamReader(@"Jsons\RangeMapping\Transformation_Input.json")) - { - input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpace() + { + // Arrange + var inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Assert - Assert.AreEqual("51to250employees", output.SelectToken("$.CompanySize").ToString()); - } - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Ampersand")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Ampersand() + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"data\": { \"companyName\": \"Procter & Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } - - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Dollar")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Dollar() + catch (Exception ex) { - // Arrange - var inputJson = - "{ \"data\": { \"companyName\": \"Procter $ Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + Assert.Fail("Test failed: " + ex.Message); } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() + { + // Arrange + var inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"\" } }"; + + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Plus")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Plus() + + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"data\": { \"companyName\": \"Procter + Gamble Company\", \"countryName\": \"Bulgaria+\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } - - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Space")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Space() + catch (Exception ex) { - // Arrange - var inputJson = - "{ \"data\": { \"companyName\": \"Procter Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + Assert.Fail("Test failed: " + ex.Message); } + } - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Percent")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Percent() + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEmptyParamEnabled() + { + // Arrange + var inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; + + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"data\": { \"companyName\": \"Procter%Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); + } + catch (Exception ex) + { + Assert.Fail("Test failed: " + ex.Message); } + } + + [TestMethod, Description("Validate ReplaceValueFunction.")] + public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgnoreEmptyParamEnabled() + { + // Arrange + var inputJson = + "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; - [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Exclamation")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Exclamation() + var mappingJson = + "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; + + + //Act + var mapper = new AutoMapper(mappingJson); + try { - // Arrange - var inputJson = - "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var j = JObject.Parse(expectedOutput); + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } - - [TestMethod, Description("Test for UriEscapeDataString Null Paramters")] - public void FunctionHanlder_UriEscapeDataString_Null_Parameters() + catch (Exception ex) { - // Arrange - var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + Assert.Fail("Test failed: " + ex.Message); + } + } - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": null } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - // string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, new JObject())); + [TestMethod, Description("Test one to one mapping functionality")] + public void OneToOneMappingTest() + { + //Arrange + string mappingJson; + using (var r = new StreamReader(@"Jsons\OneToOneMapping\OneToOneMappingRules.json")) + { + mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } - [TestMethod, Description("Test for UriEscapeDataString One Null Paramter")] - public void FunctionHanlder_UriEscapeDataString_One_Null_Parameter() + string input; + using (var r = new StreamReader(@"Jsons\OneToOneMapping\Transformation_Input.json")) { - // Arrange - var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); + } - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", null, \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); + + //Assert + Assert.AreEqual("Financial Services", output.SelectToken("$.Industry").ToString()); + } + + [TestMethod, Description("Test range mapping functionality")] + public void RangeMappingTest() + { + //Arrange + string mappingJson; + using (var r = new StreamReader(@"Jsons\RangeMapping\RangeMappingRules.json")) + { + mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } - [TestMethod, Description("Test for UriEscapeDataString With Invalid Parameter Field")] - public void FunctionHanlder_UriEscapeDataString_Invalid_Parameter_Field() + string input; + using (var r = new StreamReader(@"Jsons\RangeMapping\Transformation_Input.json")) { - // Arrange - var inputJson = - "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state1\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - //Act - var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } + + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); + + //Assert + Assert.AreEqual("51to250employees", output.SelectToken("$.CompanySize").ToString()); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Ampersand")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Ampersand() + { + // Arrange + var inputJson = + "{ \"data\": { \"companyName\": \"Procter & Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Dollar")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Dollar() + { + // Arrange + var inputJson = + "{ \"data\": { \"companyName\": \"Procter $ Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Plus")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Plus() + { + // Arrange + var inputJson = + "{ \"data\": { \"companyName\": \"Procter + Gamble Company\", \"countryName\": \"Bulgaria+\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Space")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Space() + { + // Arrange + var inputJson = + "{ \"data\": { \"companyName\": \"Procter Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Percent")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Percent() + { + // Arrange + var inputJson = + "{ \"data\": { \"companyName\": \"Procter%Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Exclamation")] + public void FunctionHanlder_UriEscapeDataString_HappyPath_Exclamation() + { + // Arrange + var inputJson = + "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString Null Paramters")] + public void FunctionHanlder_UriEscapeDataString_Null_Parameters() + { + // Arrange + var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": null } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + // string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, new JObject())); + } + + [TestMethod, Description("Test for UriEscapeDataString One Null Paramter")] + public void FunctionHanlder_UriEscapeDataString_One_Null_Parameter() + { + // Arrange + var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", null, \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); + } + + [TestMethod, Description("Test for UriEscapeDataString With Invalid Parameter Field")] + public void FunctionHanlder_UriEscapeDataString_Invalid_Parameter_Field() + { + // Arrange + var inputJson = + "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state1\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act + var mapper = new AutoMapper(mappingJson); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } -} +} \ No newline at end of file diff --git a/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/OneToOneMappingRules.json b/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/OneToOneMappingRules.json index a6acf35..8fe560b 100644 --- a/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/OneToOneMappingRules.json +++ b/test/JsonToJsonMapper.Tests/Jsons/OneToOneMapping/OneToOneMappingRules.json @@ -1,6 +1,5 @@ { "MappingRuleConfig": { - "TruthTable": [ { "SourceColumn": "", @@ -16,48 +15,37 @@ "key": "Agriculture & Mining", "value": "Agriculture, Forestry, & Fishing" }, - { "key": "Business Services", "value": "Services" }, - { "key": "Computers & Electronics", "value": "Communications & Media" }, - { - "key": "Consumer Services", "value": "Services" }, - { "key": "Education", "value": "Education" }, - { "key": "Energy & Utilities", "value": "Power & Utilities" }, - { "key": "Financial Services", "value": "Financial Services" }, - { "key": "Government", "value": "Government" } - ] - } } - ] } } diff --git a/test/JsonToJsonMapper.Tests/LeadRecord.cs b/test/JsonToJsonMapper.Tests/LeadRecord.cs index 7c677e8..882c67f 100644 --- a/test/JsonToJsonMapper.Tests/LeadRecord.cs +++ b/test/JsonToJsonMapper.Tests/LeadRecord.cs @@ -1,12 +1,9 @@ -using System; +namespace MipUnitTest; -namespace MipUnitTest +public class LeadRecord { - public class LeadRecord - { - public string Name { get; set; } - public bool AllowEmail { get; set; } - public dynamic LeadScore { get; set; } - public Guid CrmId { get; set; } - } -} + public string Name { get; set; } + public bool AllowEmail { get; set; } + public dynamic LeadScore { get; set; } + public Guid CrmId { get; set; } +} \ No newline at end of file From 525c54238cc736cf01cd22d5530ba83085b29806 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:41:46 +0100 Subject: [PATCH 11/37] - code cleanup --- src/JsonToJsonMapper/AutoMapper.cs | 54 +++++++++++- .../Handlers/FunctionHandler.cs | 84 ++++++++++++++----- .../Handlers/RoslynScriptHandler.cs | 6 ++ .../Handlers/TypeConverterHandler.cs | 80 +++++++++++++----- .../Handlers/ValueMappingHandler.cs | 14 +++- 5 files changed, 189 insertions(+), 49 deletions(-) diff --git a/src/JsonToJsonMapper/AutoMapper.cs b/src/JsonToJsonMapper/AutoMapper.cs index 8a53c5e..233cf52 100644 --- a/src/JsonToJsonMapper/AutoMapper.cs +++ b/src/JsonToJsonMapper/AutoMapper.cs @@ -21,7 +21,9 @@ public AutoMapper(string autoMapperConfig) Mapping = config.MappingRuleConfig; if (Mapping == null || !Mapping.TruthTable.Any()) + { throw new Exception("Invalid mapping json"); + } var scripts = new Dictionary(); @@ -42,7 +44,6 @@ public AutoMapper(string autoMapperConfig) } // Load all the handlers - handler.AddHandlers(new TransposeHandler()); handler.AddHandlers(new TypeConverterHandler()); handler.AddHandlers(new ValueMappingHandler()); @@ -58,7 +59,9 @@ public AutoMapper(string autoMapperConfig) public object Transform(string inputJson) { if (Mapping.DestinationType == null) + { throw new Exception("Invalid mapping json"); + } return Execute((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping); } @@ -66,7 +69,9 @@ public object Transform(string inputJson) public object Transform(JObject jObj) { if (Mapping.DestinationType == null) + { throw new Exception("Invalid mapping json"); + } return Execute(jObj, Mapping); } @@ -96,13 +101,18 @@ private object Execute(JObject jsonObject, MappingRule mapping) if (value != null) { if (rule.DataType == null) + { rule.DataType = valueType; + } + var finalValue = handler.GetHandler() .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); propertyInfo.SetValue(entity, finalValue, null); } else + { propertyInfo.SetValue(entity, value, null); + } } else { @@ -158,7 +168,9 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) Dictionary transposeResponse = handler.GetHandler() .Run(JObject.FromObject(rule), jsonObject); if (transposeResponse != null) + { jsonString.Json.AddRange(transposeResponse); + } } else if (!string.IsNullOrEmpty(rule.DestinationColumn)) { @@ -170,17 +182,24 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); if (rule.DataType == null) + { rule.DataType = valueType; + } + var finalValue = handler.GetHandler() .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); if (finalValue != null || finalValue.Type != JTokenType.Null || (finalValue == null && !mapping.IgnoreNullValue) || (finalValue.Type == JTokenType.Null && !mapping.IgnoreNullValue)) + { jsonString.Json.Add(destinationValue, finalValue); + } } else if (rule.ComplexType.DataType != null && rule.ComplexType.DataType.ToUpperInvariant().Equals("JARRAY")) { var result = TransformJArray(jsonObject, rule.ComplexType, mapping.IgnoreNullValue); if (result != null) + { jsonString.Json.Add(rule.DestinationColumn, result); + } } else { @@ -189,11 +208,14 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) if (result != null) { if (!string.IsNullOrWhiteSpace(rule.DataType)) + { jsonString.Json.Add(rule.DestinationColumn, handler.GetHandler() .Run(JObject.FromObject(rule), JObject.FromObject(new { value = result }))); - + } else + { jsonString.Json.Add(rule.DestinationColumn, result); + } } } } @@ -234,7 +256,10 @@ private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ig } if (!hasToken && mapping.IgnoreEmptyArray) + { return null; + } + return array; } @@ -247,11 +272,13 @@ private string GetValue(JObject jsonObject, string key, Transform transform, out { return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); } - else if (transform != null && transform.Type != null && transform.Type.Equals("FUNCTION", StringComparison.OrdinalIgnoreCase)) + + if (transform != null && transform.Type != null && transform.Type.Equals("FUNCTION", StringComparison.OrdinalIgnoreCase)) { return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); } - else if (!string.IsNullOrEmpty(key) && key.StartsWith("$")) + + if (!string.IsNullOrEmpty(key) && key.StartsWith("$")) { if (!key.ToUpperInvariant().Contains("[{PARENT}]")) { @@ -261,7 +288,9 @@ private string GetValue(JObject jsonObject, string key, Transform transform, out valueType = token.Type.ToString(); var tokenValue = token.ToString(); if (token.GetType().Name.Equals("JVALUE", StringComparison.OrdinalIgnoreCase) && token.Type == JTokenType.Null) + { value = null; + } else if (valueType.Equals("Date", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(tokenValue)) { var val = (token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries).Length > 1) ? token.Parent.ToString().Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries)[1] : tokenValue; @@ -277,7 +306,9 @@ private string GetValue(JObject jsonObject, string key, Transform transform, out } } else + { value = null; + } } else { @@ -293,37 +324,52 @@ private string GetValue(JObject jsonObject, string key, Transform transform, out { valueType = valueToken.Type.ToString(); if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) + { value = valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", ""); + } else if (valueToken.Value() != null) { value = valueToken.ToString(); } else + { value = null; + } } else + { value = null; + } } } else { var jsonobjectvalue = jsonObject.GetValue(key, StringComparison.OrdinalIgnoreCase); if (jsonobjectvalue == null || jsonobjectvalue.Type == JTokenType.Null) + { value = null; + } else { valueType = jsonobjectvalue.Type.ToString(); value = jsonobjectvalue.ToString(); if (value.StartsWith("\"")) + { value = value.Substring(1); + } + if (value.EndsWith("\"")) + { value = value.Substring(0, value.Length - 1); + } } } if (transform != null) + { value = handler.GetHandler() .Run(JObject.FromObject(transform), JObject.FromObject(new { value = value })); + } return value; } diff --git a/src/JsonToJsonMapper/Handlers/FunctionHandler.cs b/src/JsonToJsonMapper/Handlers/FunctionHandler.cs index 82456a9..ba2b4b8 100644 --- a/src/JsonToJsonMapper/Handlers/FunctionHandler.cs +++ b/src/JsonToJsonMapper/Handlers/FunctionHandler.cs @@ -18,7 +18,8 @@ public dynamic Run(JObject transform, JObject input) { foreach (var item in parameters) { - if (!(item is JToken)) + if (item is not JToken) + { if (item.StartsWith("$")) { if (!item.ToUpperInvariant().Contains("[{PARENT}]")) @@ -35,9 +36,13 @@ public dynamic Run(JObject transform, JObject input) else if (string.IsNullOrWhiteSpace(i.ToString())) { if (Convert.ToBoolean(ignoreEmptyValue)) + { inputParam.Add(nullString); + } else + { inputParam.Add(i.ToString()); + } } else { @@ -63,30 +68,45 @@ public dynamic Run(JObject transform, JObject input) if (valueToken != null) { if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) + { inputParam.Add(valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); + } else if (valueToken.Value() != null) { if (string.IsNullOrWhiteSpace(valueToken.ToString())) { if (Convert.ToBoolean(ignoreEmptyValue)) + { inputParam.Add(nullString); + } else + { inputParam.Add(valueToken.ToString()); + } } else { - inputParam.Add(valueToken.ToString()); + { + inputParam.Add(valueToken.ToString()); + } } } else + { inputParam.Add(nullString); + } } else + { inputParam.Add(nullString); + } } } else + { inputParam.Add(item); + } + } } } } @@ -94,7 +114,10 @@ public dynamic Run(JObject transform, JObject input) switch (function.ToUpperInvariant()) { case "CONCAT": + { return ConCat(inputParam, transform["Delimeter"].Value()); + } + case "REPLACEVALUE": { var compareToValue = transform["CompareToValue"].Value(); @@ -106,6 +129,7 @@ public dynamic Run(JObject transform, JObject input) defaultValue = GetTokenValue(input, nullString, defaultValue); return ReplaceValue(inputParam, compareToValue, returnValue, defaultValue); } + case "REPLACEVALUEWITHREGEXCOMPARISON": { var compareToValue = transform["CompareToValue"].Value(); @@ -118,6 +142,7 @@ public dynamic Run(JObject transform, JObject input) return ReplaceValueWithRegexComparison(inputParam, compareToValue, returnValue, defaultValue); } + case "SPLIT": { var delimeter = transform["Delimeter"].Value(); @@ -126,22 +151,27 @@ public dynamic Run(JObject transform, JObject input) var position = positionToken != null ? positionToken.ToString() : string.Empty; return Split(inputParam, delimeter, index, position); } + case "TOUPPERCASE": { return inputParam[0] != null ? inputParam[0].ToUpperInvariant() : string.Empty; } + case "TOLOWERCASE": { return inputParam[0] != null ? inputParam[0].ToLowerInvariant() : string.Empty; } + case "RANGEMAPPING": { return mapRange((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); } + case "ONETOONEMAPPING": { return mapOneToOne((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); } + case "URIESCAPEDATASTRING": { UriEscapeDataString(input, parameters); @@ -152,29 +182,29 @@ public dynamic Run(JObject transform, JObject input) return null; } - private string GetTokenValue(JObject input, string nullString, string Value) + private string GetTokenValue(JObject input, string nullString, string value) { - if (Value != null && Value.StartsWith("$.")) + if (value != null && value.StartsWith("$.")) { - var returnValueToken = input.SelectToken(Value); + var returnValueToken = input.SelectToken(value); if (returnValueToken == null) { - Value = nullString; + value = nullString; } else { if (returnValueToken.Type == JTokenType.Null) { - Value = nullString; + value = nullString; } else { - Value = returnValueToken.ToString(); + value = returnValueToken.ToString(); } } } - return Value; + return value; } private string GetCompareValue(JObject input, string nullString, string compareToValue) @@ -233,9 +263,14 @@ private string ConCat(List args, string delimeter) private string ReplaceValue(List args, string compareToValue, string returnValue, string defaultValue) { if (args[0] == null && compareToValue == null) + { return returnValue; + } + if (args[0] != null && args[0].Equals(compareToValue, StringComparison.OrdinalIgnoreCase)) + { return returnValue; + } return defaultValue; } @@ -243,9 +278,15 @@ private string ReplaceValue(List args, string compareToValue, string ret private string ReplaceValueWithRegexComparison(List args, string compareToValue, string returnValue, string defaultValue) { if (args[0] == null && compareToValue == null) + { return returnValue; + } + if (args[0] != null && compareToValue != null && Regex.IsMatch(args[0], compareToValue, RegexOptions.IgnoreCase)) + { return returnValue; + } + return defaultValue; } @@ -256,21 +297,20 @@ private string Split(List args, char delimeter, int index, string positi var delimiters = new char[] { delimeter }; return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries)[index]; } - else + + if (position.Equals("FIRST", StringComparison.OrdinalIgnoreCase)) + { + var delimiters = new char[] { delimeter }; + return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); + } + + if (position.Equals("LAST", StringComparison.OrdinalIgnoreCase)) { - if (position.Equals("FIRST", StringComparison.OrdinalIgnoreCase)) - { - var delimiters = new char[] { delimeter }; - return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); - } - else if (position.Equals("LAST", StringComparison.OrdinalIgnoreCase)) - { - var delimiters = new char[] { delimeter }; - return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); - } - else - return string.Empty; + var delimiters = new char[] { delimeter }; + return args[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); } + + return string.Empty; } private string mapRange(JArray truthTable, string value) diff --git a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs index 46e7af8..99f71e2 100644 --- a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs +++ b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs @@ -36,15 +36,21 @@ public dynamic Run(JObject transform, JObject input) { inputParam.Append(i.ToString()); if (tokens.Count() > 1) + { inputParam.Append("[tokenDelimiter]"); + } } } if (parameters.Count > 1) + { inputParam.Append(string.Empty + "[delimiter]"); + } } else + { inputParam.Append(item + "[delimiter]"); + } } var result = Scripts[scriptName].RunAsync(new ScriptHost { Args = inputParam.ToString() }); diff --git a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs index aa91ae2..9ebf129 100644 --- a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs +++ b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs @@ -20,7 +20,10 @@ public dynamic Run(JObject config, JObject input) var format = config["Format"].Value(); if (value == null || ((JToken)value).Type == JTokenType.Null) + { return value; + } + try { if (!string.IsNullOrWhiteSpace(dataType)) @@ -29,54 +32,66 @@ public dynamic Run(JObject config, JObject input) { case "LONG": return Convert.ToInt64(value); + case "JOBJECT": { var Jtokenvalue = (JToken)value; if (Jtokenvalue.Type == JTokenType.Object) + { return (JObject)Jtokenvalue; - else - return JsonConvert.DeserializeObject(Jtokenvalue.ToString()); + } + + return JsonConvert.DeserializeObject(Jtokenvalue.ToString()); } + case "JARRAY": { var Jtokenvalue = (JToken)value; if (Jtokenvalue.Type == JTokenType.Array) { if (Jtokenvalue.Any()) + { return (JArray)Jtokenvalue; - else - return null; + } + + return null; } - else if (Jtokenvalue.Type == JTokenType.Object) + + if (Jtokenvalue.Type == JTokenType.Object) { return new JArray(Jtokenvalue); } - else + + if (Jtokenvalue.ToString().StartsWith("[") && Jtokenvalue.ToString().EndsWith("]")) { - if (Jtokenvalue.ToString().StartsWith("[") && Jtokenvalue.ToString().EndsWith("]")) - { - return JArray.Parse(Jtokenvalue.ToString()); - } - else - return new JArray(Jtokenvalue); + return JArray.Parse(Jtokenvalue.ToString()); } + + return new JArray(Jtokenvalue); } + case "SHORT": return Convert.ToInt16(value); + case "INT": case "INTEGER": return Convert.ToInt32(value); + case "GUID": return new Guid(value.ToString()); + case "DATETIME": { var valueType = value.ToString(); var x = new Regex(@".*[+-][0-9][0-9][:]"); if (x.IsMatch(valueType)) + { return DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture); - else - return DateTime.Parse(valueType, CultureInfo.InvariantCulture); + } + + return DateTime.Parse(valueType, CultureInfo.InvariantCulture); } + case "CUSTOMDATETIME": { var valueType = value.ToString(); @@ -87,42 +102,56 @@ public dynamic Run(JObject config, JObject input) var datetime = valueType.Substring(0, pos); return datetime; } - else - { - return null; - } + + return null; } + case "BOOL": case "BOOLEAN": return Convert.ToBoolean(value); + case "DECIMAL": return Convert.ToDecimal(value); + case "DECIMAL?": { decimal decimalValue; if (decimal.TryParse(value.ToString(), out decimalValue)) + { return decimalValue; + } + return null; } + case "INT?": { var dval = Convert.ToDecimal(value.ToString()); return Decimal.ToInt32(dval); } + case "GUID?": { Guid guid; if (Guid.TryParse(value.ToString(), out guid)) + { return guid; + } + return null; } + case "DATETIME?": { DateTime datetime; if (DateTime.TryParse(value.ToString(), out datetime)) + { return datetime; + } + return null; } + case "UTCDATETIME": { DateTime dateTime; @@ -136,6 +165,7 @@ public dynamic Run(JObject config, JObject input) return null; } + case "STRINGTOUTCDATEFORMAT": { //This block converts the given date into UTC formatted string, it will not change the TimeZone offset @@ -149,6 +179,7 @@ public dynamic Run(JObject config, JObject input) return null; } + case "REMOVEDATETIMEOFFSET": { var valueType = value.ToString(); @@ -161,6 +192,7 @@ public dynamic Run(JObject config, JObject input) return valueType; } + case "FORMATTEDDATETIME": { DateTime dateTime; @@ -168,20 +200,28 @@ public dynamic Run(JObject config, JObject input) { string timeInUTCFormat; if (!string.IsNullOrWhiteSpace(format)) + { timeInUTCFormat = dateTime.ToString(format); + } else + { timeInUTCFormat = dateTime.ToString(null, CultureInfo.InvariantCulture); + } + return timeInUTCFormat; } return null; } + case "STRING": { if (value.GetType().Equals("JValue")) + { return ((JValue)value).Value(); - else - return value.ToString(); + } + + return value.ToString(); } } } diff --git a/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs b/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs index e176ab4..e0ef391 100644 --- a/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs +++ b/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs @@ -17,15 +17,23 @@ public dynamic Run(JObject transform, JObject input) var value = input["value"].Value(); if (transform != null && valueMapping != null && value != null) + { value = (from item in valueMapping where item.ExistingValue.Equals(value, StringComparison.OrdinalIgnoreCase) select item.NewValue).FirstOrDefault(); + } + if (transform != null && string.IsNullOrWhiteSpace(value) && defaultValue != null) { if (defaultValue.Equals("UTCNOW", StringComparison.OrdinalIgnoreCase)) + { return DateTime.UtcNow.ToString(); - else if (defaultValue.Equals("NEWGUID", StringComparison.OrdinalIgnoreCase)) + } + + if (defaultValue.Equals("NEWGUID", StringComparison.OrdinalIgnoreCase)) + { return Guid.NewGuid().ToString(); - else - return defaultValue; + } + + return defaultValue; } return value; From 391b0b119ed5410a686c6d9dc5d52721992101a3 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:48:39 +0100 Subject: [PATCH 12/37] - catch block was not adding any value --- .../Handlers/TypeConverterHandler.cs | 341 +++++++++--------- 1 file changed, 168 insertions(+), 173 deletions(-) diff --git a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs index 9ebf129..ced2ad8 100644 --- a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs +++ b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs @@ -24,212 +24,207 @@ public dynamic Run(JObject config, JObject input) return value; } - try + if (string.IsNullOrWhiteSpace(dataType)) { - if (!string.IsNullOrWhiteSpace(dataType)) + return value; + } + + switch (dataType.ToUpperInvariant()) + { + case "LONG": + return Convert.ToInt64(value); + + case "JOBJECT": { - switch (dataType.ToUpperInvariant()) + var Jtokenvalue = (JToken)value; + if (Jtokenvalue.Type == JTokenType.Object) { - case "LONG": - return Convert.ToInt64(value); - - case "JOBJECT": - { - var Jtokenvalue = (JToken)value; - if (Jtokenvalue.Type == JTokenType.Object) - { - return (JObject)Jtokenvalue; - } + return (JObject)Jtokenvalue; + } - return JsonConvert.DeserializeObject(Jtokenvalue.ToString()); - } + return JsonConvert.DeserializeObject(Jtokenvalue.ToString()); + } - case "JARRAY": + case "JARRAY": + { + var Jtokenvalue = (JToken)value; + if (Jtokenvalue.Type == JTokenType.Array) + { + if (Jtokenvalue.Any()) { - var Jtokenvalue = (JToken)value; - if (Jtokenvalue.Type == JTokenType.Array) - { - if (Jtokenvalue.Any()) - { - return (JArray)Jtokenvalue; - } - - return null; - } - - if (Jtokenvalue.Type == JTokenType.Object) - { - return new JArray(Jtokenvalue); - } - - if (Jtokenvalue.ToString().StartsWith("[") && Jtokenvalue.ToString().EndsWith("]")) - { - return JArray.Parse(Jtokenvalue.ToString()); - } - - return new JArray(Jtokenvalue); + return (JArray)Jtokenvalue; } - case "SHORT": - return Convert.ToInt16(value); + return null; + } - case "INT": - case "INTEGER": - return Convert.ToInt32(value); + if (Jtokenvalue.Type == JTokenType.Object) + { + return new JArray(Jtokenvalue); + } - case "GUID": - return new Guid(value.ToString()); + if (Jtokenvalue.ToString().StartsWith("[") && Jtokenvalue.ToString().EndsWith("]")) + { + return JArray.Parse(Jtokenvalue.ToString()); + } - case "DATETIME": - { - var valueType = value.ToString(); - var x = new Regex(@".*[+-][0-9][0-9][:]"); - if (x.IsMatch(valueType)) - { - return DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture); - } - - return DateTime.Parse(valueType, CultureInfo.InvariantCulture); - } + return new JArray(Jtokenvalue); + } - case "CUSTOMDATETIME": - { - var valueType = value.ToString(); - var x = new Regex(@".[+-][0-9]{4}"); - if (x.IsMatch(valueType)) - { - var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - var datetime = valueType.Substring(0, pos); - return datetime; - } - - return null; - } + case "SHORT": + return Convert.ToInt16(value); - case "BOOL": - case "BOOLEAN": - return Convert.ToBoolean(value); + case "INT": + case "INTEGER": + return Convert.ToInt32(value); - case "DECIMAL": - return Convert.ToDecimal(value); + case "GUID": + return new Guid(value.ToString()); - case "DECIMAL?": - { - decimal decimalValue; - if (decimal.TryParse(value.ToString(), out decimalValue)) - { - return decimalValue; - } + case "DATETIME": + { + var valueType = value.ToString(); + var x = new Regex(@".*[+-][0-9][0-9][:]"); + if (x.IsMatch(valueType)) + { + return DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture); + } - return null; - } + return DateTime.Parse(valueType, CultureInfo.InvariantCulture); + } - case "INT?": - { - var dval = Convert.ToDecimal(value.ToString()); - return Decimal.ToInt32(dval); - } + case "CUSTOMDATETIME": + { + var valueType = value.ToString(); + var x = new Regex(@".[+-][0-9]{4}"); + if (x.IsMatch(valueType)) + { + var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + var datetime = valueType.Substring(0, pos); + return datetime; + } - case "GUID?": - { - Guid guid; - if (Guid.TryParse(value.ToString(), out guid)) - { - return guid; - } + return null; + } - return null; - } + case "BOOL": + case "BOOLEAN": + return Convert.ToBoolean(value); - case "DATETIME?": - { - DateTime datetime; - if (DateTime.TryParse(value.ToString(), out datetime)) - { - return datetime; - } + case "DECIMAL": + return Convert.ToDecimal(value); - return null; - } + case "DECIMAL?": + { + decimal decimalValue; + if (decimal.TryParse(value.ToString(), out decimalValue)) + { + return decimalValue; + } - case "UTCDATETIME": - { - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) - { - var utcDateTime = dateTime.ToString("s"); - var zone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); - utcDateTime = utcDateTime + "+" + zone.BaseUtcOffset.ToString(); - return utcDateTime; - } - - return null; - } + return null; + } - case "STRINGTOUTCDATEFORMAT": - { - //This block converts the given date into UTC formatted string, it will not change the TimeZone offset - //compared to previous block. - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) - { - var timeInUTCFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); - return timeInUTCFormat; - } - - return null; - } + case "INT?": + { + var dval = Convert.ToDecimal(value.ToString()); + return Decimal.ToInt32(dval); + } + + case "GUID?": + { + Guid guid; + if (Guid.TryParse(value.ToString(), out guid)) + { + return guid; + } + + return null; + } + + case "DATETIME?": + { + DateTime datetime; + if (DateTime.TryParse(value.ToString(), out datetime)) + { + return datetime; + } - case "REMOVEDATETIMEOFFSET": + return null; + } + + case "UTCDATETIME": + { + DateTime dateTime; + if (DateTime.TryParse(value.ToString(), out dateTime)) + { + var utcDateTime = dateTime.ToString("s"); + var zone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); + utcDateTime = utcDateTime + "+" + zone.BaseUtcOffset.ToString(); + return utcDateTime; + } + + return null; + } + + case "STRINGTOUTCDATEFORMAT": + { + //This block converts the given date into UTC formatted string, it will not change the TimeZone offset + //compared to previous block. + DateTime dateTime; + if (DateTime.TryParse(value.ToString(), out dateTime)) + { + var timeInUTCFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); + return timeInUTCFormat; + } + + return null; + } + + case "REMOVEDATETIMEOFFSET": + { + var valueType = value.ToString(); + if (valueType.Contains("Z")) + { + var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + var datetime = valueType.Substring(0, pos + 1); //including 'Z' in the output + return datetime; + } + + return valueType; + } + + case "FORMATTEDDATETIME": + { + DateTime dateTime; + if (DateTime.TryParse(value.ToString(), out dateTime)) + { + string timeInUTCFormat; + if (!string.IsNullOrWhiteSpace(format)) { - var valueType = value.ToString(); - if (valueType.Contains("Z")) - { - var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - var datetime = valueType.Substring(0, pos + 1); //including 'Z' in the output - return datetime; - } - - return valueType; + timeInUTCFormat = dateTime.ToString(format); } - - case "FORMATTEDDATETIME": + else { - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) - { - string timeInUTCFormat; - if (!string.IsNullOrWhiteSpace(format)) - { - timeInUTCFormat = dateTime.ToString(format); - } - else - { - timeInUTCFormat = dateTime.ToString(null, CultureInfo.InvariantCulture); - } - - return timeInUTCFormat; - } - - return null; + timeInUTCFormat = dateTime.ToString(null, CultureInfo.InvariantCulture); } - case "STRING": - { - if (value.GetType().Equals("JValue")) - { - return ((JValue)value).Value(); - } + return timeInUTCFormat; + } - return value.ToString(); - } + return null; + } + + case "STRING": + { + if (value.GetType().Equals("JValue")) + { + return ((JValue)value).Value(); } + + return value.ToString(); } } - catch (Exception ex) - { - throw new Exception("Failed while trying to cast value into " + dataType + ". " + ex.ToString()); - } return value; } From d994c5fda9997f92dcacbba0bec563339325c952 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:51:22 +0100 Subject: [PATCH 13/37] - reSharper guided code cleanup --- .../Handlers/TypeConverterHandler.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs index ced2ad8..e1ad940 100644 --- a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs +++ b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs @@ -32,7 +32,9 @@ public dynamic Run(JObject config, JObject input) switch (dataType.ToUpperInvariant()) { case "LONG": + { return Convert.ToInt64(value); + } case "JOBJECT": { @@ -72,14 +74,20 @@ public dynamic Run(JObject config, JObject input) } case "SHORT": + { return Convert.ToInt16(value); + } case "INT": case "INTEGER": + { return Convert.ToInt32(value); + } case "GUID": + { return new Guid(value.ToString()); + } case "DATETIME": { @@ -109,10 +117,14 @@ public dynamic Run(JObject config, JObject input) case "BOOL": case "BOOLEAN": + { return Convert.ToBoolean(value); + } case "DECIMAL": + { return Convert.ToDecimal(value); + } case "DECIMAL?": { From 32e1875ee8897f0cd4b95469b7d577e81d15283e Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Thu, 29 Sep 2022 16:58:04 +0100 Subject: [PATCH 14/37] - typos - use correct type for textblocks --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 50e08f3..345b104 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Following are some of the capabilities that Automapper currently supports: **Type converter** 1. Primitive data types 2. JObject -3. Jarray +3. JArray 4. DateTime Formatting and Timezone 5. Nullable int, guid and decimal @@ -70,8 +70,8 @@ Source Json ] } ``` -Expeced output -```javascript +Expected output +```json { "Content": [ { @@ -84,7 +84,7 @@ Expeced output ``` Mapping config -```javascript +```json { "MappingRuleConfig": { "TruthTable": [ From c01df941a4c320f26b3217cdb8a6eebe60eed872 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 07:52:10 +0100 Subject: [PATCH 15/37] - reSharper guided code cleanup --- src/JsonToJsonMapper/AutoMapper.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/JsonToJsonMapper/AutoMapper.cs b/src/JsonToJsonMapper/AutoMapper.cs index 233cf52..63a6e82 100644 --- a/src/JsonToJsonMapper/AutoMapper.cs +++ b/src/JsonToJsonMapper/AutoMapper.cs @@ -39,7 +39,9 @@ public AutoMapper(string autoMapperConfig) scripts.Add(script.Name, CSharpScript.Create(script.Code, options, globalsType: typeof(ScriptHost))); } else + { scripts.Add(script.Name, CSharpScript.Create(script.Code, globalsType: typeof(ScriptHost))); + } } } @@ -239,8 +241,8 @@ private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ig { foreach (var a in itemJArray) { - var o = (JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)a, mapping)), JsonConvertSettings); - array.Add(o); + var jTok = (JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)a, mapping)), JsonConvertSettings); + array.Add(jTok); } } else @@ -312,9 +314,8 @@ private string GetValue(JObject jsonObject, string key, Transform transform, out } else { - JContainer json; - json = jsonObject.Parent; - for (var i = 2; i < key.Split(new string[] { "[{parent}]" }, StringSplitOptions.None).Length; i++) + var json = jsonObject.Parent; + for (var i = 2; i < key.Split(new[] { "[{parent}]" }, StringSplitOptions.None).Length; i++) { json = json.Parent; } From 0475f37f4edd03487cc8d26ac6ea91fe5efd3846 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 08:15:58 +0100 Subject: [PATCH 16/37] - code cleanup --- src/JsonToJsonMapper/AutoMapper.cs | 96 +++++++++++++----------------- 1 file changed, 40 insertions(+), 56 deletions(-) diff --git a/src/JsonToJsonMapper/AutoMapper.cs b/src/JsonToJsonMapper/AutoMapper.cs index 63a6e82..0676049 100644 --- a/src/JsonToJsonMapper/AutoMapper.cs +++ b/src/JsonToJsonMapper/AutoMapper.cs @@ -5,22 +5,25 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; -public class AutoMapper : IDisposable +public class AutoMapper { - public MappingRule Mapping { get; set; } - private JsonSerializerSettings JsonConvertSettings { get; set; } - private readonly TransformationFactory handler; + private readonly MappingRule _mapping; + + private readonly JsonSerializerSettings _jsonConvertSettings = new() + { + DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind, + DateParseHandling = DateParseHandling.None + }; + + private readonly TransformationFactory _handler; public AutoMapper(string autoMapperConfig) { - JsonConvertSettings = new JsonSerializerSettings(); - JsonConvertSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; - JsonConvertSettings.DateParseHandling = DateParseHandling.None; - handler = new TransformationFactory(); + _handler = new TransformationFactory(); var config = JsonConvert.DeserializeObject(autoMapperConfig); - Mapping = config.MappingRuleConfig; + _mapping = config.MappingRuleConfig; - if (Mapping == null || !Mapping.TruthTable.Any()) + if (_mapping == null || !_mapping.TruthTable.Any()) { throw new Exception("Invalid mapping json"); } @@ -32,25 +35,18 @@ public AutoMapper(string autoMapperConfig) { foreach (var script in config.Scripts) { - if (script.Reference != null) - { - // With assembly import - var options = ScriptOptions.Default.AddReferences(script.Reference.Assembly).WithImports(script.Reference.NameSpace); - scripts.Add(script.Name, CSharpScript.Create(script.Code, options, globalsType: typeof(ScriptHost))); - } - else - { - scripts.Add(script.Name, CSharpScript.Create(script.Code, globalsType: typeof(ScriptHost))); - } + // With assembly import + var options = script.Reference != null ? ScriptOptions.Default.AddReferences(script.Reference.Assembly).WithImports(script.Reference.NameSpace) : null; + scripts.Add(script.Name, CSharpScript.Create(script.Code, options, globalsType: typeof(ScriptHost))); } } // Load all the handlers - handler.AddHandlers(new TransposeHandler()); - handler.AddHandlers(new TypeConverterHandler()); - handler.AddHandlers(new ValueMappingHandler()); - handler.AddHandlers(new RoslynScriptHandler(scripts)); - handler.AddHandlers(new FunctionHandler()); + _handler.AddHandlers(new TransposeHandler()); + _handler.AddHandlers(new TypeConverterHandler()); + _handler.AddHandlers(new ValueMappingHandler()); + _handler.AddHandlers(new RoslynScriptHandler(scripts)); + _handler.AddHandlers(new FunctionHandler()); } /// @@ -60,22 +56,22 @@ public AutoMapper(string autoMapperConfig) /// public object Transform(string inputJson) { - if (Mapping.DestinationType == null) + if (_mapping.DestinationType == null) { throw new Exception("Invalid mapping json"); } - return Execute((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping); + return Execute((JObject)JsonConvert.DeserializeObject(inputJson, _jsonConvertSettings), _mapping); } public object Transform(JObject jObj) { - if (Mapping.DestinationType == null) + if (_mapping.DestinationType == null) { throw new Exception("Invalid mapping json"); } - return Execute(jObj, Mapping); + return Execute(jObj, _mapping); } /// @@ -107,7 +103,7 @@ private object Execute(JObject jsonObject, MappingRule mapping) rule.DataType = valueType; } - var finalValue = handler.GetHandler() + var finalValue = _handler.GetHandler() .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); propertyInfo.SetValue(entity, finalValue, null); } @@ -134,14 +130,14 @@ private object Execute(JObject jsonObject, MappingRule mapping) /// public string TransformIntoJson(string inputJson, bool ignoreNullValue) { - Mapping.IgnoreNullValue = ignoreNullValue; - return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); + _mapping.IgnoreNullValue = ignoreNullValue; + return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, _jsonConvertSettings), _mapping)); } public JObject TransformIntoJson(JObject jObj, bool ignoreNullValue) { - Mapping.IgnoreNullValue = ignoreNullValue; - return ExecuteToJson(jObj, Mapping); + _mapping.IgnoreNullValue = ignoreNullValue; + return ExecuteToJson(jObj, _mapping); } /// @@ -151,12 +147,12 @@ public JObject TransformIntoJson(JObject jObj, bool ignoreNullValue) /// public string TransformIntoJson(string inputJson) { - return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, JsonConvertSettings), Mapping)); + return JsonConvert.SerializeObject(ExecuteToJson((JObject)JsonConvert.DeserializeObject(inputJson, _jsonConvertSettings), _mapping)); } public string TransformIntoJson(JObject jObj) { - return JsonConvert.SerializeObject(ExecuteToJson(jObj, Mapping)); + return JsonConvert.SerializeObject(ExecuteToJson(jObj, _mapping)); } protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) @@ -167,7 +163,7 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) // handle transpose if (rule.TransformValue != null && rule.TransformValue.Type != null && string.Equals(rule.TransformValue.Type, "promoteArrayToProperty", StringComparison.OrdinalIgnoreCase)) { - Dictionary transposeResponse = handler.GetHandler() + Dictionary transposeResponse = _handler.GetHandler() .Run(JObject.FromObject(rule), jsonObject); if (transposeResponse != null) { @@ -188,7 +184,7 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) rule.DataType = valueType; } - var finalValue = handler.GetHandler() + var finalValue = _handler.GetHandler() .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); if (finalValue != null || finalValue.Type != JTokenType.Null || (finalValue == null && !mapping.IgnoreNullValue) || (finalValue.Type == JTokenType.Null && !mapping.IgnoreNullValue)) { @@ -211,7 +207,7 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) { if (!string.IsNullOrWhiteSpace(rule.DataType)) { - jsonString.Json.Add(rule.DestinationColumn, handler.GetHandler() + jsonString.Json.Add(rule.DestinationColumn, _handler.GetHandler() .Run(JObject.FromObject(rule), JObject.FromObject(new { value = result }))); } else @@ -241,7 +237,7 @@ private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ig { foreach (var a in itemJArray) { - var jTok = (JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)a, mapping)), JsonConvertSettings); + var jTok = (JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)a, mapping)), _jsonConvertSettings); array.Add(jTok); } } @@ -253,7 +249,7 @@ private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ig } else { - array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item, mapping)), JsonConvertSettings)); + array.Add((JToken)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(ExecuteToJson((JObject)item, mapping)), _jsonConvertSettings)); } } @@ -272,12 +268,12 @@ private string GetValue(JObject jsonObject, string key, Transform transform, out if (transform != null && transform.Type != null && transform.Type.Equals("SCRIPT", StringComparison.OrdinalIgnoreCase)) { - return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); + return _handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); } if (transform != null && transform.Type != null && transform.Type.Equals("FUNCTION", StringComparison.OrdinalIgnoreCase)) { - return handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); + return _handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); } if (!string.IsNullOrEmpty(key) && key.StartsWith("$")) @@ -368,22 +364,10 @@ private string GetValue(JObject jsonObject, string key, Transform transform, out if (transform != null) { - value = handler.GetHandler() + value = _handler.GetHandler() .Run(JObject.FromObject(transform), JObject.FromObject(new { value = value })); } return value; } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - // Protected implementation of Dispose pattern. - protected virtual void Dispose(bool disposing) - { - Mapping = null; - } } From 92964eb29844b2be7a938a8e82ab422fc5669f9b Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 08:16:11 +0100 Subject: [PATCH 17/37] - code cleanup --- src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs | 10 +++++----- src/JsonToJsonMapper/Handlers/TransformationFactory.cs | 9 +++------ 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs index 99f71e2..8314637 100644 --- a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs +++ b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs @@ -6,11 +6,11 @@ internal class RoslynScriptHandler : ITransformationHandler { - public Dictionary Scripts { get; set; } + private readonly Dictionary _scripts; public RoslynScriptHandler(Dictionary scripts) { - Scripts = scripts; + _scripts = scripts; } /// @@ -32,9 +32,9 @@ public dynamic Run(JObject transform, JObject input) if (input.SelectTokens(item) != null) { var tokens = input.SelectTokens(item); - foreach (var i in tokens) + foreach (var token in tokens) { - inputParam.Append(i.ToString()); + inputParam.Append(token.ToString()); if (tokens.Count() > 1) { inputParam.Append("[tokenDelimiter]"); @@ -53,7 +53,7 @@ public dynamic Run(JObject transform, JObject input) } } - var result = Scripts[scriptName].RunAsync(new ScriptHost { Args = inputParam.ToString() }); + var result = _scripts[scriptName].RunAsync(new ScriptHost { Args = inputParam.ToString() }); return result.Result.ReturnValue.ToString(); } } diff --git a/src/JsonToJsonMapper/Handlers/TransformationFactory.cs b/src/JsonToJsonMapper/Handlers/TransformationFactory.cs index 0ebc7e6..7bc259f 100644 --- a/src/JsonToJsonMapper/Handlers/TransformationFactory.cs +++ b/src/JsonToJsonMapper/Handlers/TransformationFactory.cs @@ -2,7 +2,7 @@ internal class TransformationFactory { - private readonly Dictionary registeredHandlers = new Dictionary(); + private readonly Dictionary _registeredHandlers = new(); /// /// Add handler to the dictionary @@ -10,7 +10,7 @@ internal class TransformationFactory /// public void AddHandlers(ITransformationHandler handler) { - registeredHandlers[handler.GetType().Name] = handler; + _registeredHandlers[handler.GetType().Name] = handler; } /// @@ -20,9 +20,6 @@ public void AddHandlers(ITransformationHandler handler) /// public ITransformationHandler GetHandler() { - if (!registeredHandlers.ContainsKey(typeof(T).Name)) - return null; - - return registeredHandlers[typeof(T).Name]; + return !_registeredHandlers.ContainsKey(typeof(T).Name) ? null : _registeredHandlers[typeof(T).Name]; } } From 719bc72e4595c30fd14c24185c5760d554f4f72f Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 08:35:18 +0100 Subject: [PATCH 18/37] - formatting --- src/JsonToJsonMapper/AutoMapper.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/JsonToJsonMapper/AutoMapper.cs b/src/JsonToJsonMapper/AutoMapper.cs index 0676049..3e2981b 100644 --- a/src/JsonToJsonMapper/AutoMapper.cs +++ b/src/JsonToJsonMapper/AutoMapper.cs @@ -161,7 +161,9 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) foreach (var rule in mapping.TruthTable) { // handle transpose - if (rule.TransformValue != null && rule.TransformValue.Type != null && string.Equals(rule.TransformValue.Type, "promoteArrayToProperty", StringComparison.OrdinalIgnoreCase)) + if (rule.TransformValue != null && + rule.TransformValue.Type != null && + string.Equals(rule.TransformValue.Type, "promoteArrayToProperty", StringComparison.OrdinalIgnoreCase)) { Dictionary transposeResponse = _handler.GetHandler() .Run(JObject.FromObject(rule), jsonObject); @@ -186,7 +188,10 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) var finalValue = _handler.GetHandler() .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); - if (finalValue != null || finalValue.Type != JTokenType.Null || (finalValue == null && !mapping.IgnoreNullValue) || (finalValue.Type == JTokenType.Null && !mapping.IgnoreNullValue)) + if (finalValue != null || + finalValue.Type != JTokenType.Null || + (finalValue == null && !mapping.IgnoreNullValue) || + (finalValue.Type == JTokenType.Null && !mapping.IgnoreNullValue)) { jsonString.Json.Add(destinationValue, finalValue); } From 597cb8c1bffd7628706d56ecc1a2753069541ec3 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 08:53:42 +0100 Subject: [PATCH 19/37] - remove catch blocks as they were not adding any value --- test/JsonToJsonMapper.Tests/AutoMapperTest.cs | 439 ++++++------------ 1 file changed, 132 insertions(+), 307 deletions(-) diff --git a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index e76e076..4246164 100644 --- a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -22,7 +22,7 @@ public void Validate_AutoMapper_ExceptionThrownByInvalidMappingJson() try { var mapper = new AutoMapper(mappingJson); - var lead = mapper.TransformIntoJson(inputJson, true); + _ = mapper.TransformIntoJson(inputJson, true); Assert.Fail(); } catch (Exception ex) @@ -46,7 +46,7 @@ public void Validate_AutoMapper_InvalidDatatype() { //Act var mapper = new AutoMapper(mappingJson); - var lead = (LeadRecord)mapper.Transform(inputJson); + _ = (LeadRecord)mapper.Transform(inputJson); Assert.Fail(); } catch (Exception ex) @@ -68,15 +68,9 @@ public void Validate_AutoMapper_NullValue() //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsNull(lead.Name); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + var lead = (LeadRecord)mapper.Transform(inputJson); + + Assert.IsNull(lead.Name); } [TestMethod, Description("Validate that the property is not set if the value is empty string except if the datatype is string.")] @@ -91,16 +85,10 @@ public void Validate_AutoMapper_EmptyString() //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.AllowEmail == false); - Assert.IsTrue(lead.LeadScore == 101); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + var lead = (LeadRecord)mapper.Transform(inputJson); + + Assert.IsTrue(lead.AllowEmail == false); + Assert.IsTrue(lead.LeadScore == 101); } [TestMethod, Description("Validate that the datetime value is not modified due to transformation.")] @@ -116,17 +104,10 @@ public void Validate_AutoMapper_DateTimeValidation() //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = mapper.TransformIntoJson(inputJson, true); + var lead = mapper.TransformIntoJson(inputJson, true); - Assert.IsTrue(lead.Contains("2015-10-29T07:48:27.767-07:00") && lead.Contains("2015-10-29T07:48:27.767-07:00") - && lead.Contains("11/02/2015 15:15:00 -08:00") && lead.Contains("11/02/2015 16:30:00 -08:00") && lead.Contains("8707")); - } - catch (Exception) - { - Assert.Fail(); - } + Assert.IsTrue(lead.Contains("2015-10-29T07:48:27.767-07:00") && lead.Contains("2015-10-29T07:48:27.767-07:00") + && lead.Contains("11/02/2015 15:15:00 -08:00") && lead.Contains("11/02/2015 16:30:00 -08:00") && lead.Contains("8707")); } [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] @@ -141,15 +122,9 @@ public void Validate_AutoMapper_DefaultValue1() //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "NA"); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + var lead = (LeadRecord)mapper.Transform(inputJson); + + Assert.IsTrue(lead.Name == "NA"); } [TestMethod, Description("Validate that the property is mapped according to input value.")] @@ -164,15 +139,9 @@ public void Validate_AutoMapper_DefaultValue2() //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "true"); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + var lead = (LeadRecord)mapper.Transform(inputJson); + + Assert.IsTrue(lead.Name == "true"); } [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] @@ -187,15 +156,9 @@ public void Validate_AutoMapper_DefaultValue3() //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "NA"); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + var lead = (LeadRecord)mapper.Transform(inputJson); + + Assert.IsTrue(lead.Name == "NA"); } [TestMethod, Description("Validate that the property is set to custom value if the value passed is empty.")] @@ -210,15 +173,9 @@ public void Validate_AutoMapper_EmptyValue() //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.Name == "true"); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + var lead = (LeadRecord)mapper.Transform(inputJson); + + Assert.IsTrue(lead.Name == "true"); } [TestMethod, Description("Complex transformation test - Validate that the value returned is a complex type.")] @@ -253,6 +210,7 @@ public void PromoteAttributesToPropertyTestWithoutPrependKeyText() var response = mapper.TransformIntoJson(inputJson, true); var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""SourceType"":""Webpagevisit"",""SourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""ClientIPAddress"":""203.141.7.100"",""UserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""WebpageID"":4,""WebpageURL"":""/anti-phishing.html""}]}"; var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert Assert.AreEqual(value, expectedResponse); } @@ -271,6 +229,7 @@ public void PromoteAttributesToPropertyTestWithPrependKeyText() var response = mapper.TransformIntoJson(inputJson, true); var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""AttributeSourceType"":""Webpagevisit"",""AttributeSourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""AttributeClientIPAddress"":""203.141.7.100"",""AttributeUserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""AttributeWebpageID"":4,""AttributeWebpageURL"":""/anti-phishing.html""}]}"; var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert Assert.IsTrue(value.Contains("AttributeWebpageURL")); Assert.AreEqual(value, expectedResponse); @@ -291,6 +250,7 @@ public void RoslynTest() var response = mapper.TransformIntoJson(inputJson, true); var expectedResponse = @"{""EventList"":[{""title"":""Windows 10 for device management"",""accountCode"":""C-and-E"",""Id"":""APAC-1PWBNR3-0331-16-HQ"",""Status"":""Live"",""timezone"":""(GMT+05:00) Islamabad, Karachi, Tashkent"",""source"":""Certain"",""EventCategory"":""Onsite Event"",""StartDate"":""2016-03-31T08:00:00Z"",""EndDate"":""2016-03-31T16:00:00Z"",""locationCode"":""Webinar"",""Description"":""A"",""PrimaryLanguage"":[""""],""PrimaryTargetAudience"":[""""],""Product"":[""""],""Category"":""TBD"",""URL"":""www.microsoft.com""}],""RequestId"":""4bfaac9c-1e0d-4620-b9e6-66095376e99a""}"; var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); } @@ -309,6 +269,7 @@ public void ParentDataTest() var response = mapper.TransformIntoJson(inputJson, true); var expectedResponse = @"{""Answers"":[{""eventId"":""100"",""questionId"":""Q1"",""value"":""1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q1"",""value"":""2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q2"",""value"":""3Consumers,Partners""},{""eventId"":""200"",""questionId"":""Q3""},{""eventId"":""200"",""questionId"":""Q4"",""value"":""4Klo""}]}"; var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + //Assert Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); } @@ -322,15 +283,9 @@ public void Validate_ValueMappingHandler_DefaultValue() //Act ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - Assert.IsTrue(response == "Certain"); - } - catch (Exception) - { - Assert.Fail(); - } + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + + Assert.IsTrue(response == "Certain"); } [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is UTC now.")] @@ -342,16 +297,9 @@ public void Validate_ValueMappingHandler_DefaultValue_UtcNow() //Act ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - DateTime date; - Assert.IsTrue(DateTime.TryParse(response, out date)); - } - catch (Exception) - { - Assert.Fail(); - } + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + + Assert.IsTrue(DateTime.TryParse(response, out DateTime _)); } [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is new Guid.")] @@ -363,16 +311,9 @@ public void Validate_ValueMappingHandler_DefaultValue_Guid() //Act ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - Guid guid; - Assert.IsTrue(Guid.TryParse(response, out guid)); - } - catch (Exception) - { - Assert.Fail(); - } + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + + Assert.IsTrue(Guid.TryParse(response, out Guid _)); } [TestMethod, Description("ValueMappingHandler test - Validate that the default value is returned is mapped.")] @@ -384,15 +325,9 @@ public void Validate_ValueMappingHandler_DefaultValue_Mapping() //Act ITransformationHandler handler = new ValueMappingHandler(); - try - { - var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); - Assert.IsTrue(response == "2"); - } - catch (Exception) - { - Assert.Fail(); - } + var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + + Assert.IsTrue(response == "2"); } [TestMethod, Description("Function handler test - Validate that the value returned is concatenated.")] @@ -535,9 +470,7 @@ public void FunctionTest_ReplaceValue() public void FunctionTest_ReplaceValueNode_Failure() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'CNE','ReturnValue':'','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -554,9 +487,7 @@ public void FunctionTest_ReplaceValueNode_Failure() public void FunctionTest_ReplaceValueNode_Sucess() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'Topic','ReturnValue':'RV','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -573,9 +504,7 @@ public void FunctionTest_ReplaceValueNode_Sucess() public void FunctionTest_ReplaceValueNode_JsonPath() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -592,9 +521,7 @@ public void FunctionTest_ReplaceValueNode_JsonPath() public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": null, }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -611,9 +538,7 @@ public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() public void FunctionTest_ReplaceValue_ReturnValue_Node() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -630,9 +555,7 @@ public void FunctionTest_ReplaceValue_ReturnValue_Node() public void FunctionTest_ReplaceValueNodeTwo() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": \"+1234565430\", \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Mswide\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'MSWide','ReturnValue':'','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); @@ -726,6 +649,7 @@ public void Automapper_IgnoreNullFalseTest() //Act var response = mapper.TransformIntoJson(JObject.Parse(inputJson), true); var expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; + //Assert Assert.IsTrue(JToken.DeepEquals(response, JObject.Parse(expectedResponse))); } @@ -836,15 +760,9 @@ public void Validate_AutoMapper_NullDataType() //Act var mapper = new AutoMapper(mappingJson); - try - { - var lead = (LeadRecord)mapper.Transform(inputJson); - Assert.IsTrue(lead.LeadScore == 100); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } + var lead = (LeadRecord)mapper.Transform(inputJson); + + Assert.IsTrue(lead.LeadScore == 100); } [TestMethod, Description("Validate that the JObject and JArray are created With same Flattene Object.")] @@ -857,20 +775,12 @@ public void AutoMappperMappingForJObjectAndJarray() var mappingJson = "{ \"MappingRuleConfig\": { \"DestinationType\": \"JObject\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramName\", \"DestinationColumn\": \"ProgramName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Folder\", \"DataType\": \"JObject\", \"ComplexType\": { \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramFolderId\", \"DestinationColumn\": \"id\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramFolderType\", \"DestinationColumn\": \"type\", \"DataType\": \"string\" } ] } }, { \"SourceColumn\": \"$.ProgramDescription\", \"DestinationColumn\": \"ProgramDescription\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramType\", \"DestinationColumn\": \"ProgramType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramChannel\", \"DestinationColumn\": \"ProgramChannel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Costs\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"IgnoreEmptyArray\": true, \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramStartDate\", \"DestinationColumn\": \"startDate\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramCosts\", \"DestinationColumn\": \"cost\", \"DataType\": \"string\" } ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(inputJson); - var expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; + var output = mapper.TransformIntoJson(inputJson); + var expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; - Assert.AreEqual(output, expectedOutput); - } - catch (Exception) - { - Assert.Fail(); - } + Assert.AreEqual(output, expectedOutput); } [TestMethod, Description("Validate that the datetime format is not changed after transformation.")] @@ -883,20 +793,12 @@ public void AutoMappperMapping_ValidateDateTimeFormat() var mappingJson = "{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventId','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': '-1'}},{'SourceColumn': '$.MifContext.correlationId','DestinationColumn': 'BatchId','DataType': 'guid','ComplexType': null,'TransformValue': null},{'SourceColumn': '','DestinationColumn': 'RequestId','DataType': 'guid','ComplexType': null,'TransformValue': {'DefaultValue': 'newGuid'}},{'SourceColumn': '','DestinationColumn': 'MoreResults','DataType': 'bool','ComplexType': null,'TransformValue': {'DefaultValue': 'false'}},{'SourceColumn': '','DestinationColumn': 'SchemaName','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': 'JournalEvents.EventPoint.ProgramDay'}},{'SourceColumn': '','DestinationColumn': 'ContentObject','DataType': 'JArray','ComplexType': {'DataType': 'JArray','Node': '$.Content[*]','TruthTable': [{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programId','DestinationColumn': 'ProgramId','DataType': 'string'},{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programCode','DestinationColumn': 'ProgramCode','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'ProgramDayDate','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'LongFormattedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ',},{'SourceColumn': '$.ShortFormattedDate','DestinationColumn': 'ShortFormattedDate','DataType': 'string'},{'SourceColumn': '$.DateString','DestinationColumn': 'DateString','DataType': 'string'},{'SourceColumn': '$.DateIndex','DestinationColumn': 'DateIndex','DataType': 'string'}]}},{'SourceColumn': '','DestinationColumn': 'CreatedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}},{'SourceColumn': '','DestinationColumn': 'EventDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}}]}}"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - Assert.AreEqual(output["ContentObject"][0]["ProgramDayDate"].ToString(), "2015-11-30T00:00:00"); - Assert.AreEqual(output["ContentObject"][0]["ShortFormattedDate"].ToString(), "11/30/2015"); - } - catch (Exception) - { - Assert.Fail(); - } + Assert.AreEqual(output["ContentObject"][0]["ProgramDayDate"].ToString(), "2015-11-30T00:00:00"); + Assert.AreEqual(output["ContentObject"][0]["ShortFormattedDate"].ToString(), "11/30/2015"); } [TestMethod, Description("Validate that the concatenation where nulls are present.")] @@ -909,19 +811,12 @@ public void AutoMappperMapping_ConcatWithNull() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; + + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate that the concatenation where nulls are present.")] @@ -934,20 +829,12 @@ public void AutoMappperMapping_ConcatWithEmptyList() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; - Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate that the DateTime offset is removed from the value to be returned.")] @@ -960,20 +847,13 @@ public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithOffset() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate that the DateTime is sent as it is if no offset is present.")] @@ -986,20 +866,13 @@ public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithoutOffset() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] @@ -1012,20 +885,13 @@ public void AutoMappperMapping_ReplaceValueFunction_HappyPath() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] @@ -1038,20 +904,13 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamNull() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] @@ -1064,20 +923,13 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamNotPresent() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] @@ -1090,20 +942,13 @@ public void AutoMappperMapping_ReplaceValueFunction_ReturnValueNullParamNull() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\" }"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] @@ -1116,20 +961,13 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyString() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + _= JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] @@ -1142,20 +980,13 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpace() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] @@ -1168,20 +999,13 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] @@ -1194,20 +1018,13 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEm var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] @@ -1220,20 +1037,13 @@ public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgn var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; - //Act var mapper = new AutoMapper(mappingJson); - try - { - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - var j = JObject.Parse(expectedOutput); - Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); - } - catch (Exception ex) - { - Assert.Fail("Test failed: " + ex.Message); - } + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + _ = JObject.Parse(expectedOutput); + + Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Test one to one mapping functionality")] @@ -1252,7 +1062,7 @@ public void OneToOneMappingTest() input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } - //Act + //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); @@ -1276,7 +1086,7 @@ public void RangeMappingTest() input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); } - //Act + //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); @@ -1291,10 +1101,12 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Ampersand() var inputJson = "{ \"data\": { \"companyName\": \"Procter & Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1305,10 +1117,12 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Dollar() var inputJson = "{ \"data\": { \"companyName\": \"Procter $ Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1319,10 +1133,12 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Plus() var inputJson = "{ \"data\": { \"companyName\": \"Procter + Gamble Company\", \"countryName\": \"Bulgaria+\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1333,24 +1149,28 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Space() var inputJson = "{ \"data\": { \"companyName\": \"Procter Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Percent")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Percent() + public void FunctionHandler_UriEscapeDataString_HappyPath_Percent() { // Arrange var inputJson = "{ \"data\": { \"companyName\": \"Procter%Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1361,10 +1181,12 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Exclamation() var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1373,12 +1195,13 @@ public void FunctionHanlder_UriEscapeDataString_Null_Parameters() { // Arrange var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": null } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); // string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, new JObject())); } @@ -1393,6 +1216,7 @@ public void FunctionHanlder_UriEscapeDataString_One_Null_Parameter() var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1407,6 +1231,7 @@ public void FunctionHanlder_UriEscapeDataString_Invalid_Parameter_Field() var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } -} \ No newline at end of file +} From 18c3c52550908e2268c784083aeec4cd014e4445 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 09:08:28 +0100 Subject: [PATCH 20/37] - code cleanup - fixed typos --- test/JsonToJsonMapper.Tests/AutoMapperTest.cs | 510 +++++++++--------- 1 file changed, 251 insertions(+), 259 deletions(-) diff --git a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index 4246164..35e12cb 100644 --- a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -13,12 +13,11 @@ public class AutoMapperTest public void Validate_AutoMapper_ExceptionThrownByInvalidMappingJson() { // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + const string mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; + const string inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; - //Act + //Act try { var mapper = new AutoMapper(mappingJson); @@ -36,11 +35,9 @@ public void Validate_AutoMapper_ExceptionThrownByInvalidMappingJson() public void Validate_AutoMapper_InvalidDatatype() { // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + const string mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MAPUnitTest.LeadRecord, MAPUnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable1\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = - "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100a}"; + const string inputJson = "{\"name\": \"Rohit\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100a}"; try { @@ -60,11 +57,9 @@ public void Validate_AutoMapper_InvalidDatatype() public void Validate_AutoMapper_NullValue() { // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + const string mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = - "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; + const string inputJson = "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":100}"; //Act var mapper = new AutoMapper(mappingJson); @@ -77,11 +72,9 @@ public void Validate_AutoMapper_NullValue() public void Validate_AutoMapper_EmptyString() { // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + const string mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = - "{\"name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"101\"}"; + const string inputJson = "{\"name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"101\"}"; //Act var mapper = new AutoMapper(mappingJson); @@ -95,30 +88,31 @@ public void Validate_AutoMapper_EmptyString() public void Validate_AutoMapper_DateTimeValidation() { // Arrange - var mappingJson = + const string mappingJson = @"{ ""MappingRuleConfig"": { ""TruthTable"": [ { ""SourceColumn"": """", ""DestinationColumn"": ""EventId"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""-1"" } }, { ""SourceColumn"": ""$.MifContext.correlationId"", ""DestinationColumn"": ""Token"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""SchemaName"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": { ""DefaultValue"": ""JournalEvents.EventCore.SessionScanData"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""Content"", ""DataType"": ""string"", ""ComplexType"": null, ""TransformValue"": null }, { ""SourceColumn"": """", ""DestinationColumn"": ""ContentObject"", ""DataType"": ""string"", ""ComplexType"": { ""DataType"": ""JArray"", ""Node"": ""$.GetReportResponse[*].GetReportResult[*].diffgr:diffgram[*].DocumentElement[*].['Session Scan Data']"", ""TruthTable"": [ { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.id"", ""DestinationColumn"": ""EventKey"", ""DataType"": ""string"" }, { ""SourceColumn"": ""$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].ForEachContext.name"", ""DestinationColumn"": ""EventName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Event ID"", ""DestinationColumn"": ""EventID"", ""DataType"": ""int"" }, { ""SourceColumn"": ""RegStatusID"", ""DestinationColumn"": ""RegStatusID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Registrant ID"", ""DestinationColumn"": ""RegistrantID"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Type"", ""DestinationColumn"": ""Type"", ""DataType"": ""string"" }, { ""SourceColumn"": ""First Name"", ""DestinationColumn"": ""FirstName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Last Name"", ""DestinationColumn"": ""LastName"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Email"", ""DestinationColumn"": ""Email"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignedUp"", ""DestinationColumn"": ""SignedUp"", ""DataType"": ""string"" }, { ""SourceColumn"": ""SignupInsertDate"", ""DestinationColumn"": ""SignupInsertDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationSignupModifiedDate"", ""DestinationColumn"": ""PresentationSignupModifiedDate"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Code"", ""DestinationColumn"": ""SessionCode"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Session Title"", ""DestinationColumn"": ""SessionTitle"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Start Time"", ""DestinationColumn"": ""StartTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""End Time"", ""DestinationColumn"": ""EndTime"", ""DataType"": ""string"" }, { ""SourceColumn"": ""Track"", ""DestinationColumn"": ""Track"", ""DataType"": ""string"" }, { ""SourceColumn"": ""PresentationCheckedInDate"", ""DestinationColumn"": ""PresentationCheckedInDate"", ""DataType"": ""string"" } ] } }, { ""SourceColumn"": """", ""DestinationColumn"": ""EventDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } }, { ""SourceColumn"": """", ""DestinationColumn"": ""CreatedDate"", ""DataType"": ""formattedDatetime"", ""Format"": ""yyyy-MM-ddTHH:mm:ssZ"", ""TransformValue"": { ""DefaultValue"": ""utcNow"" } } ] }}"; - var inputJson = + const string inputJson = @"{ ""GetReportResponse"": [ { ""@xmlns"": ""https://api.eventcore.com/"", ""GetReportResult"": [ { ""diffgr:diffgram"": [ { ""@xmlns:msdata"": ""urn:schemas-microsoft-com:xml-msdata"", ""@xmlns:diffgr"": ""urn:schemas-microsoft-com:xml-diffgram-v1"", ""DocumentElement"": [ { ""@xmlns"": """", ""Session Scan Data"": [ { ""@diffgr:id"": ""Session Scan Data1"", ""@msdata:rowOrder"": ""0"", ""@diffgr:hasChanges"": ""inserted"", ""Event ID"": ""14337"", ""RegStatusID"": ""7"", ""Registrant ID"": ""2017054"", ""Type"": ""General Attendee"", ""First Name"": ""emad"", ""Last Name"": ""AbuAljazer "", ""Email"": ""jazer313@hotmail.com"", ""SignedUp"": ""true"", ""SignupInsertDate"": ""2015-10-29T07:48:27.767-07:00"", ""PresentationSignupModifiedDate"": ""2015-10-29T07:48:27.767-07:00"", ""Session Code"": ""ITPRO17"", ""Session Title"": ""Deploy virtual machines in the cloud part II"", ""Start Time"": ""11/02/2015 15:15:00 -08:00"", ""End Time"": ""11/02/2015 16:30:00 -08:00"", ""Track"": ""IT Professional"" } ] } ] } ] } ], ""recordCount"": ""-1"" } ], ""MifContext"": { ""runImmediate"": true, ""runId"": ""b8cb0be4-2375-4de2-9781-15dbbf8bc9b3"", ""TrackingEnabled"": false, ""WorkFlowName"": ""EventCoreSessionScanDataToEDP"", ""moreData"": ""true"", ""start_Index"": 501, ""end_Index"": 1000, ""correlationId"": ""8ab25b61-ec8a-4b40-8189-4b77f4f3cbf5"" }, ""ForEachContext"": { ""id"": ""8707"", ""name"": ""MGX FY14"" }}"; - //Act var mapper = new AutoMapper(mappingJson); var lead = mapper.TransformIntoJson(inputJson, true); - Assert.IsTrue(lead.Contains("2015-10-29T07:48:27.767-07:00") && lead.Contains("2015-10-29T07:48:27.767-07:00") - && lead.Contains("11/02/2015 15:15:00 -08:00") && lead.Contains("11/02/2015 16:30:00 -08:00") && lead.Contains("8707")); + Assert.IsTrue( + lead.Contains("2015-10-29T07:48:27.767-07:00") && + lead.Contains("2015-10-29T07:48:27.767-07:00") && + lead.Contains("11/02/2015 15:15:00 -08:00") && + lead.Contains("11/02/2015 16:30:00 -08:00") && + lead.Contains("8707")); } [TestMethod, Description("Validate that the property is set to default value if the value is not passed.")] public void Validate_AutoMapper_DefaultValue1() { // Arrange - var mappingJson = - "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":null,\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; + const string mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":null,\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = - "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; + const string inputJson = "{\"name\": null,\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; //Act var mapper = new AutoMapper(mappingJson); @@ -131,10 +125,10 @@ public void Validate_AutoMapper_DefaultValue1() public void Validate_AutoMapper_DefaultValue2() { // Arrange - var mappingJson = + const string mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = + const string inputJson = "{\"Name\": \"1\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; //Act @@ -148,10 +142,10 @@ public void Validate_AutoMapper_DefaultValue2() public void Validate_AutoMapper_DefaultValue3() { // Arrange - var mappingJson = + const string mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = + const string inputJson = "{\"Name\": \"22\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; //Act @@ -165,10 +159,10 @@ public void Validate_AutoMapper_DefaultValue3() public void Validate_AutoMapper_EmptyValue() { // Arrange - var mappingJson = + const string mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": \"string\",\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": false},{\"ExistingValue\": \"\",\"NewValue\": true}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": \"int\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": \"bool\",\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": \"Guid\",\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = + const string inputJson = "{\"Name\": \"\",\"allowEmail\": false,\"SalesId\": null,\"Leadscore\":\"100\"}"; //Act @@ -182,9 +176,9 @@ public void Validate_AutoMapper_EmptyValue() public void Complex2FlatTransformationTest() { //Arrange - Certain input json with complex object - var inputJson = + const string inputJson = "{\"dateCreated\": \"2015-08-31T14:30:00\", \"accountCode\": \"Cross-Product\", \"isActive\": true, \"isHotel\": false, \"isPreferred\": false, \"brandFrnId\": null, \"chainFrnId\": null, \"locationType\": \"Venue\", \"largestSpace\": null, \"numberOfMeetRooms\": null, \"numberOfRooms\": null, \"totalSpace\": null, \"address\": { \"line1\": \"750 Main Street\", \"line2\": null, \"line3\": null, \"line4\": null, \"city\": \"Moncton\", \"state\": \"New Brunswick\", \"postalCode\": \"E1C 1E6\", \"country\": \"Canada\", \"intlState\": null }, \"locationThirdParty\": null, \"locationCode\": \"msft_can_delta_monc\", \"desc\": \"\", \"directions\": \"\", \"email\": \"\", \"externalFrnKey\": null, \"fax\": \"\", \"imgAttributes\": \"\", \"imgSrc\": null, \"label\": \"\", \"name\": \"Delta Beausejour Hotel\", \"notes\": \"\", \"organization\": null, \"phone\": \"\", \"tollfree\": \"\", \"url\": \"http://binged.it/1O4l53S\" } "; - var mapping = "{\"MappingRuleConfig\":{\"DestinationType\":\"\",\"SourceObject\":\"\",\"DestinationObject\":\"\",\"TruthTable\":[{\"SourceColumn\":\"$.address['city']\",\"DestinationColumn\":\"City\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['state']\",\"DestinationColumn\":\"State\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['postalCode']\",\"DestinationColumn\":\"PostalCode\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['country']\",\"DestinationColumn\":\"Country\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null}]}}"; + const string mapping = "{\"MappingRuleConfig\":{\"DestinationType\":\"\",\"SourceObject\":\"\",\"DestinationObject\":\"\",\"TruthTable\":[{\"SourceColumn\":\"$.address['city']\",\"DestinationColumn\":\"City\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['state']\",\"DestinationColumn\":\"State\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['postalCode']\",\"DestinationColumn\":\"PostalCode\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null},{\"SourceColumn\":\"$.address['country']\",\"DestinationColumn\":\"Country\",\"DataType\":\"string\",\"ComplexType\":null,\"TransformValue\":null}]}}"; var mapper = new AutoMapper(mapping); @@ -200,15 +194,15 @@ public void Complex2FlatTransformationTest() public void PromoteAttributesToPropertyTestWithoutPrependKeyText() { //Arrange - Certain input json with complex object - var inputJson = + const string inputJson = "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; - var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; + const string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""SourceType"":""Webpagevisit"",""SourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""ClientIPAddress"":""203.141.7.100"",""UserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""WebpageID"":4,""WebpageURL"":""/anti-phishing.html""}]}"; + const string expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""SourceType"":""Webpagevisit"",""SourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""ClientIPAddress"":""203.141.7.100"",""UserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""WebpageID"":4,""WebpageURL"":""/anti-phishing.html""}]}"; var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); //Assert @@ -219,15 +213,15 @@ public void PromoteAttributesToPropertyTestWithoutPrependKeyText() public void PromoteAttributesToPropertyTestWithPrependKeyText() { //Arrange - Certain input json with complex object - var inputJson = + const string inputJson = "{\r\n \"requestId\": \"a9ae#148add1e53d\",\r\n \"success\": true,\r\n \"nextPageToken\": \"GIYDAOBNGEYS2MBWKQYDAORQGA5DAMBOGAYDAKZQGAYDALBRGA3TQ===\",\r\n \"moreResult\": true,\r\n \"result\": [\r\n {\r\n \"id\": 2,\r\n \"leadId\": 6,\r\n \"activityTypeId\": 12,\r\n \"primaryAttributeValueId\": 6,\r\n \"primaryAttributeValue\": \"Owyliphys Iledil\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Source Type\",\r\n \"value\": \"Web page visit\"\r\n },\r\n {\r\n \"name\": \"Source Info\",\r\n \"value\": \"http://search.yahoo.com/search?p=train+cappuccino+army\"\r\n }\r\n ]\r\n },\r\n {\r\n \"id\": 3,\r\n \"leadId\": 9,\r\n \"activityTypeId\": 1,\r\n \"primaryAttributeValueId\": 4,\r\n \"primaryAttributeValue\": \"anti-phishing\",\r\n \"attributes\": [\r\n {\r\n \"name\": \"Query Parameters\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Client IP Address\",\r\n \"value\": \"203.141.7.100\"\r\n },\r\n {\r\n \"name\": \"User Agent\",\r\n \"value\": \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\"\r\n },\r\n {\r\n \"name\": \"Webpage ID\",\r\n \"value\": 4\r\n },\r\n {\r\n \"name\": \"Webpage URL\",\r\n \"value\": \"/anti-phishing.html\"\r\n },\r\n {\r\n \"name\": \"Referrer URL\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Engine\",\r\n \"value\": null\r\n },\r\n {\r\n \"name\": \"Search Query\",\r\n \"value\": null\r\n }\r\n ]\r\n }\r\n ]\r\n}"; - var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"PrependKeyText\":\"Attribute\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; + const string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Content\",\"DataType\":\"JArray\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.result[*]\",\"TruthTable\":[{\"SourceColumn\":\"$.id\",\"DestinationColumn\":\"id\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.leadId\",\"DestinationColumn\":\"leadId\",\"DataType\":\"long\"},{\"SourceColumn\":\"$.attributes[*]\",\"DestinationColumn\":\"\",\"DataType\":\"JArray\",\"TransformValue\":{\"Type\":\"PromoteArrayToProperty\",\"PrependKeyText\":\"Attribute\",\"KeyLookupField\":\"$.name\",\"ValueLookupField\":\"$.value\"}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""AttributeSourceType"":""Webpagevisit"",""AttributeSourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""AttributeClientIPAddress"":""203.141.7.100"",""AttributeUserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""AttributeWebpageID"":4,""AttributeWebpageURL"":""/anti-phishing.html""}]}"; + const string expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""AttributeSourceType"":""Webpagevisit"",""AttributeSourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""AttributeClientIPAddress"":""203.141.7.100"",""AttributeUserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""AttributeWebpageID"":4,""AttributeWebpageURL"":""/anti-phishing.html""}]}"; var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); //Assert @@ -239,16 +233,15 @@ public void PromoteAttributesToPropertyTestWithPrependKeyText() public void RoslynTest() { //Arrange - Certain input json with complex object - var inputJson = + const string inputJson = "{\r\n \"eventCode\": \"APAC-1PWBNR3-0331-16-HQ\",\r\n \"pkEventId\": \"0x449740001\",\r\n \"eventId\": \"2353\",\r\n \"externalKey\": \"AP-Azure-WBNR-FY16-03Mar-31-Win10_Device_Management\",\r\n \"accountCode\": \"C-and-E\",\r\n \"eventName\": \"Windows 10 for device management\",\r\n \"url\": null,\r\n \"autoCalcCode\": false,\r\n \"isTestMode\": false,\r\n \"isActive\": true,\r\n \"isTemplate\": false,\r\n \"isLocked\": true,\r\n \"isClassic\": true,\r\n \"eventStatus\": \"Live\",\r\n \"isPending\": false,\r\n \"isDesign\": false,\r\n \"isTesting\": false,\r\n \"isOnsite\": false,\r\n \"isOffline\": false,\r\n \"isClosed\": false,\r\n \"isNotificationEnabled\": false,\r\n \"notes\": \"\",\r\n \"contact\": {\r\n \"contactName\": \"Microsoft SQL Team\",\r\n \"organization\": \"\",\r\n \"email\": \"b-dikurn@microsoft.com\",\r\n \"phone\": \"\",\r\n \"tollfree\": \"\",\r\n \"fax\": \"\",\r\n \"url\": \"\",\r\n \"notes\": \"\"\r\n },\r\n \"location\": {\r\n \"locationName\": \"Webinar\",\r\n \"locationCode\": \"Webinar\",\r\n \"email\": null,\r\n \"phone\": null,\r\n \"tollfree\": null,\r\n \"fax\": null,\r\n \"url\": null,\r\n \"notes\": null\r\n },\r\n \"dateCreated\": \"2016-02-17T15:59:42\",\r\n \"dateModified\": \"2016-02-19T14:21:21\",\r\n \"startDate\": \"2016-03-31T08:00:00\",\r\n \"endDate\": \"2016-03-31T16:00:00\",\r\n \"dateClosed\": null,\r\n \"txtEvtCreatedBy\": \"Samuel Pak\",\r\n \"txtEvtModifiedBy\": \"Maha Pasha\",\r\n \"glNumber\": \"\",\r\n \"timezone\": \"(GMT+05:00) Islamabad, Karachi, Tashkent\",\r\n \"timezoneMapping\": \"Asia/Karachi\",\r\n \"timezoneId\": 85,\r\n \"proposedLocation\": null,\r\n \"plannedAttendance\": null,\r\n \"proposedBudget\": null,\r\n \"plannedCurrency\": null,\r\n \"travelAccoCurrency\": null,\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionField\": \"evt_ans_field19\",\r\n \"questionId\": 638,\r\n \"questionCode\": \"Design-LPHeroImg\",\r\n \"questionName\": \"Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"https://info.microsoft.com/rs/157-GQE-382/images/ms-win10-webinar-banners-3000x300-04.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field24\",\r\n \"questionId\": 996,\r\n \"questionCode\": \"Design-EmailBannerImg\",\r\n \"questionName\": \"Design-EmailBannerImg \",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field16\",\r\n \"questionId\": 398,\r\n \"questionCode\": \"Program-BannerText\",\r\n \"questionName\": \"Program-BannerText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Microsft Event Banner Title\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field20\",\r\n \"questionId\": 639,\r\n \"questionCode\": \"Design-BannerTextColor\",\r\n \"questionName\": \"Design-BannerTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field17\",\r\n \"questionId\": 633,\r\n \"questionCode\": \"Design-HeaderTextColor\",\r\n \"questionName\": \"Design-HeaderTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#333333\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field06\",\r\n \"questionId\": 152,\r\n \"questionCode\": \"Program-HeaderText\",\r\n \"questionName\": \"Program-HeaderText\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"Windows 10 for device management\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field07\",\r\n \"questionId\": 153,\r\n \"questionCode\": \"Program-Description\",\r\n \"questionName\": \"Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"A\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field09\",\r\n \"questionId\": 229,\r\n \"questionCode\": \"Program-AdditionalInfo\",\r\n \"questionName\": \"Program-AdditionalInfo\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"B\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field21\",\r\n \"questionId\": 640,\r\n \"questionCode\": \"Design-HighlightColor\",\r\n \"questionName\": \"Design-HighlightColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field22\",\r\n \"questionId\": 641,\r\n \"questionCode\": \"Design-HighlightTextColor\",\r\n \"questionName\": \"Design-HighlightTextColor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"#ffffff\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field01\",\r\n \"questionId\": 147,\r\n \"questionCode\": \"Hero Banner Image\",\r\n \"questionName\": \"Hero Banner Image\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"EN-BASICE-Banner-PeopleWithDevices.png\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field02\",\r\n \"questionId\": 37143,\r\n \"questionCode\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"questionName\": \"Modern Tele-Readiness Hotsheet URL\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionField\": \"evt_ans_field30\",\r\n \"questionId\": 649,\r\n \"questionCode\": \"DELETED-Program-Description\",\r\n \"questionName\": \"DELETED-Program-Description\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"answerCode\": null,\r\n \"value\": \"\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n \"groups\": null,\r\n \"rotations\": null,\r\n \"forms\": null,\r\n \"websites\": null,\r\n \"primaryFormURL\": \"/profile/form/index.cfm?PKformID=0x1084150001\",\r\n \"questionAssignments\": null\r\n}"; - var mapping = - "{\r\n \"Scripts\": [\r\n {\r\n \"Name\": \"GetTitle\",\r\n \"Code\": \"string GetTitle(string args){string[] input = args.Split(new string[] {\\\"[delimiter]\\\"}, System.StringSplitOptions.None);string[] data = null; var title = string.Empty;for (int i = 0; i < input.Length; i++){if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")){title = input[i];break;}if (input[i].Contains(\\\"tokenDelimiter\\\") == true){data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None);for (int x = 0; x < data.Length; x++){if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])){title = data[x].ToString();break;}}}else{continue;}} return title;}GetTitle(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetDescription\",\r\n \"Code\": \"string GetEventDesc(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventDesc = string.Empty; for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventDesc = input[i]; eventDesc = System.Text.RegularExpressions.Regex.Replace(input[i], @\\\"<(.|\\n)*?>\\\", string.Empty); break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] {\\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventDesc = data[x].ToString(); eventDesc = System.Text.RegularExpressions.Regex.Replace(data[x], @\\\"<(.|\\n)*?>\\\", string.Empty); break;} } } else { continue; }} return eventDesc;}GetEventDesc(Args)\",\r\n \"Reference\": {\r\n \"Assembly\": \"System\",\r\n \"NameSpace\": \"System.Text.RegularExpressions\"\r\n }\r\n },\r\n {\r\n \"Name\": \"GetURL\",\r\n \"Code\": \"string GetURL(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventURL = string.Empty;for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventURL = input[i]; break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventURL = data[x].ToString(); break; } } } else { continue; } } if (string.IsNullOrEmpty(eventURL)) return eventURL = \\\"www.microsoft.com\\\"; else return eventURL; }GetURL(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetJsonArray\",\r\n \"Code\": \"string GetJsonArray(string args) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(\\\"[\\\"); foreach (var item in args.Split(',')) { sb.Append(@\\\"\\\"\\\"\\\" + item + @\\\"\\\"\\\",\\\"); } sb.Remove(sb.Length - 1, 1); sb.Append(\\\"]\\\"); return sb.ToString();}GetJsonArray(Args)\"\r\n }\r\n ],\r\n \"MappingRuleConfig\": {\r\n \"DestinationType\": \"EventInformation\",\r\n \"SourceObject\": \"CertainEvents\",\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventList\",\r\n \"DataType\": \"jarray\",\r\n \"ComplexType\": {\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"title\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetTitle\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-HeaderText')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-BannerText')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"accountCode\",\r\n \"DestinationColumn\": \"accountCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventCode\",\r\n \"DestinationColumn\": \"Id\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventStatus\",\r\n \"DestinationColumn\": \"Status\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"timezone\",\r\n \"DestinationColumn\": \"timezone\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"source\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Certain\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventCategory\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Onsite Event\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"startDate\",\r\n \"DestinationColumn\": \"StartDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"endDate\",\r\n \"DestinationColumn\": \"EndDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"$.location['locationName']\",\r\n \"DestinationColumn\": \"locationCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Description\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetDescription\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventAbstract')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-Description')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryLanguage\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Localization-Form-and-Email-Language')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryTargetAudience\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventsFor')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Product\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventProduct')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"EventSource\",\r\n \"DestinationColumn\": \"EventSource\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"$.eventQuestions.question[?(@.questionCode == 'Search-EventIcon')].answers.answer.[0].value\",\r\n \"DestinationColumn\": \"EventIcon\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Category\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"TBD\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"URL\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetURL\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-AlternateRegURL')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'primaryFormURL')].answers.answer.[0].value\"\r\n ]\r\n }\r\n\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"RequestId\",\r\n \"DataType\": \"guid\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"4bfaac9c-1e0d-4620-b9e6-66095376e99a\"\r\n }\r\n }\r\n ]\r\n }\r\n}"; + const string mapping = "{\r\n \"Scripts\": [\r\n {\r\n \"Name\": \"GetTitle\",\r\n \"Code\": \"string GetTitle(string args){string[] input = args.Split(new string[] {\\\"[delimiter]\\\"}, System.StringSplitOptions.None);string[] data = null; var title = string.Empty;for (int i = 0; i < input.Length; i++){if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")){title = input[i];break;}if (input[i].Contains(\\\"tokenDelimiter\\\") == true){data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None);for (int x = 0; x < data.Length; x++){if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])){title = data[x].ToString();break;}}}else{continue;}} return title;}GetTitle(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetDescription\",\r\n \"Code\": \"string GetEventDesc(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventDesc = string.Empty; for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventDesc = input[i]; eventDesc = System.Text.RegularExpressions.Regex.Replace(input[i], @\\\"<(.|\\n)*?>\\\", string.Empty); break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] {\\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventDesc = data[x].ToString(); eventDesc = System.Text.RegularExpressions.Regex.Replace(data[x], @\\\"<(.|\\n)*?>\\\", string.Empty); break;} } } else { continue; }} return eventDesc;}GetEventDesc(Args)\",\r\n \"Reference\": {\r\n \"Assembly\": \"System\",\r\n \"NameSpace\": \"System.Text.RegularExpressions\"\r\n }\r\n },\r\n {\r\n \"Name\": \"GetURL\",\r\n \"Code\": \"string GetURL(string args) { string[] input = args.Split(new string[] { \\\"[delimiter]\\\" }, System.StringSplitOptions.None); string[] data = null; var eventURL = string.Empty;for (int i = 0; i < input.Length; i++) { if (!string.IsNullOrEmpty(input[i]) && !string.IsNullOrWhiteSpace(input[i]) && !input[i].Contains(\\\"tokenDelimiter\\\")) { eventURL = input[i]; break; } if (input[i].Contains(\\\"tokenDelimiter\\\") == true) { data = input[i].Split(new string[] { \\\"[tokenDelimiter]\\\" }, System.StringSplitOptions.None); for (int x = 0; x < data.Length; x++) { if (!string.IsNullOrEmpty(data[x]) && !string.IsNullOrWhiteSpace(data[x])) { eventURL = data[x].ToString(); break; } } } else { continue; } } if (string.IsNullOrEmpty(eventURL)) return eventURL = \\\"www.microsoft.com\\\"; else return eventURL; }GetURL(Args)\"\r\n },\r\n {\r\n \"Name\": \"GetJsonArray\",\r\n \"Code\": \"string GetJsonArray(string args) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(\\\"[\\\"); foreach (var item in args.Split(',')) { sb.Append(@\\\"\\\"\\\"\\\" + item + @\\\"\\\"\\\",\\\"); } sb.Remove(sb.Length - 1, 1); sb.Append(\\\"]\\\"); return sb.ToString();}GetJsonArray(Args)\"\r\n }\r\n ],\r\n \"MappingRuleConfig\": {\r\n \"DestinationType\": \"EventInformation\",\r\n \"SourceObject\": \"CertainEvents\",\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventList\",\r\n \"DataType\": \"jarray\",\r\n \"ComplexType\": {\r\n \"TruthTable\": [\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"title\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetTitle\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-HeaderText')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-BannerText')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"accountCode\",\r\n \"DestinationColumn\": \"accountCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventCode\",\r\n \"DestinationColumn\": \"Id\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"eventStatus\",\r\n \"DestinationColumn\": \"Status\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"timezone\",\r\n \"DestinationColumn\": \"timezone\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"source\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Certain\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"EventCategory\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"Onsite Event\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"startDate\",\r\n \"DestinationColumn\": \"StartDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"endDate\",\r\n \"DestinationColumn\": \"EndDate\",\r\n \"DataType\": \"formattedDatetime\",\r\n \"Format\": \"yyyy-MM-ddTHH:mm:ssZ\",\r\n \"TransformValue\": { \"DefaultValue\": \"utcNow\" }\r\n },\r\n {\r\n \"SourceColumn\": \"$.location['locationName']\",\r\n \"DestinationColumn\": \"locationCode\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Description\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetDescription\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventAbstract')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'Program-Description')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryLanguage\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Localization-Form-and-Email-Language')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"PrimaryTargetAudience\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventsFor')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Product\",\r\n \"DataType\": \"jarray\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetJsonArray\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-EventProduct')].answers.answer.[0].value\"\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"EventSource\",\r\n \"DestinationColumn\": \"EventSource\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"$.eventQuestions.question[?(@.questionCode == 'Search-EventIcon')].answers.answer.[0].value\",\r\n \"DestinationColumn\": \"EventIcon\",\r\n \"DataType\": \"string\"\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"Category\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"TBD\"\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"URL\",\r\n \"DataType\": \"string\",\r\n \"TransformValue\": {\r\n \"Type\": \"script\",\r\n \"ScriptName\": \"GetURL\",\r\n \"Params\": [\r\n \"$.eventQuestions.question[?(@.questionCode == 'Search-AlternateRegURL')].answers.answer.[0].value\",\r\n \"$.eventQuestions.question[?(@.questionCode == 'primaryFormURL')].answers.answer.[0].value\"\r\n ]\r\n }\r\n\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"SourceColumn\": \"\",\r\n \"DestinationColumn\": \"RequestId\",\r\n \"DataType\": \"guid\",\r\n \"TransformValue\": {\r\n \"DefaultValue\": \"4bfaac9c-1e0d-4620-b9e6-66095376e99a\"\r\n }\r\n }\r\n ]\r\n }\r\n}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""EventList"":[{""title"":""Windows 10 for device management"",""accountCode"":""C-and-E"",""Id"":""APAC-1PWBNR3-0331-16-HQ"",""Status"":""Live"",""timezone"":""(GMT+05:00) Islamabad, Karachi, Tashkent"",""source"":""Certain"",""EventCategory"":""Onsite Event"",""StartDate"":""2016-03-31T08:00:00Z"",""EndDate"":""2016-03-31T16:00:00Z"",""locationCode"":""Webinar"",""Description"":""A"",""PrimaryLanguage"":[""""],""PrimaryTargetAudience"":[""""],""Product"":[""""],""Category"":""TBD"",""URL"":""www.microsoft.com""}],""RequestId"":""4bfaac9c-1e0d-4620-b9e6-66095376e99a""}"; + const string expectedResponse = @"{""EventList"":[{""title"":""Windows 10 for device management"",""accountCode"":""C-and-E"",""Id"":""APAC-1PWBNR3-0331-16-HQ"",""Status"":""Live"",""timezone"":""(GMT+05:00) Islamabad, Karachi, Tashkent"",""source"":""Certain"",""EventCategory"":""Onsite Event"",""StartDate"":""2016-03-31T08:00:00Z"",""EndDate"":""2016-03-31T16:00:00Z"",""locationCode"":""Webinar"",""Description"":""A"",""PrimaryLanguage"":[""""],""PrimaryTargetAudience"":[""""],""Product"":[""""],""Category"":""TBD"",""URL"":""www.microsoft.com""}],""RequestId"":""4bfaac9c-1e0d-4620-b9e6-66095376e99a""}"; var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); //Assert @@ -259,15 +252,15 @@ public void RoslynTest() public void ParentDataTest() { //Arrange - Certain input json with complex object - var inputJson = + const string inputJson = "{\r\n \"events\": [\r\n {\r\n \"eventId\": \"100\",\r\n \"eventName\": \"A\",\r\n \"location\": {\r\n \"locationName\": \"Lincoln Square\",\r\n \"locationCode\": \"Lincoln Square\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q1\", \r\n \"questionName\": \"1Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n },\r\n{\r\n \"answerId\": null,\r\n \"value\": \"2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q2\", \r\n \"questionName\": \"2Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"3Consumers,Partners\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n{\r\n \"eventId\": \"200\",\r\n \"eventName\": \"B\",\r\n \"location\": {\r\n \"locationName\": \"Bel\",\r\n \"locationCode\": \"Bel\"\r\n },\r\n \"eventQuestions\": {\r\n \"question\": [\r\n {\r\n \"questionId\": \"Q3\", \r\n \"questionName\": \"3Design-LPHeroImg\",\r\n \"answers\": {\r\n \"answer\": [\r\n \r\n ]\r\n }\r\n },\r\n {\r\n \"questionId\": \"Q4\", \r\n \"questionName\": \"4Search-EventsFor\",\r\n \"answers\": {\r\n \"answer\": [\r\n {\r\n \"answerId\": null,\r\n \"value\": \"4Klo\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n}"; - var mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Answers\",\"DataType\":\"string\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.events[*].eventQuestions.question[*].answers.answer\",\"TruthTable\":[{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].eventId\",\"DestinationColumn\":\"eventId\",\"DataType\":\"string\"},{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].questionId\",\"DestinationColumn\":\"questionId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerId\",\"DestinationColumn\":\"answerId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerCode\",\"DestinationColumn\":\"answerCode\",\"DataType\":\"string\"},{\"SourceColumn\":\"value\",\"DestinationColumn\":\"value\",\"DataType\":\"string\"}]}}]}}"; + const string mapping = "{\"MappingRuleConfig\":{\"TruthTable\":[{\"SourceColumn\":\"\",\"DestinationColumn\":\"Answers\",\"DataType\":\"string\",\"ComplexType\":{\"DataType\":\"JArray\",\"Node\":\"$.events[*].eventQuestions.question[*].answers.answer\",\"TruthTable\":[{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].eventId\",\"DestinationColumn\":\"eventId\",\"DataType\":\"string\"},{\"SourceColumn\":\"$.[{parent}].[{parent}].[{parent}].[{parent}].[{parent}].questionId\",\"DestinationColumn\":\"questionId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerId\",\"DestinationColumn\":\"answerId\",\"DataType\":\"string\"},{\"SourceColumn\":\"answerCode\",\"DestinationColumn\":\"answerCode\",\"DataType\":\"string\"},{\"SourceColumn\":\"value\",\"DestinationColumn\":\"value\",\"DataType\":\"string\"}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = @"{""Answers"":[{""eventId"":""100"",""questionId"":""Q1"",""value"":""1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q1"",""value"":""2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q2"",""value"":""3Consumers,Partners""},{""eventId"":""200"",""questionId"":""Q3""},{""eventId"":""200"",""questionId"":""Q4"",""value"":""4Klo""}]}"; + const string expectedResponse = @"{""Answers"":[{""eventId"":""100"",""questionId"":""Q1"",""value"":""1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q1"",""value"":""2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q2"",""value"":""3Consumers,Partners""},{""eventId"":""200"",""questionId"":""Q3""},{""eventId"":""200"",""questionId"":""Q4"",""value"":""4Klo""}]}"; var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); //Assert @@ -278,8 +271,8 @@ public void ParentDataTest() public void Validate_ValueMappingHandler_DefaultValue() { // Arrange - var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"Certain\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - var input = "{\"value\":null}"; + const string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"Certain\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + const string input = "{\"value\":null}"; //Act ITransformationHandler handler = new ValueMappingHandler(); @@ -292,8 +285,8 @@ public void Validate_ValueMappingHandler_DefaultValue() public void Validate_ValueMappingHandler_DefaultValue_UtcNow() { // Arrange - var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - var input = "{\"value\":null}"; + const string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + const string input = "{\"value\":null}"; //Act ITransformationHandler handler = new ValueMappingHandler(); @@ -306,8 +299,8 @@ public void Validate_ValueMappingHandler_DefaultValue_UtcNow() public void Validate_ValueMappingHandler_DefaultValue_Guid() { // Arrange - var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"NewGuid\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - var input = "{\"value\":null}"; + const string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":null,\"DefaultValue\":\"NewGuid\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + const string input = "{\"value\":null}"; //Act ITransformationHandler handler = new ValueMappingHandler(); @@ -320,8 +313,8 @@ public void Validate_ValueMappingHandler_DefaultValue_Guid() public void Validate_ValueMappingHandler_DefaultValue_Mapping() { // Arrange - var config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": 1},{\"ExistingValue\": \"1\",\"NewValue\": 2}, {\"ExistingValue\": \"0\",\"NewValue\": -1}],\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; - var input = "{\"value\":\"1\"}"; + const string config = "{\"Type\":null,\"PrependKeyText\":null,\"ValueMapping\":[{\"ExistingValue\": \"2\",\"NewValue\": 1},{\"ExistingValue\": \"1\",\"NewValue\": 2}, {\"ExistingValue\": \"0\",\"NewValue\": -1}],\"DefaultValue\":\"UtcNow\",\"ScriptName\":null,\"Params\":null,\"KeyLookupField\":null,\"ValueLookupField\":null}"; + const string input = "{\"value\":\"1\"}"; //Act ITransformationHandler handler = new ValueMappingHandler(); @@ -334,31 +327,31 @@ public void Validate_ValueMappingHandler_DefaultValue_Mapping() public void FunctionTest_ConCat() { //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": [{""questionField"": ""evt_ans_field19"",""questionId"": 638,""questionCode"": ""Design-LPHeroImg"",""questionName"": ""Design-LPHeroImg"",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""https://info.microsoft.com""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""First answer""},{""answerId"": null,""answerCode"": null,""value"": ""Last answer""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": """"}]}}]}}"; - var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + const string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": [{""questionField"": ""evt_ans_field19"",""questionId"": 638,""questionCode"": ""Design-LPHeroImg"",""questionName"": ""Design-LPHeroImg"",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""https://info.microsoft.com""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": ""First answer""},{""answerId"": null,""answerCode"": null,""value"": ""Last answer""}]}},{""questionField"": ""evt_ans_field24"",""questionId"": 996,""questionCode"": ""Design-EmailBannerImg"",""questionName"": ""Design-EmailBannerImg "",""answers"": {""answer"": [{""answerId"": null,""answerCode"": null,""value"": """"}]}}]}}"; + const string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.com,Hello world!\"},{\"title\":\"First answer,Last answer,Hello world!\"},{\"title\":\",Hello world!\"}]}"; + const string expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.com,Hello world!\"},{\"title\":\"First answer,Last answer,Hello world!\"},{\"title\":\",Hello world!\"}]}"; //Assert Assert.AreEqual(response, expectedResponse); } [TestMethod, Description("Function handler test - Validate that the value returned is concatenated when delimeter is null.")] - public void FunctionTest_ConCat_WithoutDelimeter() + public void FunctionTest_ConCat_WithoutDelimiter() { //Arrange - Certain input json with complex object - var inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; - var mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value','Hello world!']}}]}}]}}"; + const string inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; + const string mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value','Hello world!']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.comHello world!\"},{\"title\":\"First answerLast answerHello world!\"},{\"title\":\"Hello world!\"}]}"; + const string expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.comHello world!\"},{\"title\":\"First answerLast answerHello world!\"},{\"title\":\"Hello world!\"}]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -368,14 +361,14 @@ public void FunctionTest_ConCat_WithoutDelimeter() public void FunctionTest_ConCat_EmptyParamCollection() { //Arrange - Certain input json with complex object - var inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; - var mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value1','Hello world!']}}]}}]}}"; + const string inputJson = @"{'eventId': '2353','externalKey': 'AP-Azure','accountCode': 'C-and-E','eventName': 'Windows 10','eventQuestions': {'question': [{'questionField': 'evt_ans_field19','questionId': 638,'questionCode': 'Design-LPHeroImg','questionName': 'Design-LPHeroImg','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'https://info.microsoft.com'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': 'First answer'},{'answerId': null,'answerCode': null,'value': 'Last answer'}]}},{'questionField': 'evt_ans_field24','questionId': 996,'questionCode': 'Design-EmailBannerImg','questionName': 'Design-EmailBannerImg ','answers': {'answer': [{'answerId': null,'answerCode': null,'value': ''}]}}]}}"; + const string mapping = @"{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventList','DataType': 'string','ComplexType': {'DataType': 'JArray','Node': '$.eventQuestions.question[*]','TruthTable': [{'SourceColumn': '','DestinationColumn': 'title','DataType': 'string','TransformValue': {'Type': 'function','Function': 'ConCat','Params': ['$.answers.answer[*].value1','Hello world!']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"}]}"; + const string expectedResponse = "{\"EventList\":[{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"}]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -385,14 +378,14 @@ public void FunctionTest_ConCat_EmptyParamCollection() public void IgnoreEmptyArrayTest_True() { //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":true, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + const string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + const string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":true, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{}"; + const string expectedResponse = "{}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -402,14 +395,14 @@ public void IgnoreEmptyArrayTest_True() public void IgnoreEmptyArrayTest_False() { //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":false, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + const string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + const string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"",""IgnoreEmptyArray"":false, ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[]}"; + const string expectedResponse = "{\"EventList\":[]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -419,14 +412,14 @@ public void IgnoreEmptyArrayTest_False() public void IgnoreEmptyArrayTest_NotSet() { //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - var mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"", ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; + const string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + const string mapping = @"{""MappingRuleConfig"": {""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""EventList"",""DataType"": ""string"",""ComplexType"": {""DataType"": ""JArray"", ""Node"": ""$.eventQuestions.question[*]"",""TruthTable"": [{""SourceColumn"": """",""DestinationColumn"": ""title"",""DataType"": ""string"",""TransformValue"": {""Type"": ""function"",""Delimeter"": "","",""Function"": ""ConCat"",""Params"": [""$.answers.answer[*].value"",""Hello world!""]}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[]}"; + const string expectedResponse = "{\"EventList\":[]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -436,14 +429,14 @@ public void IgnoreEmptyArrayTest_NotSet() public void Automapper_EmptyDefaultValueTest() { //Arrange - Certain input json with complex object - var inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; - var mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"__meta__Entity\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"GenericPresales\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"EncryptedFields\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \" \" } } ] } } "; + const string inputJson = @"{""eventId"": ""2353"",""externalKey"": ""AP-Azure"",""accountCode"": ""C-and-E"",""eventName"": ""Windows 10"",""eventQuestions"": {""question"": []}}"; + const string mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"__meta__Entity\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"GenericPresales\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"EncryptedFields\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \" \" } } ] } } "; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"__meta__Entity\":\"GenericPresales\",\"EncryptedFields\":\" \"}"; + const string expectedResponse = "{\"__meta__Entity\":\"GenericPresales\",\"EncryptedFields\":\" \"}"; //Assert Assert.AreEqual(expectedResponse, response); @@ -453,14 +446,14 @@ public void Automapper_EmptyDefaultValueTest() public void FunctionTest_ReplaceValue() { //Arrange - Certain input json with complex object - var inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'httPS://info.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValue','Params':['$.answers.answer[*].value']}}]}}]}}"; + const string inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; + const string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'httPS://info.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValue','Params':['$.answers.answer[*].value']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; + const string expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -470,31 +463,31 @@ public void FunctionTest_ReplaceValue() public void FunctionTest_ReplaceValueNode_Failure() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'CNE','ReturnValue':'','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + const string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + const string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'CNE','ReturnValue':'','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"NA\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"NA\\\"\\r\\n}\"}"; //Assert Assert.AreEqual(response, expectedResponse); } [TestMethod, Description("Function handler test - Validate that the value returned is replaced value When Path is given.")] - public void FunctionTest_ReplaceValueNode_Sucess() + public void FunctionTest_ReplaceValueNode_Success() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'Topic','ReturnValue':'RV','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + const string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + const string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'Topic','ReturnValue':'RV','DefaultValue':'NA','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"RV\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"RV\\\"\\r\\n}\"}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -504,14 +497,14 @@ public void FunctionTest_ReplaceValueNode_Sucess() public void FunctionTest_ReplaceValueNode_JsonPath() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + const string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + const string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -521,14 +514,14 @@ public void FunctionTest_ReplaceValueNode_JsonPath() public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": null, }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + const string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": null, }"; + const string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -538,14 +531,14 @@ public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() public void FunctionTest_ReplaceValue_ReturnValue_Node() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + const string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": 1234565430, \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Topic\", }"; + const string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'$.JobTitle','ReturnValue':'$.MobilePhone','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -555,14 +548,14 @@ public void FunctionTest_ReplaceValue_ReturnValue_Node() public void FunctionTest_ReplaceValueNodeTwo() { //Arrange - Certain input json with complex object - var inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": \"+1234565430\", \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Mswide\", }"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'MSWide','ReturnValue':'','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; + const string inputJson = "{ \"mipmsxPreferenceTopic\": \"MOD\", \"JobTitle\": \"Webmaster and Records Manager\", \"BusinessPhone\": \"+15563213567\", \"MobilePhone\": \"+1234565430\", \"CountryOrRegion\": \"United Sates\", \"mipmsxPreferenceType\": \"Mswide\", }"; + const string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'Output','DataType':'string','ComplexType':{'DataType':'string','Node':'$','TruthTable':[{'SourceColumn':'','DestinationColumn':'PreferenceTopic','DataType':'string','TransformValue':{'Type':'function','CompareToValue':'MSWide','ReturnValue':'','DefaultValue':'$.mipmsxPreferenceTopic','Function':'ReplaceValue','Params':['$.mipmsxPreferenceType']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"\\\"\\r\\n}\"}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -572,31 +565,31 @@ public void FunctionTest_ReplaceValueNodeTwo() public void FunctionTest_ReplaceValue_NullCompareToValueAndInputValue_RegexTest() { //Arrange - Certain input json - var inputJson = @"{'MessageBody': {'address': null}}"; - var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': 'def' ,'DefaultValue': 'fgh','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + const string inputJson = @"{'MessageBody': {'address': null}}"; + const string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': 'def' ,'DefaultValue': 'fgh','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"address\":\"def\"}"; + const string expectedResponse = "{\"address\":\"def\"}"; //Assert Assert.AreEqual(response, expectedResponse); } [TestMethod, Description("Function handler test - Validate the value returned when compareToValue is null and inputvalue is not null.")] - public void FunctionTest_ReplaceValue_NulllCompareToValue_RegexTest() + public void FunctionTest_ReplaceValue_NullCompareToValue_RegexTest() { //Arrange - Certain input json - var inputJson = @"{'MessageBody': {'address': 'abc'}}"; - var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': null ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + const string inputJson = @"{'MessageBody': {'address': 'abc'}}"; + const string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': null ,'ReturnValue': null ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"address\":\"abc\"}"; + const string expectedResponse = "{\"address\":\"abc\"}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -606,14 +599,14 @@ public void FunctionTest_ReplaceValue_NulllCompareToValue_RegexTest() public void FunctionTest_ReplaceValue_EmptyCompareToValue_RegexTest() { //Arrange - Certain input json - var inputJson = @"{'MessageBody': {'address': 'abc'}}"; - var mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': '' ,'ReturnValue': 'def' ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; + const string inputJson = @"{'MessageBody': {'address': 'abc'}}"; + const string mapping = @"{'MappingRuleConfig': { 'TruthTable': [{'SourceColumn': '$.MessageBody.address','DestinationColumn': 'address','DataType': 'String','ComplexType': null,'TransformValue': {'Type': 'function','CompareToValue': '' ,'ReturnValue': 'def' ,'DefaultValue': '$.MessageBody.address','Function': 'ReplaceValueWithRegexComparison','Params': ['$.MessageBody.address']}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"address\":\"def\"}"; + const string expectedResponse = "{\"address\":\"def\"}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -623,14 +616,14 @@ public void FunctionTest_ReplaceValue_EmptyCompareToValue_RegexTest() public void FunctionTest_ReplaceValue_RegexTest() { //Arrange - Certain input json with complex object - var inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; - var mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'[a-z]+.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValueWithRegexComparison','Params':['$.answers.answer[*].value']}}]}}]}}"; + const string inputJson = @"{'eventId':'2353','externalKey':'AP-Azure','accountCode':'C-and-E','eventName':'Windows10','eventQuestions':{'question':[{'questionField':'evt_ans_field19','questionId':638,'questionCode':'Design-LPHeroImg','questionName':'Design-LPHeroImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'https://info.microsoft.com'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':'Firstanswer'},{'answerId':null,'answerCode':null,'value':'Lastanswer'}]}},{'questionField':'evt_ans_field24','questionId':996,'questionCode':'Design-EmailBannerImg','questionName':'Design-EmailBannerImg','answers':{'answer':[{'answerId':null,'answerCode':null,'value':''}]}}]}}"; + const string mapping = @"{'MappingRuleConfig':{'TruthTable':[{'SourceColumn':'','DestinationColumn':'EventList','DataType':'string','ComplexType':{'DataType':'JArray','Node':'$.eventQuestions.question[*]','TruthTable':[{'SourceColumn':'','DestinationColumn':'title','DataType':'bool','TransformValue':{'Type':'function','CompareToValue':'[a-z]+.microsoft.com','ReturnValue':'false','DefaultValue':'true','Function':'ReplaceValueWithRegexComparison','Params':['$.answers.answer[*].value']}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; + const string expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -640,15 +633,15 @@ public void FunctionTest_ReplaceValue_RegexTest() public void Automapper_IgnoreNullFalseTest() { //Arrange - Certain input json with complex object - var inputJson = "{ \"etag\": \"1-null\", \"transactionId\": null, \"completeCollectionSize\": 25, \"size\": 3, \"startingIndex\": 1, \"maxResults\": 3, \"questions\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answer\": [ { \"answerName\": \"answerNameXYZ\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\" } ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answer\": [ ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answer\": [ ] } ] }"; - var mapping = + const string inputJson = "{ \"etag\": \"1-null\", \"transactionId\": null, \"completeCollectionSize\": 25, \"size\": 3, \"startingIndex\": 1, \"maxResults\": 3, \"questions\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answer\": [ { \"answerName\": \"answerNameXYZ\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\" } ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answer\": [ ] }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answer\": [ ] } ] }"; + const string mapping = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"EventId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"-1\" } }, { \"SourceColumn\": \"$.MifContext.BatchId\", \"DestinationColumn\": \"BatchId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.correlationId\", \"DestinationColumn\": \"RequestId\", \"DataType\": \"guid\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.moreEventQuestions\", \"DestinationColumn\": \"MoreResults\", \"DataType\": \"bool\", \"ComplexType\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"SchemaName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": \"JournalEvents.Certain.EventQuestionAnswersDetail\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Content\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"ContentObject\", \"DataType\": \"string\", \"ComplexType\": { \"DataType\": \"JArray\", \"IgnoreNullValue\": false, \"Node\": \"$.questions[*].answer\", \"TruthTable\": [ { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].accountCode\", \"DestinationColumn\": \"accountCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].eventCode\", \"DestinationColumn\": \"eventCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionName\", \"DestinationColumn\": \"questionName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionLabel\", \"DestinationColumn\": \"questionLabel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionCode\", \"DestinationColumn\": \"questionCode\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.[{parent}].[{parent}].[{parent}].questionType\", \"DestinationColumn\": \"questionType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"answerLabel\", \"DestinationColumn\": \"answerLabel\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerCode\", \"DestinationColumn\": \"answerCode\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } }, { \"SourceColumn\": \"answerName\", \"DestinationColumn\": \"answerName\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": null } } ] } } ] } }"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(JObject.Parse(inputJson), true); - var expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; + const string expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; //Assert Assert.IsTrue(JToken.DeepEquals(response, JObject.Parse(expectedResponse))); @@ -658,14 +651,14 @@ public void Automapper_IgnoreNullFalseTest() public void FunctionTest_SplitWithOneIndex() { //Arrange - Certain input json with complex object - var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; + const string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + const string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Key\":[{\"Key\":\"12121212333\"}]}"; + const string expectedResponse = "{\"Key\":[{\"Key\":\"12121212333\"}]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -675,14 +668,14 @@ public void FunctionTest_SplitWithOneIndex() public void FunctionTest_SplitWithTwoIndex() { //Arrange - Certain input json with complex object - var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}},{""SourceColumn"":"""",""DestinationColumn"":""Message"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":1,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; + const string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + const string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Key"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":0,""Function"":""Split"",""Params"":[""$.Key""]}},{""SourceColumn"":"""",""DestinationColumn"":""Message"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Delimeter"":""_"",""Index"":1,""Function"":""Split"",""Params"":[""$.Key""]}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"Key\":\"12121212333\",\"Message\":\"AKJKKAJDKAKJKKKDKSKAK\"}]}"; + const string expectedResponse = "{\"Data\":[{\"Key\":\"12121212333\",\"Message\":\"AKJKKAJDKAKJKKKDKSKAK\"}]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -692,14 +685,14 @@ public void FunctionTest_SplitWithTwoIndex() public void FunctionTest_TransformToUpperCase() { //Arrange - Certain input json with complex object - var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOUPPERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; + const string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + const string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOUPPERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\"}]}"; + const string expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\"}]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -725,7 +718,7 @@ public void FunctionTest_TransformToUpperCaseParent() //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\",\"FirstName\":\"AP - Azure\",\"LastName\":\"C - AND - E\"}]}"; + const string expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\",\"FirstName\":\"AP - Azure\",\"LastName\":\"C - AND - E\"}]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -735,14 +728,14 @@ public void FunctionTest_TransformToUpperCaseParent() public void FunctionTest_TransformToLowerCase() { //Arrange - Certain input json with complex object - var inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; - var mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOLOWERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; + const string inputJson = @"{""LeadId"":""2353"",""FirstName"":""AP-Azure"",""LastName"":""C-and-E"",""EmailAddress"":""Windows 10"",""Key"":""12121212333_AKJKKAJDKAKJKKKDKSKAK""}"; + const string mapping = @"{""MappingRuleConfig"":{""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""Data"",""DataType"":""string"",""ComplexType"":{""DataType"":""jArray"",""Node"":""$"",""TruthTable"":[{""SourceColumn"":"""",""DestinationColumn"":""EmailAddress"",""DataType"":""string"",""TransformValue"":{""Type"":""function"",""Function"":""TOLOWERCASE"",""Params"":[""$.EmailAddress""]}}]}}]}}"; var mapper = new AutoMapper(mapping); //Act var response = mapper.TransformIntoJson(inputJson, true); - var expectedResponse = "{\"Data\":[{\"EmailAddress\":\"windows 10\"}]}"; + const string expectedResponse = "{\"Data\":[{\"EmailAddress\":\"windows 10\"}]}"; //Assert Assert.AreEqual(response, expectedResponse); @@ -752,10 +745,10 @@ public void FunctionTest_TransformToLowerCase() public void Validate_AutoMapper_NullDataType() { // Arrange - var mappingJson = + const string mappingJson = "{\"MappingRuleConfig\":{\"DestinationType\": \"MipUnitTest.LeadRecord, JsonToJsonMapper.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"TruthTable\": [{\"SourceColumn\": \"$.Name\",\"DestinationColumn\": \"Name\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": {\"ValueMapping\":[{\"ExistingValue\": \"1\",\"NewValue\": true},{\"ExistingValue\": \"2\",\"NewValue\": false}],\"DefaultValue\":\"NA\"}},{\"SourceColumn\": \"LeadScore\",\"DestinationColumn\": \"LeadScore\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"$.AllowEmail\",\"DestinationColumn\": \"AllowEmail\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null},{\"SourceColumn\": \"CrmId\",\"DestinationColumn\": \"CrmId\",\"DataType\": null,\"ComplexType\": null,\"TransformValue\": null}]}}"; - var inputJson = + const string inputJson = "{\"Name\": \"22\",\"AllowEmail\": false,\"CrmId\": null,\"LeadScore\":100}"; //Act @@ -766,281 +759,281 @@ public void Validate_AutoMapper_NullDataType() } [TestMethod, Description("Validate that the JObject and JArray are created With same Flattene Object.")] - public void AutoMappperMappingForJObjectAndJarray() + public void AutoMapperMappingForJObjectAndJArray() { // Arrange - var inputJson = + const string inputJson = "{ \"ProgramName\": \"test4\", \"ProgramFolderId\": \"49\", \"ProgramFolderType\": \"Folder\", \"ProgramDescription\": \"xcvxbv\", \"ProgramType\": \"Default\", \"ProgramChannel\": \"Email Blast\", \"ProgramCosts\": \"8360\", \"ProgramStartDate\": \"2015-01-01\" }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"DestinationType\": \"JObject\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramName\", \"DestinationColumn\": \"ProgramName\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Folder\", \"DataType\": \"JObject\", \"ComplexType\": { \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramFolderId\", \"DestinationColumn\": \"id\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramFolderType\", \"DestinationColumn\": \"type\", \"DataType\": \"string\" } ] } }, { \"SourceColumn\": \"$.ProgramDescription\", \"DestinationColumn\": \"ProgramDescription\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramType\", \"DestinationColumn\": \"ProgramType\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramChannel\", \"DestinationColumn\": \"ProgramChannel\", \"DataType\": \"string\" }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Costs\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"IgnoreEmptyArray\": true, \"TruthTable\": [ { \"SourceColumn\": \"$.ProgramStartDate\", \"DestinationColumn\": \"startDate\", \"DataType\": \"string\" }, { \"SourceColumn\": \"$.ProgramCosts\", \"DestinationColumn\": \"cost\", \"DataType\": \"string\" } ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(inputJson); - var expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; + const string expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; Assert.AreEqual(output, expectedOutput); } [TestMethod, Description("Validate that the datetime format is not changed after transformation.")] - public void AutoMappperMapping_ValidateDateTimeFormat() + public void AutoMapperMapping_ValidateDateTimeFormat() { // Arrange - var inputJson = + const string inputJson = "{'Content':[{'Date':'2015-11-30T00:00:00','LongFormattedDate':'Monday,November30','ShortFormattedDate':'11/30/2015','DateString':null,'DateIndex':1}],'MifContext':{'runImmediate':true,'runId':'97216631-3453-4326-9a83-d5c83c62c2e6','TrackingEnabled':false,'WorkFlowName':'EPDaysToEDP','programId':'52aa95a6-831a-e511-ab0e-00155d5066d7','programCode':'conv2015emea','correlationId':'e62812d0-7d19-4496-bd9a-8a5202fa8750'},'ForEachContext':{'Url':'https://eventpoint-conv2015emea-services.azurewebsites.net','APIKey':'050e1a02033e48319ac9fd051452a484'}"; - var mappingJson = + const string mappingJson = "{'MappingRuleConfig': {'TruthTable': [{'SourceColumn': '','DestinationColumn': 'EventId','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': '-1'}},{'SourceColumn': '$.MifContext.correlationId','DestinationColumn': 'BatchId','DataType': 'guid','ComplexType': null,'TransformValue': null},{'SourceColumn': '','DestinationColumn': 'RequestId','DataType': 'guid','ComplexType': null,'TransformValue': {'DefaultValue': 'newGuid'}},{'SourceColumn': '','DestinationColumn': 'MoreResults','DataType': 'bool','ComplexType': null,'TransformValue': {'DefaultValue': 'false'}},{'SourceColumn': '','DestinationColumn': 'SchemaName','DataType': 'string','ComplexType': null,'TransformValue': {'DefaultValue': 'JournalEvents.EventPoint.ProgramDay'}},{'SourceColumn': '','DestinationColumn': 'ContentObject','DataType': 'JArray','ComplexType': {'DataType': 'JArray','Node': '$.Content[*]','TruthTable': [{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programId','DestinationColumn': 'ProgramId','DataType': 'string'},{'SourceColumn': '$.[{parent}].[{parent}].[{parent}].MifContext.programCode','DestinationColumn': 'ProgramCode','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'ProgramDayDate','DataType': 'string'},{'SourceColumn': '$.Date','DestinationColumn': 'LongFormattedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ',},{'SourceColumn': '$.ShortFormattedDate','DestinationColumn': 'ShortFormattedDate','DataType': 'string'},{'SourceColumn': '$.DateString','DestinationColumn': 'DateString','DataType': 'string'},{'SourceColumn': '$.DateIndex','DestinationColumn': 'DateIndex','DataType': 'string'}]}},{'SourceColumn': '','DestinationColumn': 'CreatedDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}},{'SourceColumn': '','DestinationColumn': 'EventDate','DataType': 'formattedDatetime','Format': 'yyyy-MM-ddTHH:mm:ssZ','TransformValue': {'DefaultValue': 'utcNow'}}]}}"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - Assert.AreEqual(output["ContentObject"][0]["ProgramDayDate"].ToString(), "2015-11-30T00:00:00"); - Assert.AreEqual(output["ContentObject"][0]["ShortFormattedDate"].ToString(), "11/30/2015"); + Assert.AreEqual(output["ContentObject"]![0]!["ProgramDayDate"]!.ToString(), "2015-11-30T00:00:00"); + Assert.AreEqual(output["ContentObject"]![0]!["ShortFormattedDate"]!.ToString(), "11/30/2015"); } [TestMethod, Description("Validate that the concatenation where nulls are present.")] - public void AutoMappperMapping_ConcatWithNull() + public void AutoMapperMapping_ConcatWithNull() { // Arrange - var inputJson = + const string inputJson = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ { \"message\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate that the concatenation where nulls are present.")] - public void AutoMappperMapping_ConcatWithEmptyList() + public void AutoMapperMapping_ConcatWithEmptyList() { // Arrange - var inputJson = + const string inputJson = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors1\": [ { \"message1\": \"PropertyRequired for action at #/action\" } ], \"innerValidationErrors\":[] } }, \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\", \"Request\": { \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"input\": [ { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" } ], \"MifContext\": { \"runImmediate\": true, \"msitTelemetryConfig\": { \"eventProperties\": { \"BusinessProcessName\": \"SMIT.MKTGLeadFlow.AquireLead\", \"SenderId\": \"MOD\" } }, \"runId\": \"5852ac81-690a-40df-817d-b1c3a4a19687\", \"TrackingEnabled\": true, \"WorkFlowName\": \"ModLeadIngestion\" } }, \"messageId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\" }, \"ForEachContext\": { \"requestId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"data\": { \"o365TrialUsageScoreProbability\": 29, \"o365TrialUsageScorePercentile\": 18, \"originatingTenantID\": \"1e9130f9-cccd-4ee2-8b3a-9774ce790519\", \"mOSEmailPref\": true, \"mOSPhonePref\": true, \"mOSPartnerEmailPref\": false, \"mOSPartnerPhonePref\": false, \"firstName\": \"John\", \"lastName\": \"Doe\", \"mobilePhone\": \"\", \"phone\": \"4257056728\", \"leadImportSource\": \"Active Trial\", \"leadSource\": \"Active Trial\", \"address\": \"Line1\", \"city\": \"Bellevue\", \"company\": \"TEST_TEST_OCP_22b3da66microsoft\", \"countryCode\": \"US\", \"postalCode\": \"98005\", \"state\": \"WA\", \"originatingOfferID\": \"B07A1127-DE83-4A6D-9F85-2C104BDAE8B4\", \"originatingProductSKU\": \"Office 365 Enterprise E3 Trial\", \"originatingSubscriptionID\": \"491015935db94a51a0510bdf80dd2a1e\", \"mSPartner\": \"True\", \"numberOfEmployees\": \"12\", \"messageType\": \"ActiveTrialUserInfoV2\", \"email\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"originSystemName\": \"Mod\", \"asmUpdatedAt\": \"2016-09-18T01:14:14.4503257Z\", \"mosSubscriptions\": [ { \"subscriptionId\": \"819aa449-f3c5-4e21-ab4e-370dc859000bFT\", \"globalAdminLogin\": \"admintest\", \"hasPOR\": true, \"includedQuantity\": 1, \"isEXO\": false, \"isLYO\": true, \"isODB\": true, \"isProject\": false, \"isProPlus\": true, \"isSPO\": false, \"isTrialSubscription\": true, \"isVisio\": true, \"isYammer\": true, \"offerId\": \"32456\", \"offerName\": \"testOffer\", \"offerProductFamily\": \"testFamily\", \"offerProductName\": \"testProduct1\", \"orderId\": \"34532\", \"partnerId\": \"35675\", \"subscriptionCreatedDate\": \"2016-08-11T10:00:00Z\", \"subscriptionCurrentStatus\": \"2016-08-14T10:00:00Z\", \"subscriptionEndDate\": \"2016-08-14T10:00:00Z\", \"subscriptionStartDate\": \"2016-08-11T10:00:00Z\", \"subscriptionTypeName\": \"testSubscription\", \"subscriptionUpdatedDate\": \"2016-08-14T10:00:00Z\", \"tenantId\": \"34683\" } ], \"tenants\": [ { \"tenantid\": \"c9674688-99dd-4a96-a191-2bed92255b15FT\", \"hascustomdomain\": false, \"firstdomaincreateddate\": \"2016-08-11T10:00:00Z\", \"domaincount\": 200, \"haseducation\": true, \"hasexchange\": true, \"haslync\": true, \"hassharepoint\": true, \"hasyammer\": false, \"hassubscription\": true, \"hastrial\": true, \"haspaid\": false, \"hasproject\": true, \"hasvisio\": true, \"tenantcreateddate\": \"2016-08-11T10:00:00Z\", \"tenantcurrentstatus\": \"testing\", \"tenantlastupdateddate\": \"2016-08-11T10:00:00Z\", \"tenantcountrycode\": \"IN\", \"office365instance\": \"testingOffice\", \"haspor\": false, \"paidincludedquantity\": 1 } ] }, \"XCV\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\" } } "; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"batchId\", \"DestinationColumn\": \"batchId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"messageCorrelationId\", \"DestinationColumn\": \"messageCorrelationId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"responseId\", \"DestinationColumn\": \"responseId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"success\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"data\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"email\", \"DestinationColumn\": \"EmailAddress\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"success\", \"DataType\": \"bool\", \"ComplexType\": null, \"TransformValue\": { \"DefaultValue\": false } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"errors\", \"DataType\": \"JArray\", \"ComplexType\": { \"DataType\": \"JArray\", \"Node\": \"$\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Failed.\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"type\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Validation Error\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"validationErrors\", \"DataType\": \"JArray\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \",\", \"Function\": \"Concat\", \"Params\": [ \"$.data.errors.validationErrors[*].message\", \"$.data.errors.innerValidationErrors[*].message\" ] } } ] } } ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate that the DateTime offset is removed from the value to be returned.")] - public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithOffset() + public void AutoMapperMapping_RemoveDateTimeOffsetTest_WithOffset() { // Arrange - var inputJson = + const string inputJson = "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000Z+0000\", \"endDate\": \"2015-06-26T15:55:00.000Z-0000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate that the DateTime is sent as it is if no offset is present.")] - public void AutoMappperMapping_RemoveDateTimeOffsetTest_WithoutOffset() + public void AutoMapperMapping_RemoveDateTimeOffsetTest_WithoutOffset() { // Arrange - var inputJson = + const string inputJson = "{ \"Results\": [ { \"$id\": \"2\", \"Comments\": null, \"MarketingTactic\": null, \"MarketingVehicle\": null, \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Status\": { \"$id\": \"3\", \"OptionSetId\": 0, \"DisplayValue\": \"Active\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"StatusReason\": { \"$id\": \"4\", \"OptionSetId\": 0, \"DisplayValue\": \"Proposed\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"TacticEndDate\": \"2015-06-26T15:55:00Z\", \"TacticStartDate\": \"2015-06-26T15:00:00Z\", \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"Owner\": { \"$id\": \"5\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"Origin\": { \"$id\": \"6\", \"OptionSetId\": 861980001, \"DisplayValue\": \"Marketing\", \"TypeName\": null, \"Id\": null, \"CreatedOn\": null, \"ModifiedOn\": null, \"CreatedBy\": null, \"ModifiedBy\": null, \"ExtendedId\": null }, \"GEPName\": \"Azure Platform\", \"GEPScenario\": null, \"ProgramId\": \"V1|OneGDC|10585\", \"GlobalCrmId\": null, \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\", \"CreatedOn\": \"2017-04-16T08:22:28Z\", \"ModifiedOn\": \"2017-07-16T16:52:34Z\", \"CreatedBy\": { \"$id\": \"7\", \"Id\": \"4654eabc-090a-e711-8104-5065f38aab31\", \"DisplayValue\": \"CCCMDev #\", \"TypeName\": \"systemuser\" }, \"ModifiedBy\": { \"$id\": \"8\", \"Id\": \"63fb5996-5821-e711-8105-5065f38aab31\", \"DisplayValue\": \"MAP PROD Corp #\", \"TypeName\": \"systemuser\" }, \"ExtendedId\": null } ], \"MoreRecords\": false, \"EntityName\": \"campaign\", \"PagingCookie\": \"\", \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PushProgramsToSales\", \"MessageBody\": { \"Program\": { \"id\": \"10585\", \"name\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\", \"description\": \"\", \"createdAt\": \"2015-06-29T20:32:10Z+0000\", \"updatedAt\": \"2017-06-13T23:20:41Z+0000\", \"startDate\": \"2015-06-26T15:00:00.000\", \"endDate\": \"2015-06-26T15:55:00.000\", \"url\": \"https://app-sj18.marketo.com/#ME10585A1\", \"type\": \"EventWithWebinar\", \"channel\": \"Webinar\", \"status\": \"\", \"workspace\": \"1GDC - Marketing Programs\", \"folder\": { \"type\": \"Folder\", \"value\": 35150, \"folderName\": \"AADP July Sessions\" }, \"tags\": [ { \"tagType\": \"Area\", \"tagValue\": \"Corporate\" }, { \"tagType\": \"Global Engagement Program\", \"tagValue\": \"Azure Platform\" }, { \"tagType\": \"Product\", \"tagValue\": \"Azure\" }, { \"tagType\": \"Program Owner\", \"tagValue\": \"Colleen Colley\" } ], \"MarketoInstanceName\": \"OneGDC\", \"UniqueProgramIdentifier\": \"V1|OneGDC|10585\" }, \"id\": \"52c6abaa-ed84-4d28-9f03-851af208db41\", \"createdAt\": \"2017-08-05T09:10:25\" } }, \"ForEachContext\": { } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.MifContext.MessageBody.Program.UniqueProgramIdentifier\", \"DestinationColumn\": \"ProgramId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"TacticName\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\", \"ReturnValue\": \"$.MifContext.MessageBody.Program.name\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.MifContext.MessageBody.Program.tokens[?(@.name == 'Program-Name')].value\" ] } }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.name\", \"DestinationColumn\": \"PromotionCode\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program')].tagValue\", \"DestinationColumn\": \"GEPName\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.tags[?(@.tagType == 'Global Engagement Program Scenario')].tagValue\", \"DestinationColumn\": \"GEPScenario\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.startDate\", \"DestinationColumn\": \"TacticStartDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"$.MifContext.MessageBody.Program.endDate\", \"DestinationColumn\": \"TacticEndDate\", \"DataType\": \"removeDateTimeOffset\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Source\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"ValueMapping\": null, \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"$.Results[0].Id\", \"DestinationColumn\": \"Id\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"Origin\", \"DataType\": \"JObject\", \"ComplexType\": { \"DataType\": \"JObject\", \"Node\": \"\", \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"DisplayValue\", \"DataType\": \"string\", \"TransformValue\": { \"DefaultValue\": \"Marketing\" } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"OptionSetId\", \"DataType\": \"int\", \"TransformValue\": { \"DefaultValue\": 861980001 } } ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_HappyPath() + public void AutoMapperMapping_ReplaceValueFunction_HappyPath() { // Arrange - var inputJson = + const string inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"12345\", \"phone\": \"67890\" } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamNull() + public void AutoMapperMapping_ReplaceValueFunction_ParamNull() { // Arrange - var inputJson = + const string inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"67890\" } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamNotPresent() + public void AutoMapperMapping_ReplaceValueFunction_ParamNotPresent() { // Arrange - var inputJson = + const string inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"phone\": \"67890\" } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ReturnValueNullParamNull() + public void AutoMapperMapping_ReplaceValueFunction_ReturnValueNullParamNull() { // Arrange - var inputJson = + const string inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\":null } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"LeadId\":\"leadId1\" }"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyString() + public void AutoMapperMapping_ReplaceValueFunction_ParamEmptyString() { // Arrange - var inputJson = + const string inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - _= JObject.Parse(expectedOutput); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpace() + public void AutoMapperMapping_ReplaceValueFunction_ParamWhiteSpace() { // Arrange - var inputJson = + const string inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() + public void AutoMapperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() { // Arrange - var inputJson = + const string inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": null, \"phone\": \"\" } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEmptyParamEnabled() + public void AutoMapperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEmptyParamEnabled() { // Arrange - var inputJson = + const string inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \"\", \"phone\": \"67890\" } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } [TestMethod, Description("Validate ReplaceValueFunction.")] - public void AutoMappperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgnoreEmptyParamEnabled() + public void AutoMapperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgnoreEmptyParamEnabled() { // Arrange - var inputJson = + const string inputJson = "{ \"test\": 1, \"MifContext\": { \"description\": \"ThisWorkflowisusedforPullingProgramsfromMIPTopicandInserting/UpdatingtheminMSX\", \"runId\": \"1a3fdea2-2a68-4078-81a4-419d8ba869c7\", \"TrackingEnabled\": true, \"WorkFlowName\": \"PullLeadActivitiesFromMarketo_VisitWebpage\" }, \"ForEachContext\": { \"leadId\": \"leadId1\", \"cDVSBusinessPhoneE164Format\": \" \", \"phone\": \"67890\" } }"; - var mappingJson = + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"$.ForEachContext.leadId\", \"DestinationColumn\": \"LeadId\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": null }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"MainPhone\", \"DataType\": \"string\", \"ComplexType\": null, \"TransformValue\": { \"Type\": \"function\", \"CompareToValue\": null, \"DefaultValue\": \"$.ForEachContext.cDVSBusinessPhoneE164Format\", \"ReturnValue\": \"$.ForEachContext.phone\", \"Function\": \"ReplaceValue\", \"IgnoreEmptyParams\": \"true\", \"Params\": [ \"$.ForEachContext.cDVSBusinessPhoneE164Format\" ] } } ] } }"; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; _ = JObject.Parse(expectedOutput); Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); @@ -1064,10 +1057,10 @@ public void OneToOneMappingTest() //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input)!, true); //Assert - Assert.AreEqual("Financial Services", output.SelectToken("$.Industry").ToString()); + Assert.AreEqual("Financial Services", output.SelectToken("$.Industry")!.ToString()); } [TestMethod, Description("Test range mapping functionality")] @@ -1088,72 +1081,72 @@ public void RangeMappingTest() //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input), true); + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(input)!, true); //Assert - Assert.AreEqual("51to250employees", output.SelectToken("$.CompanySize").ToString()); + Assert.AreEqual("51to250employees", output.SelectToken("$.CompanySize")!.ToString()); } [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Ampersand")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Ampersand() + public void FunctionHandler_UriEscapeDataString_HappyPath_Ampersand() { // Arrange - var inputJson = + const string inputJson = "{ \"data\": { \"companyName\": \"Procter & Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Dollar")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Dollar() + public void FunctionHandler_UriEscapeDataString_HappyPath_Dollar() { // Arrange - var inputJson = + const string inputJson = "{ \"data\": { \"companyName\": \"Procter $ Gamble Company\", \"countryName\": \"Bulgaria\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Plus")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Plus() + public void FunctionHandler_UriEscapeDataString_HappyPath_Plus() { // Arrange - var inputJson = + const string inputJson = "{ \"data\": { \"companyName\": \"Procter + Gamble Company\", \"countryName\": \"Bulgaria+\", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Space")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Space() + public void FunctionHandler_UriEscapeDataString_HappyPath_Space() { // Arrange - var inputJson = + const string inputJson = "{ \"data\": { \"companyName\": \"Procter Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1162,75 +1155,74 @@ public void FunctionHanlder_UriEscapeDataString_HappyPath_Space() public void FunctionHandler_UriEscapeDataString_HappyPath_Percent() { // Arrange - var inputJson = + const string inputJson = "{ \"data\": { \"companyName\": \"Procter%Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Test for UriEscapeDataString HappyPath With Escape character as Exclamation")] - public void FunctionHanlder_UriEscapeDataString_HappyPath_Exclamation() + public void FunctionHandler_UriEscapeDataString_HappyPath_Exclamation() { // Arrange - var inputJson = + const string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Test for UriEscapeDataString Null Paramters")] - public void FunctionHanlder_UriEscapeDataString_Null_Parameters() + public void FunctionHandler_UriEscapeDataString_Null_Parameters() { // Arrange - var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": null } } ] } } "; + const string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": null } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - // string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); Assert.IsTrue(JToken.DeepEquals(output, new JObject())); } [TestMethod, Description("Test for UriEscapeDataString One Null Paramter")] - public void FunctionHanlder_UriEscapeDataString_One_Null_Parameter() + public void FunctionHandler_UriEscapeDataString_One_Null_Parameter() { // Arrange - var inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + const string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", null, \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", null, \"$.data.state\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } [TestMethod, Description("Test for UriEscapeDataString With Invalid Parameter Field")] - public void FunctionHanlder_UriEscapeDataString_Invalid_Parameter_Field() + public void FunctionHandler_UriEscapeDataString_Invalid_Parameter_Field() { // Arrange - var inputJson = - "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; - var mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state1\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + const string inputJson = "{ \"data\": { \"companyName\": \"Procter!Gamble Company\", \"countryName\": \"Bulgaria \", \"state\": \"\", \"city\": \"Sofia\", \"zipCode\": \"1510\", \"DunnsId\": null } } "; + const string mappingJson = "{ \"MappingRuleConfig\": { \"TruthTable\": [ { \"SourceColumn\": \"\", \"DestinationColumn\": \"dummy\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Function\": \"UriEscapeDataString\", \"Params\": [ \"$.data.companyName\", \"$.data.countryName\", \"$.data.state1\", \"$.data.city\", \"$.data.zipCode\", \"$.data.DunnsId\" ] } }, { \"SourceColumn\": \"\", \"DestinationColumn\": \"message\", \"DataType\": \"string\", \"TransformValue\": { \"Type\": \"function\", \"Delimeter\": \"\", \"Function\": \"Concat\", \"Params\": [ \"https://social.sprinklr.com/selling/search/company?companyName=\", \"$.data.companyName\", \"&countryName=\", \"$.data.countryName\", \"&state=\", \"$.data.state\", \"&city=\", \"$.data.city\", \"&zipCode=\", \"$.data.zipCode\", \"&DunnsId=\", \"$.data.DunnsId\" ] } } ] } } "; + //Act var mapper = new AutoMapper(mappingJson); - var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson), true); - var expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } From eb52ce9caae61a655e0e5fc0b4a4b4cdca479486 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 09:18:44 +0100 Subject: [PATCH 21/37] - code shuffling to improve clarity - removed some redundant code --- test/JsonToJsonMapper.Tests/AutoMapperTest.cs | 132 ++++++++++-------- 1 file changed, 75 insertions(+), 57 deletions(-) diff --git a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index 35e12cb..c9c8c19 100644 --- a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -278,6 +278,7 @@ public void Validate_ValueMappingHandler_DefaultValue() ITransformationHandler handler = new ValueMappingHandler(); var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + //Assert Assert.IsTrue(response == "Certain"); } @@ -292,6 +293,7 @@ public void Validate_ValueMappingHandler_DefaultValue_UtcNow() ITransformationHandler handler = new ValueMappingHandler(); var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + //Assert Assert.IsTrue(DateTime.TryParse(response, out DateTime _)); } @@ -306,6 +308,7 @@ public void Validate_ValueMappingHandler_DefaultValue_Guid() ITransformationHandler handler = new ValueMappingHandler(); var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + //Assert Assert.IsTrue(Guid.TryParse(response, out Guid _)); } @@ -320,6 +323,7 @@ public void Validate_ValueMappingHandler_DefaultValue_Mapping() ITransformationHandler handler = new ValueMappingHandler(); var response = handler.Run(JObject.Parse(config), JObject.Parse(input)); + //Assert Assert.IsTrue(response == "2"); } @@ -334,9 +338,9 @@ public void FunctionTest_ConCat() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.com,Hello world!\"},{\"title\":\"First answer,Last answer,Hello world!\"},{\"title\":\",Hello world!\"}]}"; //Assert + const string expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.com,Hello world!\"},{\"title\":\"First answer,Last answer,Hello world!\"},{\"title\":\",Hello world!\"}]}"; Assert.AreEqual(response, expectedResponse); } @@ -351,9 +355,9 @@ public void FunctionTest_ConCat_WithoutDelimiter() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.comHello world!\"},{\"title\":\"First answerLast answerHello world!\"},{\"title\":\"Hello world!\"}]}"; //Assert + const string expectedResponse = "{\"EventList\":[{\"title\":\"https://info.microsoft.comHello world!\"},{\"title\":\"First answerLast answerHello world!\"},{\"title\":\"Hello world!\"}]}"; Assert.AreEqual(response, expectedResponse); } @@ -368,9 +372,9 @@ public void FunctionTest_ConCat_EmptyParamCollection() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"EventList\":[{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"}]}"; //Assert + const string expectedResponse = "{\"EventList\":[{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"},{\"title\":\"Hello world!\"}]}"; Assert.AreEqual(response, expectedResponse); } @@ -385,9 +389,9 @@ public void IgnoreEmptyArrayTest_True() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{}"; //Assert + const string expectedResponse = "{}"; Assert.AreEqual(response, expectedResponse); } @@ -402,9 +406,9 @@ public void IgnoreEmptyArrayTest_False() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"EventList\":[]}"; //Assert + const string expectedResponse = "{\"EventList\":[]}"; Assert.AreEqual(response, expectedResponse); } @@ -419,9 +423,9 @@ public void IgnoreEmptyArrayTest_NotSet() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"EventList\":[]}"; //Assert + const string expectedResponse = "{\"EventList\":[]}"; Assert.AreEqual(response, expectedResponse); } @@ -436,9 +440,9 @@ public void Automapper_EmptyDefaultValueTest() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"__meta__Entity\":\"GenericPresales\",\"EncryptedFields\":\" \"}"; //Assert + const string expectedResponse = "{\"__meta__Entity\":\"GenericPresales\",\"EncryptedFields\":\" \"}"; Assert.AreEqual(expectedResponse, response); } @@ -453,9 +457,9 @@ public void FunctionTest_ReplaceValue() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; //Assert + const string expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; Assert.AreEqual(response, expectedResponse); } @@ -470,9 +474,9 @@ public void FunctionTest_ReplaceValueNode_Failure() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"NA\\\"\\r\\n}\"}"; //Assert + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"NA\\\"\\r\\n}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -487,9 +491,9 @@ public void FunctionTest_ReplaceValueNode_Success() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"RV\\\"\\r\\n}\"}"; //Assert + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"RV\\\"\\r\\n}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -504,9 +508,9 @@ public void FunctionTest_ReplaceValueNode_JsonPath() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; //Assert + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -521,9 +525,9 @@ public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; //Assert + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -538,9 +542,9 @@ public void FunctionTest_ReplaceValue_ReturnValue_Node() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; //Assert + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -555,9 +559,9 @@ public void FunctionTest_ReplaceValueNodeTwo() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"\\\"\\r\\n}\"}"; //Assert + const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"\\\"\\r\\n}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -572,9 +576,9 @@ public void FunctionTest_ReplaceValue_NullCompareToValueAndInputValue_RegexTest( //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"address\":\"def\"}"; //Assert + const string expectedResponse = "{\"address\":\"def\"}"; Assert.AreEqual(response, expectedResponse); } @@ -589,9 +593,9 @@ public void FunctionTest_ReplaceValue_NullCompareToValue_RegexTest() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"address\":\"abc\"}"; //Assert + const string expectedResponse = "{\"address\":\"abc\"}"; Assert.AreEqual(response, expectedResponse); } @@ -606,9 +610,9 @@ public void FunctionTest_ReplaceValue_EmptyCompareToValue_RegexTest() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"address\":\"def\"}"; //Assert + const string expectedResponse = "{\"address\":\"def\"}"; Assert.AreEqual(response, expectedResponse); } @@ -623,9 +627,9 @@ public void FunctionTest_ReplaceValue_RegexTest() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; //Assert + const string expectedResponse = "{\"EventList\":[{\"title\":false},{\"title\":true},{\"title\":true}]}"; Assert.AreEqual(response, expectedResponse); } @@ -641,9 +645,9 @@ public void Automapper_IgnoreNullFalseTest() //Act var response = mapper.TransformIntoJson(JObject.Parse(inputJson), true); - const string expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; //Assert + const string expectedResponse = "{ \"EventId\": \"-1\", \"SchemaName\": \"JournalEvents.Certain.EventQuestionAnswersDetail\", \"ContentObject\": [ { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Hero Banner Image\", \"questionLabel\": \"Hero Banner Image\", \"questionCode\": \"Hero Banner Image\", \"questionType\": \"Image\", \"answerLabel\": \"answerLabelXYZ\", \"answerCode\": \"answerCodeXYZ\", \"answerName\": \"answerNameXYZ\" }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-HeaderText\", \"questionLabel\": \"Program-HeaderText\", \"questionCode\": \"Program-HeaderText\", \"questionType\": \"Text\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null }, { \"accountCode\": \"C-and-E\", \"eventCode\": \"tmpl-polish-devcl\", \"questionName\": \"Program-Description\", \"questionLabel\": \"Program-Description (Registration Form - Paragraph 1)\", \"questionCode\": \"Program-Description\", \"questionType\": \"Textarea\", \"answerLabel\": null, \"answerCode\": null, \"answerName\": null } ] }"; Assert.IsTrue(JToken.DeepEquals(response, JObject.Parse(expectedResponse))); } @@ -658,9 +662,9 @@ public void FunctionTest_SplitWithOneIndex() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Key\":[{\"Key\":\"12121212333\"}]}"; //Assert + const string expectedResponse = "{\"Key\":[{\"Key\":\"12121212333\"}]}"; Assert.AreEqual(response, expectedResponse); } @@ -675,9 +679,9 @@ public void FunctionTest_SplitWithTwoIndex() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Data\":[{\"Key\":\"12121212333\",\"Message\":\"AKJKKAJDKAKJKKKDKSKAK\"}]}"; //Assert + const string expectedResponse = "{\"Data\":[{\"Key\":\"12121212333\",\"Message\":\"AKJKKAJDKAKJKKKDKSKAK\"}]}"; Assert.AreEqual(response, expectedResponse); } @@ -692,9 +696,9 @@ public void FunctionTest_TransformToUpperCase() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\"}]}"; //Assert + const string expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\"}]}"; Assert.AreEqual(response, expectedResponse); } @@ -718,9 +722,9 @@ public void FunctionTest_TransformToUpperCaseParent() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\",\"FirstName\":\"AP - Azure\",\"LastName\":\"C - AND - E\"}]}"; //Assert + const string expectedResponse = "{\"Data\":[{\"EmailAddress\":\"WINDOWS 10\",\"FirstName\":\"AP - Azure\",\"LastName\":\"C - AND - E\"}]}"; Assert.AreEqual(response, expectedResponse); } @@ -735,9 +739,9 @@ public void FunctionTest_TransformToLowerCase() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = "{\"Data\":[{\"EmailAddress\":\"windows 10\"}]}"; //Assert + const string expectedResponse = "{\"Data\":[{\"EmailAddress\":\"windows 10\"}]}"; Assert.AreEqual(response, expectedResponse); } @@ -755,6 +759,7 @@ public void Validate_AutoMapper_NullDataType() var mapper = new AutoMapper(mappingJson); var lead = (LeadRecord)mapper.Transform(inputJson); + //Assert Assert.IsTrue(lead.LeadScore == 100); } @@ -771,8 +776,9 @@ public void AutoMapperMappingForJObjectAndJArray() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(inputJson); - const string expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; + //Assert + const string expectedOutput = "{\"ProgramName\":\"test4\",\"Folder\":{\"id\":\"49\",\"type\":\"Folder\"},\"ProgramDescription\":\"xcvxbv\",\"ProgramType\":\"Default\",\"ProgramChannel\":\"Email Blast\",\"Costs\":[{\"startDate\":\"2015-01-01\",\"cost\":\"8360\"}]}"; Assert.AreEqual(output, expectedOutput); } @@ -790,6 +796,7 @@ public void AutoMapperMapping_ValidateDateTimeFormat() var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + //Assert Assert.AreEqual(output["ContentObject"]![0]!["ProgramDayDate"]!.ToString(), "2015-11-30T00:00:00"); Assert.AreEqual(output["ContentObject"]![0]!["ShortFormattedDate"]!.ToString(), "11/30/2015"); } @@ -807,8 +814,9 @@ public void AutoMapperMapping_ConcatWithNull() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; + //Assert + const string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"PropertyRequired for action at #/action\" ] } ] } } "; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -825,8 +833,9 @@ public void AutoMapperMapping_ConcatWithEmptyList() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; + //Assert + const string expectedOutput = "{ \"batchId\": \"d7620d3b-188a-49a0-b540-29de82b6ae1c\", \"messageCorrelationId\": \"6a87a56f-618c-4d0b-ac96-09adad1f99d5\", \"responseId\": \"bcf0f3d0-7053-4924-b773-11776daf7692\", \"success\": false, \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"data\": { \"EmailAddress\": \"P75LIOT4USIPA7RXVMPG@mipFT.com\", \"success\": false, \"errors\": [ { \"message\": \"Validation Failed.\", \"type\": \"Validation Error\", \"validationErrors\": [ \"\" ] } ] } } "; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -843,9 +852,9 @@ public void AutoMapperMapping_RemoveDateTimeOffsetTest_WithOffset() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00Z\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00Z\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -862,9 +871,9 @@ public void AutoMapperMapping_RemoveDateTimeOffsetTest_WithoutOffset() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{\r\n \"ProgramId\": \"V1|OneGDC|10585\",\r\n \"TacticName\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"PromotionCode\": \"CO-Azure-WBNR-FY16-07Jul-AADP Quick Wins AM1\",\r\n \"GEPName\": \"Azure Platform\",\r\n \"TacticStartDate\": \"2015-06-26T15:00:00\",\r\n \"TacticEndDate\": \"2015-06-26T15:55:00\",\r\n \"Source\": \"Marketing\",\r\n \"Id\": \"55a11e81-7e0a-4628-b489-b9db3ff8acac\",\r\n \"Origin\": {\r\n \"DisplayValue\": \"Marketing\",\r\n \"OptionSetId\": 861980001\r\n }\r\n}"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -881,9 +890,9 @@ public void AutoMapperMapping_ReplaceValueFunction_HappyPath() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"12345\" }"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -900,9 +909,9 @@ public void AutoMapperMapping_ReplaceValueFunction_ParamNull() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -919,9 +928,9 @@ public void AutoMapperMapping_ReplaceValueFunction_ParamNotPresent() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -938,9 +947,9 @@ public void AutoMapperMapping_ReplaceValueFunction_ReturnValueNullParamNull() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"LeadId\":\"leadId1\" }"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{ \"LeadId\":\"leadId1\" }"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -957,9 +966,9 @@ public void AutoMapperMapping_ReplaceValueFunction_ParamEmptyString() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -976,9 +985,9 @@ public void AutoMapperMapping_ReplaceValueFunction_ParamWhiteSpace() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\" \" }"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -995,9 +1004,9 @@ public void AutoMapperMapping_ReplaceValueFunction_ParamNullReturnValueEmpty() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"\" }"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -1014,9 +1023,9 @@ public void AutoMapperMapping_ReplaceValueFunction_ParamEmptyStringWithIgnoreEmp //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -1033,9 +1042,9 @@ public void AutoMapperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgno //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; - _ = JObject.Parse(expectedOutput); + //Assert + const string expectedOutput = "{ \"LeadId\":\"leadId1\", \"MainPhone\":\"67890\" }"; Assert.IsTrue(JToken.DeepEquals(JObject.Parse(output.ToString()), JObject.Parse(expectedOutput))); } @@ -1098,8 +1107,9 @@ public void FunctionHandler_UriEscapeDataString_HappyPath_Ampersand() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + //Assert + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%26%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1114,8 +1124,9 @@ public void FunctionHandler_UriEscapeDataString_HappyPath_Dollar() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + //Assert + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%24%20Gamble%20Company&countryName=Bulgaria&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1130,8 +1141,9 @@ public void FunctionHandler_UriEscapeDataString_HappyPath_Plus() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + //Assert + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20%2B%20Gamble%20Company&countryName=Bulgaria%2B&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1146,8 +1158,9 @@ public void FunctionHandler_UriEscapeDataString_HappyPath_Space() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + //Assert + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%20Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1162,8 +1175,9 @@ public void FunctionHandler_UriEscapeDataString_HappyPath_Percent() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + //Assert + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%25Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1178,8 +1192,9 @@ public void FunctionHandler_UriEscapeDataString_HappyPath_Exclamation() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + //Assert + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1194,6 +1209,7 @@ public void FunctionHandler_UriEscapeDataString_Null_Parameters() var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); + //Assert Assert.IsTrue(JToken.DeepEquals(output, new JObject())); } @@ -1207,8 +1223,9 @@ public void FunctionHandler_UriEscapeDataString_One_Null_Parameter() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + //Assert + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria &state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } @@ -1222,8 +1239,9 @@ public void FunctionHandler_UriEscapeDataString_Invalid_Parameter_Field() //Act var mapper = new AutoMapper(mappingJson); var output = mapper.TransformIntoJson(JsonConvert.DeserializeObject(inputJson)!, true); - const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; + //Assert + const string expectedOutput = "{ \"message\": \"https://social.sprinklr.com/selling/search/company?companyName=Procter%21Gamble%20Company&countryName=Bulgaria%20&state=&city=Sofia&zipCode=1510&DunnsId=\" }"; Assert.IsTrue(JToken.DeepEquals(output, JObject.Parse(expectedOutput))); } } From 4a20d144b1f836c4d774ab75e1ac5d2a729cc031 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 09:41:42 +0100 Subject: [PATCH 22/37] - reSharper guided code cleanup --- src/JsonToJsonMapper/AutoMapper.cs | 10 +- .../Handlers/FunctionHandler.cs | 101 +++++++-------- .../Handlers/ITransformationHandler.cs | 2 +- .../Handlers/RoslynScriptHandler.cs | 2 +- .../Handlers/TransposeHandler.cs | 30 +++-- .../Handlers/TypeConverterHandler.cs | 116 +++++++----------- .../Handlers/ValueMappingHandler.cs | 25 ++-- 7 files changed, 125 insertions(+), 161 deletions(-) diff --git a/src/JsonToJsonMapper/AutoMapper.cs b/src/JsonToJsonMapper/AutoMapper.cs index 3e2981b..f3becbc 100644 --- a/src/JsonToJsonMapper/AutoMapper.cs +++ b/src/JsonToJsonMapper/AutoMapper.cs @@ -93,8 +93,7 @@ private object Execute(JObject jsonObject, MappingRule mapping) { if (rule.ComplexType == null) { - string valueType; - var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); + var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out var valueType); if (value != null) { @@ -177,10 +176,9 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) if (rule.ComplexType == null) { // Handle Jvalue - string valueType; var destinationValue = rule.DestinationColumn.StartsWith("$") ? jsonObject.SelectToken(rule.DestinationColumn).ToString() : rule.DestinationColumn; - var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out valueType); + var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out var valueType); if (rule.DataType == null) { rule.DataType = valueType; @@ -266,9 +264,9 @@ private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ig return array; } - private string GetValue(JObject jsonObject, string key, Transform transform, out string valueType) + private string? GetValue(JObject jsonObject, string key, Transform transform, out string valueType) { - string value = null; + string? value = null; valueType = "string"; if (transform != null && transform.Type != null && transform.Type.Equals("SCRIPT", StringComparison.OrdinalIgnoreCase)) diff --git a/src/JsonToJsonMapper/Handlers/FunctionHandler.cs b/src/JsonToJsonMapper/Handlers/FunctionHandler.cs index ba2b4b8..88d3ff7 100644 --- a/src/JsonToJsonMapper/Handlers/FunctionHandler.cs +++ b/src/JsonToJsonMapper/Handlers/FunctionHandler.cs @@ -5,7 +5,7 @@ public class FunctionHandler : ITransformationHandler { - public dynamic Run(JObject transform, JObject input) + public dynamic? Run(JObject transform, JObject input) { var inputParam = new List(); string nullString = null; @@ -164,12 +164,12 @@ public dynamic Run(JObject transform, JObject input) case "RANGEMAPPING": { - return mapRange((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); + return MapRange((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); } case "ONETOONEMAPPING": { - return mapOneToOne((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); + return MapOneToOne((JArray)transform.SelectToken("$.Params"), (string)input.SelectToken(transform.SelectToken("$.DefaultValue").ToString())); } case "URIESCAPEDATASTRING": @@ -182,85 +182,74 @@ public dynamic Run(JObject transform, JObject input) return null; } - private string GetTokenValue(JObject input, string nullString, string value) + private static string GetTokenValue(JObject input, string nullString, string value) { if (value != null && value.StartsWith("$.")) { var returnValueToken = input.SelectToken(value); - if (returnValueToken == null) - { - value = nullString; - } - else - { - if (returnValueToken.Type == JTokenType.Null) - { - value = nullString; - } - else - { - value = returnValueToken.ToString(); - } - } + value = returnValueToken == null ? nullString : returnValueToken.Type == JTokenType.Null ? nullString : returnValueToken.ToString(); } return value; } - private string GetCompareValue(JObject input, string nullString, string compareToValue) + private static string GetCompareValue(JObject input, string nullString, string compareToValue) { if (compareToValue != null && compareToValue.StartsWith("$.")) { var compareToValueToken = input.SelectToken(compareToValue); - if (compareToValueToken == null) - { - compareToValue = nullString; - } - else - { - compareToValue = compareToValueToken.ToString(); - } + compareToValue = compareToValueToken == null ? nullString : compareToValueToken.ToString(); } return compareToValue; } - private void UriEscapeDataString(JObject input, IList parameters) + private static void UriEscapeDataString(JObject input, IList parameters) { - if (parameters != null) + if (parameters == null) + { + return; + } + + foreach (var parameter in parameters) { - foreach (var parameter in parameters) + if (parameter == null) { - if (parameter != null) + continue; + } + + string theParameter = parameter.ToString(); + if (!theParameter.StartsWith("$")) + { + continue; + } + + var parameterToken = input.SelectTokens(theParameter); + if (parameterToken == null || !parameterToken.Any()) + { + continue; + } + + foreach (var token in parameterToken) + { + if (token.Type == JTokenType.Null) { - string theParameter = parameter.ToString(); - if (theParameter.StartsWith("$")) - { - var parameterToken = input.SelectTokens(theParameter); - if (parameterToken != null && parameterToken.Any()) - { - foreach (var token in parameterToken) - { - if (token.Type != JTokenType.Null) - { - var data = token.ToString(); - var uriEscapedData = Uri.EscapeDataString(data); - token.Replace(uriEscapedData); - } - } - } - } + continue; } + + var data = token.ToString(); + var uriEscapedData = Uri.EscapeDataString(data); + token.Replace(uriEscapedData); } } } - private string ConCat(List args, string delimeter) + private static string? ConCat(List args, string delimiter) { - return string.Join(delimeter, args.Where(value => value != null).ToList()); + return string.Join(delimiter, args.Where(value => value != null).ToList()); } - private string ReplaceValue(List args, string compareToValue, string returnValue, string defaultValue) + private static string? ReplaceValue(List args, string compareToValue, string? returnValue, string? defaultValue) { if (args[0] == null && compareToValue == null) { @@ -275,7 +264,7 @@ private string ReplaceValue(List args, string compareToValue, string ret return defaultValue; } - private string ReplaceValueWithRegexComparison(List args, string compareToValue, string returnValue, string defaultValue) + private static string? ReplaceValueWithRegexComparison(List args, string compareToValue, string? returnValue, string? defaultValue) { if (args[0] == null && compareToValue == null) { @@ -290,7 +279,7 @@ private string ReplaceValueWithRegexComparison(List args, string compare return defaultValue; } - private string Split(List args, char delimeter, int index, string position = "") + private static string? Split(List args, char delimeter, int index, string position = "") { if (string.IsNullOrEmpty(position)) { @@ -313,12 +302,12 @@ private string Split(List args, char delimeter, int index, string positi return string.Empty; } - private string mapRange(JArray truthTable, string value) + private static string? MapRange(JArray truthTable, string value) { return Convert.ToString(truthTable.SelectToken($"$.[?(@.min<'{Convert.ToInt64(value)}' && @.max>'{Convert.ToInt64(value)}')].value")); } - private string mapOneToOne(JArray truthTable, string value) + private static string? MapOneToOne(JArray truthTable, string value) { return Convert.ToString(truthTable.SelectToken($"$.[?(@.key=='{value}')].value")); } diff --git a/src/JsonToJsonMapper/Handlers/ITransformationHandler.cs b/src/JsonToJsonMapper/Handlers/ITransformationHandler.cs index e9dde9b..65f272f 100644 --- a/src/JsonToJsonMapper/Handlers/ITransformationHandler.cs +++ b/src/JsonToJsonMapper/Handlers/ITransformationHandler.cs @@ -4,5 +4,5 @@ public interface ITransformationHandler { - dynamic Run(JObject config, JObject input); + dynamic? Run(JObject config, JObject input); } diff --git a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs index 8314637..7843f58 100644 --- a/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs +++ b/src/JsonToJsonMapper/Handlers/RoslynScriptHandler.cs @@ -19,7 +19,7 @@ public RoslynScriptHandler(Dictionary scripts) /// /// /// - public dynamic Run(JObject transform, JObject input) + public dynamic? Run(JObject transform, JObject input) { var inputParam = new StringBuilder(); var parameters = transform["Params"].ToObject>(); diff --git a/src/JsonToJsonMapper/Handlers/TransposeHandler.cs b/src/JsonToJsonMapper/Handlers/TransposeHandler.cs index cb02c77..37636f7 100644 --- a/src/JsonToJsonMapper/Handlers/TransposeHandler.cs +++ b/src/JsonToJsonMapper/Handlers/TransposeHandler.cs @@ -10,7 +10,7 @@ public class TransposeHandler : ITransformationHandler /// /// /// - public dynamic Run(JObject rule, JObject input) + public dynamic? Run(JObject rule, JObject input) { var sourceColumn = rule["SourceColumn"].Value(); var transformValueKey = rule["TransformValue"]["KeyLookupField"].Value(); @@ -24,18 +24,28 @@ public dynamic Run(JObject rule, JObject input) var key = string.Empty; var token = i.SelectToken(transformValueKey); if (token != null) + { key = transformValuePrependText + token.ToString().Replace(" ", string.Empty); + } + + if (string.IsNullOrWhiteSpace(key)) + { + continue; + } - if (!string.IsNullOrWhiteSpace(key)) + var valueToken = i.SelectToken(transformValue); + if (valueToken == null) + { + continue; + } + + if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) + { + array.Add(key, valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); + } + else if (valueToken.Value() != null) { - var valueToken = i.SelectToken(transformValue); - if (valueToken != null) - { - if (valueToken.Type == JTokenType.Array || valueToken.Type == JTokenType.Object) - array.Add(key, valueToken.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "")); - else if (valueToken.Value() != null) - array.Add(key, valueToken); - } + array.Add(key, valueToken); } } diff --git a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs index e1ad940..93fb978 100644 --- a/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs +++ b/src/JsonToJsonMapper/Handlers/TypeConverterHandler.cs @@ -13,7 +13,7 @@ internal class TypeConverterHandler : ITransformationHandler /// /// /// - public dynamic Run(JObject config, JObject input) + public dynamic? Run(JObject config, JObject input) { var value = input["value"].Value(); var dataType = config["DataType"].Value(); @@ -38,39 +38,34 @@ public dynamic Run(JObject config, JObject input) case "JOBJECT": { - var Jtokenvalue = (JToken)value; - if (Jtokenvalue.Type == JTokenType.Object) + var jtokenvalue = (JToken)value; + if (jtokenvalue.Type == JTokenType.Object) { - return (JObject)Jtokenvalue; + return (JObject)jtokenvalue; } - return JsonConvert.DeserializeObject(Jtokenvalue.ToString()); + return JsonConvert.DeserializeObject(jtokenvalue.ToString()); } case "JARRAY": { - var Jtokenvalue = (JToken)value; - if (Jtokenvalue.Type == JTokenType.Array) + var jtokenvalue = (JToken)value; + if (jtokenvalue.Type == JTokenType.Array) { - if (Jtokenvalue.Any()) - { - return (JArray)Jtokenvalue; - } - - return null; + return jtokenvalue.Any() ? (JArray)jtokenvalue : null; } - if (Jtokenvalue.Type == JTokenType.Object) + if (jtokenvalue.Type == JTokenType.Object) { - return new JArray(Jtokenvalue); + return new JArray(jtokenvalue); } - if (Jtokenvalue.ToString().StartsWith("[") && Jtokenvalue.ToString().EndsWith("]")) + if (jtokenvalue.ToString().StartsWith("[") && jtokenvalue.ToString().EndsWith("]")) { - return JArray.Parse(Jtokenvalue.ToString()); + return JArray.Parse(jtokenvalue.ToString()); } - return new JArray(Jtokenvalue); + return new JArray(jtokenvalue); } case "SHORT": @@ -93,26 +88,21 @@ public dynamic Run(JObject config, JObject input) { var valueType = value.ToString(); var x = new Regex(@".*[+-][0-9][0-9][:]"); - if (x.IsMatch(valueType)) - { - return DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture); - } - - return DateTime.Parse(valueType, CultureInfo.InvariantCulture); + return x.IsMatch(valueType) ? DateTimeOffset.Parse(valueType, CultureInfo.InvariantCulture) : DateTime.Parse(valueType, CultureInfo.InvariantCulture); } case "CUSTOMDATETIME": { var valueType = value.ToString(); var x = new Regex(@".[+-][0-9]{4}"); - if (x.IsMatch(valueType)) + if (!x.IsMatch(valueType)) { - var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - var datetime = valueType.Substring(0, pos); - return datetime; + return null; } - return null; + var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + var datetime = valueType.Substring(0, pos); + return datetime; } case "BOOL": @@ -128,8 +118,7 @@ public dynamic Run(JObject config, JObject input) case "DECIMAL?": { - decimal decimalValue; - if (decimal.TryParse(value.ToString(), out decimalValue)) + if (decimal.TryParse(value.ToString(), out var decimalValue)) { return decimalValue; } @@ -140,13 +129,12 @@ public dynamic Run(JObject config, JObject input) case "INT?": { var dval = Convert.ToDecimal(value.ToString()); - return Decimal.ToInt32(dval); + return decimal.ToInt32(dval); } case "GUID?": { - Guid guid; - if (Guid.TryParse(value.ToString(), out guid)) + if (Guid.TryParse(value.ToString(), out var guid)) { return guid; } @@ -156,8 +144,7 @@ public dynamic Run(JObject config, JObject input) case "DATETIME?": { - DateTime datetime; - if (DateTime.TryParse(value.ToString(), out datetime)) + if (DateTime.TryParse(value.ToString(), out var datetime)) { return datetime; } @@ -167,74 +154,57 @@ public dynamic Run(JObject config, JObject input) case "UTCDATETIME": { - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) + if (!DateTime.TryParse(value.ToString(), out var dateTime)) { - var utcDateTime = dateTime.ToString("s"); - var zone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); - utcDateTime = utcDateTime + "+" + zone.BaseUtcOffset.ToString(); - return utcDateTime; + return null; } - return null; + var utcDateTime = dateTime.ToString("s"); + var zone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); + utcDateTime = utcDateTime + "+" + zone.BaseUtcOffset.ToString(); + return utcDateTime; } case "STRINGTOUTCDATEFORMAT": { //This block converts the given date into UTC formatted string, it will not change the TimeZone offset //compared to previous block. - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) + if (!DateTime.TryParse(value.ToString(), out var dateTime)) { - var timeInUTCFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); - return timeInUTCFormat; + return null; } - return null; + var timeInUtcFormat = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"); + return timeInUtcFormat; } case "REMOVEDATETIMEOFFSET": { var valueType = value.ToString(); - if (valueType.Contains("Z")) + if (!valueType.Contains("Z")) { - var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); - var datetime = valueType.Substring(0, pos + 1); //including 'Z' in the output - return datetime; + return valueType; } - return valueType; + var pos = valueType.IndexOf("Z", StringComparison.OrdinalIgnoreCase); + var datetime = valueType.Substring(0, pos + 1); //including 'Z' in the output + return datetime; } case "FORMATTEDDATETIME": { - DateTime dateTime; - if (DateTime.TryParse(value.ToString(), out dateTime)) + if (!DateTime.TryParse(value.ToString(), out var dateTime)) { - string timeInUTCFormat; - if (!string.IsNullOrWhiteSpace(format)) - { - timeInUTCFormat = dateTime.ToString(format); - } - else - { - timeInUTCFormat = dateTime.ToString(null, CultureInfo.InvariantCulture); - } - - return timeInUTCFormat; + return null; } - return null; + var timeInUtcFormat = !string.IsNullOrWhiteSpace(format) ? dateTime.ToString(format) : dateTime.ToString(null, CultureInfo.InvariantCulture); + return timeInUtcFormat; } case "STRING": { - if (value.GetType().Equals("JValue")) - { - return ((JValue)value).Value(); - } - - return value.ToString(); + return value.GetType().Equals("JValue") ? ((JValue)value).Value() : value.ToString(); } } diff --git a/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs b/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs index e0ef391..4028a41 100644 --- a/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs +++ b/src/JsonToJsonMapper/Handlers/ValueMappingHandler.cs @@ -10,32 +10,29 @@ public class ValueMappingHandler : ITransformationHandler /// /// /// - public dynamic Run(JObject transform, JObject input) + public dynamic? Run(JObject transform, JObject input) { var valueMapping = transform["ValueMapping"].ToObject>(); var defaultValue = transform["DefaultValue"].Value(); var value = input["value"].Value(); - if (transform != null && valueMapping != null && value != null) + if (transform != null && + valueMapping != null && + value != null) { value = (from item in valueMapping where item.ExistingValue.Equals(value, StringComparison.OrdinalIgnoreCase) select item.NewValue).FirstOrDefault(); } - if (transform != null && string.IsNullOrWhiteSpace(value) && defaultValue != null) + if (transform == null || !string.IsNullOrWhiteSpace(value) || defaultValue == null) { - if (defaultValue.Equals("UTCNOW", StringComparison.OrdinalIgnoreCase)) - { - return DateTime.UtcNow.ToString(); - } - - if (defaultValue.Equals("NEWGUID", StringComparison.OrdinalIgnoreCase)) - { - return Guid.NewGuid().ToString(); - } + return value; + } - return defaultValue; + if (defaultValue.Equals("UTCNOW", StringComparison.OrdinalIgnoreCase)) + { + return DateTime.UtcNow.ToString(); } - return value; + return defaultValue.Equals("NEWGUID", StringComparison.OrdinalIgnoreCase) ? Guid.NewGuid().ToString() : defaultValue; } } From 414e3a2d72b421cde882d888fdee0eeed09286c1 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 09:47:41 +0100 Subject: [PATCH 23/37] - reSharper guided code cleanup --- src/JsonToJsonMapper/AutoMapper.cs | 55 ++++++++++++++++-------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/src/JsonToJsonMapper/AutoMapper.cs b/src/JsonToJsonMapper/AutoMapper.cs index f3becbc..018a43a 100644 --- a/src/JsonToJsonMapper/AutoMapper.cs +++ b/src/JsonToJsonMapper/AutoMapper.cs @@ -160,8 +160,8 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) foreach (var rule in mapping.TruthTable) { // handle transpose - if (rule.TransformValue != null && - rule.TransformValue.Type != null && + if (rule.TransformValue != null && + rule.TransformValue.Type != null && string.Equals(rule.TransformValue.Type, "promoteArrayToProperty", StringComparison.OrdinalIgnoreCase)) { Dictionary transposeResponse = _handler.GetHandler() @@ -179,16 +179,13 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) var destinationValue = rule.DestinationColumn.StartsWith("$") ? jsonObject.SelectToken(rule.DestinationColumn).ToString() : rule.DestinationColumn; var value = GetValue(jsonObject, rule.SourceColumn, rule.TransformValue, out var valueType); - if (rule.DataType == null) - { - rule.DataType = valueType; - } + rule.DataType ??= valueType; var finalValue = _handler.GetHandler() .Run(JObject.FromObject(rule), JObject.FromObject(new { value = value })); - if (finalValue != null || - finalValue.Type != JTokenType.Null || - (finalValue == null && !mapping.IgnoreNullValue) || + if (finalValue != null || + finalValue.Type != JTokenType.Null || + (finalValue == null && !mapping.IgnoreNullValue) || (finalValue.Type == JTokenType.Null && !mapping.IgnoreNullValue)) { jsonString.Json.Add(destinationValue, finalValue); @@ -206,17 +203,19 @@ protected JObject ExecuteToJson(JObject jsonObject, MappingRule mapping) { // Recursive call to handle complex type var result = ExecuteToJson(jsonObject, rule.ComplexType); - if (result != null) + if (result is null) { - if (!string.IsNullOrWhiteSpace(rule.DataType)) - { - jsonString.Json.Add(rule.DestinationColumn, _handler.GetHandler() - .Run(JObject.FromObject(rule), JObject.FromObject(new { value = result }))); - } - else - { - jsonString.Json.Add(rule.DestinationColumn, result); - } + continue; + } + + if (!string.IsNullOrWhiteSpace(rule.DataType)) + { + jsonString.Json.Add(rule.DestinationColumn, _handler.GetHandler() + .Run(JObject.FromObject(rule), JObject.FromObject(new { value = result }))); + } + else + { + jsonString.Json.Add(rule.DestinationColumn, result); } } } @@ -266,15 +265,19 @@ private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ig private string? GetValue(JObject jsonObject, string key, Transform transform, out string valueType) { - string? value = null; + string? value; valueType = "string"; - if (transform != null && transform.Type != null && transform.Type.Equals("SCRIPT", StringComparison.OrdinalIgnoreCase)) + if (transform != null && + transform.Type != null && + transform.Type.Equals("SCRIPT", StringComparison.OrdinalIgnoreCase)) { return _handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); } - if (transform != null && transform.Type != null && transform.Type.Equals("FUNCTION", StringComparison.OrdinalIgnoreCase)) + if (transform != null && + transform.Type != null && + transform.Type.Equals("FUNCTION", StringComparison.OrdinalIgnoreCase)) { return _handler.GetHandler().Run(JObject.FromObject(transform), jsonObject); } @@ -344,15 +347,15 @@ private dynamic TransformJArray(JObject jsonObject, MappingRule mapping, bool ig } else { - var jsonobjectvalue = jsonObject.GetValue(key, StringComparison.OrdinalIgnoreCase); - if (jsonobjectvalue == null || jsonobjectvalue.Type == JTokenType.Null) + var jsonObjectValue = jsonObject.GetValue(key, StringComparison.OrdinalIgnoreCase); + if (jsonObjectValue == null || jsonObjectValue.Type == JTokenType.Null) { value = null; } else { - valueType = jsonobjectvalue.Type.ToString(); - value = jsonobjectvalue.ToString(); + valueType = jsonObjectValue.Type.ToString(); + value = jsonObjectValue.ToString(); if (value.StartsWith("\"")) { value = value.Substring(1); From 5e7047b188749f3ded21507225d57b53df5df998 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 09:54:11 +0100 Subject: [PATCH 24/37] - code shuffling to improve clarity --- test/JsonToJsonMapper.Tests/AutoMapperTest.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index c9c8c19..d19208d 100644 --- a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -202,10 +202,10 @@ public void PromoteAttributesToPropertyTestWithoutPrependKeyText() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""SourceType"":""Webpagevisit"",""SourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""ClientIPAddress"":""203.141.7.100"",""UserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""WebpageID"":4,""WebpageURL"":""/anti-phishing.html""}]}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); //Assert + const string expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""SourceType"":""Webpagevisit"",""SourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""ClientIPAddress"":""203.141.7.100"",""UserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""WebpageID"":4,""WebpageURL"":""/anti-phishing.html""}]}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); Assert.AreEqual(value, expectedResponse); } @@ -221,10 +221,10 @@ public void PromoteAttributesToPropertyTestWithPrependKeyText() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""AttributeSourceType"":""Webpagevisit"",""AttributeSourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""AttributeClientIPAddress"":""203.141.7.100"",""AttributeUserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""AttributeWebpageID"":4,""AttributeWebpageURL"":""/anti-phishing.html""}]}"; var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); //Assert + const string expectedResponse = @"{""Content"":[{""id"":2,""leadId"":6,""AttributeSourceType"":""Webpagevisit"",""AttributeSourceInfo"":""http://search.yahoo.com/search?p=train+cappuccino+army""},{""id"":3,""leadId"":9,""AttributeClientIPAddress"":""203.141.7.100"",""AttributeUserAgent"":""Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.14)Gecko/20080404Firefox/2.0.0.14"",""AttributeWebpageID"":4,""AttributeWebpageURL"":""/anti-phishing.html""}]}"; Assert.IsTrue(value.Contains("AttributeWebpageURL")); Assert.AreEqual(value, expectedResponse); } @@ -241,10 +241,10 @@ public void RoslynTest() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = @"{""EventList"":[{""title"":""Windows 10 for device management"",""accountCode"":""C-and-E"",""Id"":""APAC-1PWBNR3-0331-16-HQ"",""Status"":""Live"",""timezone"":""(GMT+05:00) Islamabad, Karachi, Tashkent"",""source"":""Certain"",""EventCategory"":""Onsite Event"",""StartDate"":""2016-03-31T08:00:00Z"",""EndDate"":""2016-03-31T16:00:00Z"",""locationCode"":""Webinar"",""Description"":""A"",""PrimaryLanguage"":[""""],""PrimaryTargetAudience"":[""""],""Product"":[""""],""Category"":""TBD"",""URL"":""www.microsoft.com""}],""RequestId"":""4bfaac9c-1e0d-4620-b9e6-66095376e99a""}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); //Assert + const string expectedResponse = @"{""EventList"":[{""title"":""Windows 10 for device management"",""accountCode"":""C-and-E"",""Id"":""APAC-1PWBNR3-0331-16-HQ"",""Status"":""Live"",""timezone"":""(GMT+05:00) Islamabad, Karachi, Tashkent"",""source"":""Certain"",""EventCategory"":""Onsite Event"",""StartDate"":""2016-03-31T08:00:00Z"",""EndDate"":""2016-03-31T16:00:00Z"",""locationCode"":""Webinar"",""Description"":""A"",""PrimaryLanguage"":[""""],""PrimaryTargetAudience"":[""""],""Product"":[""""],""Category"":""TBD"",""URL"":""www.microsoft.com""}],""RequestId"":""4bfaac9c-1e0d-4620-b9e6-66095376e99a""}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); } @@ -260,10 +260,10 @@ public void ParentDataTest() //Act var response = mapper.TransformIntoJson(inputJson, true); - const string expectedResponse = @"{""Answers"":[{""eventId"":""100"",""questionId"":""Q1"",""value"":""1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q1"",""value"":""2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q2"",""value"":""3Consumers,Partners""},{""eventId"":""200"",""questionId"":""Q3""},{""eventId"":""200"",""questionId"":""Q4"",""value"":""4Klo""}]}"; - var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); //Assert + const string expectedResponse = @"{""Answers"":[{""eventId"":""100"",""questionId"":""Q1"",""value"":""1http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q1"",""value"":""2http://na-ab11.marketo.com/rs/113-EDC-810/images/MSC Test Banner.jpg""},{""eventId"":""100"",""questionId"":""Q2"",""value"":""3Consumers,Partners""},{""eventId"":""200"",""questionId"":""Q3""},{""eventId"":""200"",""questionId"":""Q4"",""value"":""4Klo""}]}"; + var value = response.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); Assert.AreEqual(value, expectedResponse.Replace(" ", string.Empty)); } From 6cb1caec11b21cc905639c4028d4fc9b0d73dac0 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Fri, 30 Sep 2022 11:39:43 +0100 Subject: [PATCH 25/37] - skeleton script tester app --- JsonToJsonMapper.Core.sln | 7 + .../App.razor | 12 + .../JsonToJsonMapper.ScriptTester.Core.csproj | 13 + .../Pages/Error.cshtml | 42 ++ .../Pages/Error.cshtml.cs | 26 + .../Pages/Index.razor | 14 + .../Pages/_Host.cshtml | 8 + .../Pages/_Layout.cshtml | 32 ++ .../Program.cs | 26 + .../Properties/launchSettings.json | 13 + .../Shared/MainLayout.razor | 11 + .../Shared/MainLayout.razor.css | 70 +++ .../_Imports.razor | 10 + .../appsettings.Development.json | 9 + .../appsettings.json | 9 + .../wwwroot/css/bootstrap/bootstrap.min.css | 7 + .../css/bootstrap/bootstrap.min.css.map | 1 + .../wwwroot/css/open-iconic/FONT-LICENSE | 86 +++ .../wwwroot/css/open-iconic/ICON-LICENSE | 21 + .../wwwroot/css/open-iconic/README.md | 114 ++++ .../font/css/open-iconic-bootstrap.min.css | 1 + .../open-iconic/font/fonts/open-iconic.eot | Bin 0 -> 28196 bytes .../open-iconic/font/fonts/open-iconic.otf | Bin 0 -> 20996 bytes .../open-iconic/font/fonts/open-iconic.svg | 543 ++++++++++++++++++ .../open-iconic/font/fonts/open-iconic.ttf | Bin 0 -> 28028 bytes .../open-iconic/font/fonts/open-iconic.woff | Bin 0 -> 14984 bytes .../wwwroot/css/site.css | 64 +++ .../wwwroot/favicon.ico | Bin 0 -> 5430 bytes 28 files changed, 1139 insertions(+) create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/App.razor create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/JsonToJsonMapper.ScriptTester.Core.csproj create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/Pages/Error.cshtml create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/Pages/Error.cshtml.cs create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/Pages/_Host.cshtml create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/Pages/_Layout.cshtml create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/Program.cs create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/Properties/launchSettings.json create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/Shared/MainLayout.razor create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/Shared/MainLayout.razor.css create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/_Imports.razor create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/appsettings.Development.json create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/appsettings.json create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/bootstrap/bootstrap.min.css create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/bootstrap/bootstrap.min.css.map create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/open-iconic/FONT-LICENSE create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/open-iconic/ICON-LICENSE create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/open-iconic/README.md create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/open-iconic/font/fonts/open-iconic.eot create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/open-iconic/font/fonts/open-iconic.otf create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/open-iconic/font/fonts/open-iconic.svg create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/open-iconic/font/fonts/open-iconic.woff create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/site.css create mode 100644 src/JsonToJsonMapper.ScriptTester.Core/wwwroot/favicon.ico diff --git a/JsonToJsonMapper.Core.sln b/JsonToJsonMapper.Core.sln index 8afae2a..58ba1ce 100644 --- a/JsonToJsonMapper.Core.sln +++ b/JsonToJsonMapper.Core.sln @@ -11,6 +11,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{5925B6A8-8 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonToJsonMapper.Core.Tests", "test\JsonToJsonMapper.Tests\JsonToJsonMapper.Core.Tests.csproj", "{D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonToJsonMapper.ScriptTester.Core", "src\JsonToJsonMapper.ScriptTester.Core\JsonToJsonMapper.ScriptTester.Core.csproj", "{9DBE0B3B-9921-4EA2-8503-712F657F5489}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -28,9 +30,14 @@ Global {D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU {D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU {D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2}.Release|Any CPU.Build.0 = Release|Any CPU + {9DBE0B3B-9921-4EA2-8503-712F657F5489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9DBE0B3B-9921-4EA2-8503-712F657F5489}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DBE0B3B-9921-4EA2-8503-712F657F5489}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9DBE0B3B-9921-4EA2-8503-712F657F5489}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {4620C9BA-6A5E-4B38-A3E3-6394AA94D06C} = {9181289D-E1A0-4294-86C3-000A3DB40611} {D00EFB18-9D20-4222-A9C0-33A6C1CD7FE2} = {5925B6A8-817B-4767-AFF8-12A593C7A3AB} + {9DBE0B3B-9921-4EA2-8503-712F657F5489} = {9181289D-E1A0-4294-86C3-000A3DB40611} EndGlobalSection EndGlobal diff --git a/src/JsonToJsonMapper.ScriptTester.Core/App.razor b/src/JsonToJsonMapper.ScriptTester.Core/App.razor new file mode 100644 index 0000000..dbf5d02 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/App.razor @@ -0,0 +1,12 @@ + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
diff --git a/src/JsonToJsonMapper.ScriptTester.Core/JsonToJsonMapper.ScriptTester.Core.csproj b/src/JsonToJsonMapper.ScriptTester.Core/JsonToJsonMapper.ScriptTester.Core.csproj new file mode 100644 index 0000000..a5e1216 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/JsonToJsonMapper.ScriptTester.Core.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Error.cshtml b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Error.cshtml new file mode 100644 index 0000000..45944cf --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Error.cshtml @@ -0,0 +1,42 @@ +@page +@model JsonToJsonMapper.ScriptTester.Core.Pages.ErrorModel + + + + + + + + Error + + + + + +
+
+

Error.

+

An error occurred while processing your request.

+ + @if (Model.ShowRequestId) + { +

+ Request ID: @Model.RequestId +

+ } + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+
+
+ + + diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Error.cshtml.cs b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Error.cshtml.cs new file mode 100644 index 0000000..242202d --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Error.cshtml.cs @@ -0,0 +1,26 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace JsonToJsonMapper.ScriptTester.Core.Pages; + +[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] +[IgnoreAntiforgeryToken] +public class ErrorModel : PageModel +{ + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + private readonly ILogger _logger; + + public ErrorModel(ILogger logger) + { + _logger = logger; + } + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } +} diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor new file mode 100644 index 0000000..4d742e7 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor @@ -0,0 +1,14 @@ +@page "/" + +JsonToJsonMapper Script Tester + +

Script

+

Code

+

Reference

+

Assembly

+

NameSpace

+ +

Input

+ +

Output

+ diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Host.cshtml b/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Host.cshtml new file mode 100644 index 0000000..07426ef --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Host.cshtml @@ -0,0 +1,8 @@ +@page "/" +@namespace JsonToJsonMapper.ScriptTester.Core.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@{ + Layout = "_Layout"; +} + + diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Layout.cshtml b/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Layout.cshtml new file mode 100644 index 0000000..04bd60c --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Layout.cshtml @@ -0,0 +1,32 @@ +@using Microsoft.AspNetCore.Components.Web +@namespace JsonToJsonMapper.ScriptTester.Core.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + + + + + + + + + + + + + +@RenderBody() + +
+ + An error has occurred. This application may no longer respond until reloaded. + + + An unhandled exception has occurred. See browser dev tools for details. + + Reload + 🗙 +
+ + + + diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Program.cs b/src/JsonToJsonMapper.ScriptTester.Core/Program.cs new file mode 100644 index 0000000..706e6e7 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Program.cs @@ -0,0 +1,26 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddRazorPages(); +builder.Services.AddServerSideBlazor(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); + +app.UseStaticFiles(); + +app.UseRouting(); + +app.MapBlazorHub(); +app.MapFallbackToPage("/_Host"); + +app.Run(); diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Properties/launchSettings.json b/src/JsonToJsonMapper.ScriptTester.Core/Properties/launchSettings.json new file mode 100644 index 0000000..1b7d520 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "JsonToJsonMapper.ScriptTester.Core": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7279;http://localhost:5249", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Shared/MainLayout.razor b/src/JsonToJsonMapper.ScriptTester.Core/Shared/MainLayout.razor new file mode 100644 index 0000000..0dba19c --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Shared/MainLayout.razor @@ -0,0 +1,11 @@ +@inherits LayoutComponentBase + +JsonToJsonMapper Script Tester + +
+
+
+ @Body +
+
+
diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Shared/MainLayout.razor.css b/src/JsonToJsonMapper.ScriptTester.Core/Shared/MainLayout.razor.css new file mode 100644 index 0000000..551e4b2 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Shared/MainLayout.razor.css @@ -0,0 +1,70 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + } + + .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row:not(.auth) { + display: none; + } + + .top-row.auth { + justify-content: space-between; + } + + .top-row a, .top-row .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/src/JsonToJsonMapper.ScriptTester.Core/_Imports.razor b/src/JsonToJsonMapper.ScriptTester.Core/_Imports.razor new file mode 100644 index 0000000..4ba723d --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/_Imports.razor @@ -0,0 +1,10 @@ +@using System.Net.Http +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using JsonToJsonMapper.ScriptTester.Core +@using JsonToJsonMapper.ScriptTester.Core.Shared diff --git a/src/JsonToJsonMapper.ScriptTester.Core/appsettings.Development.json b/src/JsonToJsonMapper.ScriptTester.Core/appsettings.Development.json new file mode 100644 index 0000000..770d3e9 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "DetailedErrors": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/JsonToJsonMapper.ScriptTester.Core/appsettings.json b/src/JsonToJsonMapper.ScriptTester.Core/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/bootstrap/bootstrap.min.css b/src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/bootstrap/bootstrap.min.css new file mode 100644 index 0000000..02ae65b --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/bootstrap/bootstrap.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * Bootstrap v5.1.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-rgb:33,37,41;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/bootstrap/bootstrap.min.css.map b/src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/bootstrap/bootstrap.min.css.map new file mode 100644 index 0000000..afcd9e3 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/wwwroot/css/bootstrap/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-rgb: #{to-rgb($body-color)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}-root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs new file mode 100644 index 0000000..8a181d2 --- /dev/null +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs @@ -0,0 +1,17 @@ +namespace JsonToJsonMapper.ScriptTester.Core.Pages; + +public sealed partial class Index +{ + private string _code { get; set; } + private string _assemblies { get; set; } + private string _namespaces { get; set; } + private string _input { get; set; } + private string _output { get; set; } + private bool _canRun => !string.IsNullOrWhiteSpace(_code) && !string.IsNullOrWhiteSpace(_input); + + private Task OnRun() + { + _output = $"Run: {_code}{Environment.NewLine}+{Environment.NewLine}{_input}"; + return Task.CompletedTask; + } +} From 4f947e982391385cebf6ee93161b1c1c1f9836b8 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Sat, 1 Oct 2022 12:29:57 +0100 Subject: [PATCH 32/37] - run script --- .../Pages/Index.razor.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs index 8a181d2..acca3ff 100644 --- a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs @@ -1,4 +1,7 @@ -namespace JsonToJsonMapper.ScriptTester.Core.Pages; +using Microsoft.CodeAnalysis.CSharp.Scripting; +using Microsoft.CodeAnalysis.Scripting; + +namespace JsonToJsonMapper.ScriptTester.Core.Pages; public sealed partial class Index { @@ -9,9 +12,14 @@ public sealed partial class Index private string _output { get; set; } private bool _canRun => !string.IsNullOrWhiteSpace(_code) && !string.IsNullOrWhiteSpace(_input); - private Task OnRun() + private async Task OnRun() { - _output = $"Run: {_code}{Environment.NewLine}+{Environment.NewLine}{_input}"; - return Task.CompletedTask; + _output = "Running..."; + + var options = (!string.IsNullOrWhiteSpace(_assemblies) && !string.IsNullOrWhiteSpace(_namespaces)) ? ScriptOptions.Default.AddReferences(_assemblies).WithImports(_namespaces) : null; + var script = CSharpScript.Create(_code, options, globalsType: typeof(ScriptHost)); + var host = new ScriptHost() {Args = _input}; + var result = await script.RunAsync(host); + _output = result.ReturnValue; } } From c3a4ab6c0e52d03af87496e28e62feac1ef06861 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Sat, 1 Oct 2022 12:52:30 +0100 Subject: [PATCH 33/37] - display any errors to user --- .../Pages/Index.razor.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs index acca3ff..a8b188e 100644 --- a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs @@ -15,11 +15,17 @@ public sealed partial class Index private async Task OnRun() { _output = "Running..."; - + try + { var options = (!string.IsNullOrWhiteSpace(_assemblies) && !string.IsNullOrWhiteSpace(_namespaces)) ? ScriptOptions.Default.AddReferences(_assemblies).WithImports(_namespaces) : null; var script = CSharpScript.Create(_code, options, globalsType: typeof(ScriptHost)); var host = new ScriptHost() {Args = _input}; var result = await script.RunAsync(host); _output = result.ReturnValue; + } + catch (Exception ex) + { + _output = ex.Message; + } } } From 5dd25a7e397261a21d4763a94126746de1318493 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Sat, 1 Oct 2022 14:20:41 +0100 Subject: [PATCH 34/37] - integrate Monaco code editor for better UI - always enable Run button -- Monaco returns text async -- Blazor does not support async validation etc --- .../JsonToJsonMapper.ScriptTester.Core.csproj | 4 +++ .../Pages/Index.razor | 15 ++++++-- .../Pages/Index.razor.cs | 34 +++++++++++++------ .../Pages/_Layout.cshtml | 7 ++++ 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/JsonToJsonMapper.ScriptTester.Core/JsonToJsonMapper.ScriptTester.Core.csproj b/src/JsonToJsonMapper.ScriptTester.Core/JsonToJsonMapper.ScriptTester.Core.csproj index e65bdc2..8d80055 100644 --- a/src/JsonToJsonMapper.ScriptTester.Core/JsonToJsonMapper.ScriptTester.Core.csproj +++ b/src/JsonToJsonMapper.ScriptTester.Core/JsonToJsonMapper.ScriptTester.Core.csproj @@ -16,4 +16,8 @@ + + + + diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor index fd7038c..1f63cd4 100644 --- a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor @@ -1,9 +1,20 @@ @page "/" +@using BlazorMonaco + + + JsonToJsonMapper Script Tester - +

@@ -17,4 +28,4 @@ - + diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs index a8b188e..51ac734 100644 --- a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs @@ -1,27 +1,41 @@ -using Microsoft.CodeAnalysis.CSharp.Scripting; -using Microsoft.CodeAnalysis.Scripting; +namespace JsonToJsonMapper.ScriptTester.Core.Pages; -namespace JsonToJsonMapper.ScriptTester.Core.Pages; +using BlazorMonaco; +using Microsoft.CodeAnalysis.CSharp.Scripting; +using Microsoft.CodeAnalysis.Scripting; public sealed partial class Index { - private string _code { get; set; } + private MonacoEditor _code { get; set; } private string _assemblies { get; set; } private string _namespaces { get; set; } private string _input { get; set; } private string _output { get; set; } - private bool _canRun => !string.IsNullOrWhiteSpace(_code) && !string.IsNullOrWhiteSpace(_input); + + private StandaloneEditorConstructionOptions EditorOptions(MonacoEditor editor) + { + return new StandaloneEditorConstructionOptions + { + Language = "csharp", + AutomaticLayout = true, + RenderIndentGuides = false, + RenderFinalNewline = false, + ColorDecorators = true, + OccurrencesHighlight = true, + }; + } private async Task OnRun() { _output = "Running..."; try { - var options = (!string.IsNullOrWhiteSpace(_assemblies) && !string.IsNullOrWhiteSpace(_namespaces)) ? ScriptOptions.Default.AddReferences(_assemblies).WithImports(_namespaces) : null; - var script = CSharpScript.Create(_code, options, globalsType: typeof(ScriptHost)); - var host = new ScriptHost() {Args = _input}; - var result = await script.RunAsync(host); - _output = result.ReturnValue; + var options = (!string.IsNullOrWhiteSpace(_assemblies) && !string.IsNullOrWhiteSpace(_namespaces)) ? ScriptOptions.Default.AddReferences(_assemblies).WithImports(_namespaces) : null; + var src = await _code.GetValue(); + var script = CSharpScript.Create(src, options, globalsType: typeof(ScriptHost)); + var host = new ScriptHost() {Args = _input}; + var result = await script.RunAsync(host); + _output = result.ReturnValue; } catch (Exception ex) { diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Layout.cshtml b/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Layout.cshtml index 04bd60c..c3beac0 100644 --- a/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Layout.cshtml +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/_Layout.cshtml @@ -11,6 +11,8 @@ + + @@ -27,6 +29,11 @@ 🗙 + + + + + From fa0942bc62bd84f19020cce4be1a72a21b7c1232 Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Sat, 1 Oct 2022 14:39:48 +0100 Subject: [PATCH 35/37] - reSharper guided code cleanup --- src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs index 51ac734..28a8ce9 100644 --- a/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs +++ b/src/JsonToJsonMapper.ScriptTester.Core/Pages/Index.razor.cs @@ -30,10 +30,10 @@ private async Task OnRun() _output = "Running..."; try { - var options = (!string.IsNullOrWhiteSpace(_assemblies) && !string.IsNullOrWhiteSpace(_namespaces)) ? ScriptOptions.Default.AddReferences(_assemblies).WithImports(_namespaces) : null; + var options = !string.IsNullOrWhiteSpace(_assemblies) && !string.IsNullOrWhiteSpace(_namespaces) ? ScriptOptions.Default.AddReferences(_assemblies).WithImports(_namespaces) : null; var src = await _code.GetValue(); var script = CSharpScript.Create(src, options, globalsType: typeof(ScriptHost)); - var host = new ScriptHost() {Args = _input}; + var host = new ScriptHost {Args = _input}; var result = await script.RunAsync(host); _output = result.ReturnValue; } From 515c252b139019798859dcc0509f4c0615e459ff Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Mon, 3 Oct 2022 08:56:58 +0100 Subject: [PATCH 36/37] - read json files directly -- no need to go through stream - construct file paths correctly instead of string munging --- test/JsonToJsonMapper.Tests/AutoMapperTest.cs | 39 +++---------------- 1 file changed, 6 insertions(+), 33 deletions(-) diff --git a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index d19208d..da7fb51 100644 --- a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -706,17 +706,8 @@ public void FunctionTest_TransformToUpperCase() public void FunctionTest_TransformToUpperCaseParent() { //Arrange - Certain input json with complex object - string mapping; - using (var r = new StreamReader(@"Jsons\ToUpper\Upper_Mapping.json")) - { - mapping = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - string inputJson; - using (var r = new StreamReader(@"Jsons\ToUpper\Transformation_Input.json")) - { - inputJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } + var mapping = File.ReadAllText(Path.Combine("Jsons","ToUpper","Upper_Mapping.json")); + var inputJson = File.ReadAllText(Path.Combine("Jsons","ToUpper","Transformation_Input.json")); var mapper = new AutoMapper(mapping); @@ -1052,17 +1043,8 @@ public void AutoMapperMapping_ReplaceValueFunction_ParamWhiteSpaceStringWithIgno public void OneToOneMappingTest() { //Arrange - string mappingJson; - using (var r = new StreamReader(@"Jsons\OneToOneMapping\OneToOneMappingRules.json")) - { - mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - string input; - using (var r = new StreamReader(@"Jsons\OneToOneMapping\Transformation_Input.json")) - { - input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } + var mappingJson = File.ReadAllText(Path.Combine("Jsons","OneToOneMapping","OneToOneMappingRules.json")); + var input = File.ReadAllText(Path.Combine("Jsons","OneToOneMapping","Transformation_Input.json"));; //Act var mapper = new AutoMapper(mappingJson); @@ -1076,17 +1058,8 @@ public void OneToOneMappingTest() public void RangeMappingTest() { //Arrange - string mappingJson; - using (var r = new StreamReader(@"Jsons\RangeMapping\RangeMappingRules.json")) - { - mappingJson = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } - - string input; - using (var r = new StreamReader(@"Jsons\RangeMapping\Transformation_Input.json")) - { - input = (JToken.ReadFrom(new JsonTextReader(r))).ToString(); - } + var mappingJson = File.ReadAllText(Path.Combine("Jsons","RangeMapping","RangeMappingRules.json"));; + var input = File.ReadAllText(Path.Combine("Jsons","RangeMapping","Transformation_Input.json"));; //Act var mapper = new AutoMapper(mappingJson); From cfe02ec1a50413408c432826f1272c8dd04ea9fa Mon Sep 17 00:00:00 2001 From: Trevor D'Arcy-Evans Date: Mon, 3 Oct 2022 09:30:13 +0100 Subject: [PATCH 37/37] - fixed broken unit tests on Linux --- test/JsonToJsonMapper.Tests/AutoMapperTest.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs index da7fb51..f6c3ae1 100644 --- a/test/JsonToJsonMapper.Tests/AutoMapperTest.cs +++ b/test/JsonToJsonMapper.Tests/AutoMapperTest.cs @@ -473,10 +473,10 @@ public void FunctionTest_ReplaceValueNode_Failure() var mapper = new AutoMapper(mapping); //Act - var response = mapper.TransformIntoJson(inputJson, true); + var response = mapper.TransformIntoJson(inputJson, true).Replace("\\n", string.Empty).Replace("\\r", string.Empty); //Assert - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"NA\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{ \\\"PreferenceTopic\\\": \\\"NA\\\"}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -490,10 +490,10 @@ public void FunctionTest_ReplaceValueNode_Success() var mapper = new AutoMapper(mapping); //Act - var response = mapper.TransformIntoJson(inputJson, true); + var response = mapper.TransformIntoJson(inputJson, true).Replace("\\n", string.Empty).Replace("\\r", string.Empty); //Assert - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"RV\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{ \\\"PreferenceTopic\\\": \\\"RV\\\"}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -507,10 +507,10 @@ public void FunctionTest_ReplaceValueNode_JsonPath() var mapper = new AutoMapper(mapping); //Act - var response = mapper.TransformIntoJson(inputJson, true); + var response = mapper.TransformIntoJson(inputJson, true).Replace("\\n", string.Empty).Replace("\\r", string.Empty); //Assert - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{ \\\"PreferenceTopic\\\": \\\"MOD\\\"}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -524,10 +524,10 @@ public void FunctionTest_ReplaceValueNode_JsonPath_EmptyCompareValue() var mapper = new AutoMapper(mapping); //Act - var response = mapper.TransformIntoJson(inputJson, true); + var response = mapper.TransformIntoJson(inputJson, true).Replace("\\n", string.Empty).Replace("\\r", string.Empty); //Assert - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{ \\\"PreferenceTopic\\\": \\\"MOD\\\"}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -541,10 +541,10 @@ public void FunctionTest_ReplaceValue_ReturnValue_Node() var mapper = new AutoMapper(mapping); //Act - var response = mapper.TransformIntoJson(inputJson, true); + var response = mapper.TransformIntoJson(inputJson, true).Replace("\\n", string.Empty).Replace("\\r", string.Empty); //Assert - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"MOD\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{ \\\"PreferenceTopic\\\": \\\"MOD\\\"}\"}"; Assert.AreEqual(response, expectedResponse); } @@ -558,10 +558,10 @@ public void FunctionTest_ReplaceValueNodeTwo() var mapper = new AutoMapper(mapping); //Act - var response = mapper.TransformIntoJson(inputJson, true); + var response = mapper.TransformIntoJson(inputJson, true).Replace("\\n", string.Empty).Replace("\\r", string.Empty); //Assert - const string expectedResponse = "{\"Output\":\"{\\r\\n \\\"PreferenceTopic\\\": \\\"\\\"\\r\\n}\"}"; + const string expectedResponse = "{\"Output\":\"{ \\\"PreferenceTopic\\\": \\\"\\\"}\"}"; Assert.AreEqual(response, expectedResponse); }