Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix code generator for request and response body #30

Merged
merged 1 commit into from
Jan 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions src/WireMockInspector/CodeGenerators/CollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Collections.Generic;

namespace WireMockInspector.CodeGenerators;

internal static class CollectionExtensions
{
public static IDictionary<string, T>? OrNullWhenEmpty<T>(this IDictionary<string, T>? @this)
{
if (@this == null || @this.Count == 0)
{
return null;
}

return @this;
}
}
122 changes: 81 additions & 41 deletions src/WireMockInspector/CodeGenerators/MappingCodeGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
using System.IO;
using System;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Web;
using Fluid;
using Fluid.Values;
using Newtonsoft.Json;
Expand Down Expand Up @@ -54,6 +57,24 @@ private static string ReadEmbeddedResource(string resourceName)
return reader.ReadToEnd();
}
public const string DefaultTemplateName = "(default)";


private static JToken? TryParseJson(string? payload)
{
try
{
return payload switch
{
{ } => JToken.Parse(payload),
_ => null
};
}
catch (Exception e)
{
return null;
}
}

public static string GenerateCSharpCode(LogRequestModel logRequest, LogResponseModel logResponse, MappingCodeGeneratorConfigViewModel config)
{
var options = new TemplateOptions();
Expand Down Expand Up @@ -95,47 +116,48 @@ public static string GenerateCSharpCode(LogRequestModel logRequest, LogResponseM
var reader = new JsonDataSourceReader();

var data = reader.Read(JsonConvert.SerializeObject(
new
new
{
request = new
{
request = new
{
ClientIP = logRequest.ClientIP,
DateTime = logRequest.DateTime,
Path = logRequest.Path,
AbsolutePath = logRequest.AbsolutePath,
Url = logRequest.Url,
AbsoluteUrl = logRequest.AbsoluteUrl,
ProxyUrl = logRequest.ProxyUrl,
Query = logRequest.Query,
Method = logRequest.Method,
Headers = logRequest.Headers,
Cookies = logRequest.Cookies,
Body = logRequest.Body,
BodyAsJson = logRequest.BodyAsJson?.ToString(),
BodyAsBytes = logRequest.BodyAsBytes,
BodyEncoding = logRequest.BodyEncoding,
DetectedBodyType = logRequest.DetectedBodyType,
DetectedBodyTypeFromContentType = logRequest.DetectedBodyTypeFromContentType
},
response = new
{
StatusCode = logResponse.StatusCode,
Headers = logResponse.Headers,
BodyDestination = logResponse.BodyDestination,
Body = logResponse.Body,
BodyAsJson = logResponse.BodyAsJson?.ToString(),
BodyAsBytes = logResponse.BodyAsBytes,
BodyAsFile = logResponse.BodyAsFile,
BodyAsFileIsCached = logResponse.BodyAsFileIsCached,
BodyOriginal = logResponse.BodyOriginal,
BodyEncoding = logResponse.BodyEncoding,
DetectedBodyType = logResponse.DetectedBodyType,
DetectedBodyTypeFromContentType = logResponse.DetectedBodyTypeFromContentType,
FaultType = logResponse.FaultType,
FaultPercentage = logResponse.FaultPercentage
},
config
}));
ClientIP = logRequest.ClientIP,
DateTime = logRequest.DateTime,
Path = logRequest.Path,
FullPath = GetFullPath(logRequest),
AbsolutePath = logRequest.AbsolutePath,
Url = logRequest.Url,
AbsoluteUrl = logRequest.AbsoluteUrl,
ProxyUrl = logRequest.ProxyUrl,
Query = logRequest.Query.OrNullWhenEmpty(),
Method = logRequest.Method,
Headers = logRequest.Headers.OrNullWhenEmpty(),
Cookies = logRequest.Cookies.OrNullWhenEmpty(),
Body = logRequest.Body,
BodyAsJson = (TryParseJson(logRequest.Body) ?? logRequest.BodyAsJson)?.ToString(),
BodyAsBytes = logRequest.BodyAsBytes,
BodyEncoding = logRequest.BodyEncoding,
DetectedBodyType = logRequest.DetectedBodyType,
DetectedBodyTypeFromContentType = logRequest.DetectedBodyTypeFromContentType
},
response = new
{
StatusCode = logResponse.StatusCode,
Headers = logResponse.Headers.OrNullWhenEmpty(),
BodyDestination = logResponse.BodyDestination,
Body = logResponse.Body,
BodyAsJson = (TryParseJson(logResponse.Body) ?? logResponse.BodyAsJson)?.ToString(),
BodyAsBytes = logResponse.BodyAsBytes,
BodyAsFile = logResponse.BodyAsFile,
BodyAsFileIsCached = logResponse.BodyAsFileIsCached,
BodyOriginal = logResponse.BodyOriginal,
BodyEncoding = logResponse.BodyEncoding,
DetectedBodyType = logResponse.DetectedBodyType,
DetectedBodyTypeFromContentType = logResponse.DetectedBodyTypeFromContentType,
FaultType = logResponse.FaultType,
FaultPercentage = logResponse.FaultPercentage
},
config
}));
var result = ftemplate.Render(new TemplateContext(new
{
data = data
Expand All @@ -146,4 +168,22 @@ public static string GenerateCSharpCode(LogRequestModel logRequest, LogResponseM
return error;

}

private static string GetFullPath(LogRequestModel logRequest)
{
var query = HttpUtility.ParseQueryString("");
if (logRequest.Query is { } requestQuery)
{
foreach (var p in requestQuery)
{
query[p.Key] = p.Value.ToString();
}
}
var fullQuery = query.ToString();
if (string.IsNullOrWhiteSpace(fullQuery) == false)
{
return $"{logRequest.Path}?{fullQuery}";
}
return logRequest.Path;
}
}
14 changes: 7 additions & 7 deletions src/WireMockInspector/CodeGenerators/default_template.liquid
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ mappingBuilder
{%- endfor -%}
{%- endif -%}
{%- if config.IncludeBody %}
{%- if request.Body %}
{%- assign body = request.Body | escape_string_for_csharp %}
.WithBody({{ body }})
{%- elsif request.BodyAsJson %}
{%- if request.BodyAsJson %}
.WithBodyAsJson({{ request.BodyAsJson | format_as_anonymous_object: 2 }})
{%- elsif request.Body %}
{%- assign body = request.Body | escape_string_for_csharp %}
.WithBody({{ body }})
{%- endif -%}
{%- endif -%}
)
Expand All @@ -66,11 +66,11 @@ mappingBuilder
{%- endfor -%}
{%- endif -%}
{%- if config.IncludeBodyResponse %}
{%- if response.Body %}
{%- if response.BodyAsJson %}
.WithBodyAsJson({{ response.BodyAsJson | format_as_anonymous_object: 2 }})
{%- elsif response.Body %}
{%- assign body = response.Body | escape_string_for_csharp %}
.WithBody({{ body }})
{%- elsif response.BodyAsJson %}
.WithBodyAsJson({{ response.BodyAsJson | format_as_anonymous_object: 2 }})
{%- endif -%}
{%- endif %}
);
Loading