mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-04-18 14:39:45 +02:00
Add a new stub mapping
This commit is contained in:
@@ -17,14 +17,128 @@ namespace WireMock.Server
|
||||
/// </summary>
|
||||
public partial class FluentMockServer
|
||||
{
|
||||
private readonly JsonSerializerSettings _settings = new JsonSerializerSettings
|
||||
{
|
||||
Formatting = Formatting.None,
|
||||
NullValueHandling = NullValueHandling.Ignore
|
||||
};
|
||||
|
||||
private void InitAdmin()
|
||||
{
|
||||
Given(Request.Create().WithUrl("/__admin/mappings").UsingGet()).RespondWith(new DynamicResponseProvider(MappingsGet));
|
||||
Given(Request.Create().WithUrl("/__admin/mappings").UsingPost()).RespondWith(new DynamicResponseProvider(MappingsPost));
|
||||
|
||||
Given(Request.Create().WithUrl("/__admin/requests").UsingGet()).RespondWith(new DynamicResponseProvider(RequestsGet));
|
||||
}
|
||||
|
||||
private ResponseMessage RequestsGet()
|
||||
private ResponseMessage MappingsGet(RequestMessage requestMessage)
|
||||
{
|
||||
var result = new List<MappingModel>();
|
||||
foreach (var mapping in Mappings.Where(m => !(m.Provider is DynamicResponseProvider)))
|
||||
{
|
||||
var model = ToMappingModel(mapping);
|
||||
result.Add(model);
|
||||
}
|
||||
|
||||
return ToJson(result);
|
||||
}
|
||||
|
||||
private ResponseMessage MappingsPost(RequestMessage requestMessage)
|
||||
{
|
||||
var mappingModel = JsonConvert.DeserializeObject<MappingModel>(requestMessage.Body);
|
||||
|
||||
if (mappingModel.Request == null)
|
||||
return new ResponseMessage { StatusCode = 400, Body = "Request missing" };
|
||||
|
||||
if (mappingModel.Response == null)
|
||||
return new ResponseMessage { StatusCode = 400, Body = "Response missing" };
|
||||
|
||||
var requestBuilder = InitRequestBuilder(mappingModel);
|
||||
var responseBuilder = InitResponseBuilder(mappingModel);
|
||||
|
||||
IRespondWithAProviderGuid respondProvider = Given(requestBuilder);
|
||||
|
||||
if (mappingModel.Guid != null && mappingModel.Guid != Guid.Empty)
|
||||
respondProvider = respondProvider.WithGuid(mappingModel.Guid.Value);
|
||||
|
||||
respondProvider.RespondWith(responseBuilder);
|
||||
|
||||
return new ResponseMessage { Body = "Mapping added" };
|
||||
}
|
||||
|
||||
private IRequestBuilder InitRequestBuilder(MappingModel mappingModel)
|
||||
{
|
||||
IRequestBuilder requestBuilder = Request.Create();
|
||||
string url = mappingModel.Request.Url as string;
|
||||
if (url != null)
|
||||
requestBuilder = requestBuilder.WithUrl(url);
|
||||
else
|
||||
requestBuilder = requestBuilder.WithUrl("/*");
|
||||
//UrlModel urlModel = mappingModel.Request.Url as UrlModel;
|
||||
//if (urlModel?.Matchers != null)
|
||||
// builder = builder.WithUrl(urlModel.Matchers.Select(Map).ToArray());
|
||||
|
||||
if (mappingModel.Request.Methods != null)
|
||||
requestBuilder = requestBuilder.UsingVerb(mappingModel.Request.Methods);
|
||||
else
|
||||
requestBuilder = requestBuilder.UsingAnyVerb();
|
||||
|
||||
if (mappingModel.Request.Headers != null)
|
||||
{
|
||||
foreach (var headerModel in mappingModel.Request.Headers.Where(h => h.Matchers != null))
|
||||
{
|
||||
requestBuilder = requestBuilder.WithHeader(headerModel.Name, headerModel.Matchers.Select(Map).ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
if (mappingModel.Request.Cookies != null)
|
||||
{
|
||||
foreach (var cookieModel in mappingModel.Request.Cookies.Where(c => c.Matchers != null))
|
||||
{
|
||||
requestBuilder = requestBuilder.WithCookie(cookieModel.Name, cookieModel.Matchers.Select(Map).ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
if (mappingModel.Request.Params != null)
|
||||
{
|
||||
foreach (var paramModel in mappingModel.Request.Params.Where(p => p.Values != null))
|
||||
{
|
||||
requestBuilder = requestBuilder.WithParam(paramModel.Name, paramModel.Values.ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
if (mappingModel.Request.Body?.Matcher != null)
|
||||
{
|
||||
var bodyMatcher = Map(mappingModel.Request.Body.Matcher);
|
||||
requestBuilder = requestBuilder.WithBody(bodyMatcher);
|
||||
}
|
||||
return requestBuilder;
|
||||
}
|
||||
|
||||
|
||||
private IResponseBuilder InitResponseBuilder(MappingModel mappingModel)
|
||||
{
|
||||
IResponseBuilder responseBuilder = Response.Create();
|
||||
|
||||
if (mappingModel.Response.StatusCode.HasValue)
|
||||
responseBuilder = responseBuilder.WithStatusCode(mappingModel.Response.StatusCode.Value);
|
||||
|
||||
if (mappingModel.Response.Headers != null)
|
||||
responseBuilder = responseBuilder.WithHeaders(mappingModel.Response.Headers);
|
||||
|
||||
if (mappingModel.Response.Body != null)
|
||||
responseBuilder = responseBuilder.WithBody(mappingModel.Response.Body);
|
||||
else if (mappingModel.Response.BodyAsJson != null)
|
||||
responseBuilder = responseBuilder.WithBodyAsJson(mappingModel.Response.BodyAsJson);
|
||||
else if (mappingModel.Response.BodyAsBase64 != null)
|
||||
responseBuilder = responseBuilder.WithBodyAsBase64(mappingModel.Response.BodyAsBase64);
|
||||
|
||||
if (mappingModel.Response.UseTransformer)
|
||||
responseBuilder = responseBuilder.WithTransformer();
|
||||
return responseBuilder;
|
||||
}
|
||||
|
||||
private ResponseMessage RequestsGet(RequestMessage requestMessage)
|
||||
{
|
||||
var result = new List<LogEntryModel>();
|
||||
foreach (var logEntry in LogEntries.Where(r => !r.RequestMessage.Path.StartsWith("/__admin/")))
|
||||
@@ -58,68 +172,61 @@ namespace WireMock.Server
|
||||
return ToJson(result);
|
||||
}
|
||||
|
||||
private ResponseMessage MappingsGet()
|
||||
private MappingModel ToMappingModel(Mapping mapping)
|
||||
{
|
||||
var result = new List<MappingModel>();
|
||||
foreach (var mapping in Mappings.Where(m => !(m.Provider is DynamicResponseProvider)))
|
||||
var request = (Request)mapping.RequestMatcher;
|
||||
var response = (Response)mapping.Provider;
|
||||
|
||||
var urlMatchers = request.GetRequestMessageMatchers<RequestMessageUrlMatcher>();
|
||||
var headerMatchers = request.GetRequestMessageMatchers<RequestMessageHeaderMatcher>();
|
||||
var cookieMatchers = request.GetRequestMessageMatchers<RequestMessageCookieMatcher>();
|
||||
var paramsMatchers = request.GetRequestMessageMatchers<RequestMessageParamMatcher>();
|
||||
var bodyMatcher = request.GetRequestMessageMatcher<RequestMessageBodyMatcher>();
|
||||
var methodMatcher = request.GetRequestMessageMatcher<RequestMessageMethodMatcher>();
|
||||
|
||||
return new MappingModel
|
||||
{
|
||||
var request = (Request) mapping.RequestMatcher;
|
||||
var urlMatchers = request.GetRequestMessageMatchers<RequestMessageUrlMatcher>();
|
||||
var headerMatchers = request.GetRequestMessageMatchers<RequestMessageHeaderMatcher>();
|
||||
var cookieMatchers = request.GetRequestMessageMatchers<RequestMessageCookieMatcher>();
|
||||
var paramsMatchers = request.GetRequestMessageMatchers<RequestMessageParamMatcher>();
|
||||
var bodyMatcher = request.GetRequestMessageMatcher<RequestMessageBodyMatcher>();
|
||||
var methodMatcher = request.GetRequestMessageMatcher<RequestMessageMethodMatcher>();
|
||||
|
||||
var response = (Response) mapping.Provider;
|
||||
|
||||
var model = new MappingModel
|
||||
Guid = mapping.Guid,
|
||||
Request = new RequestModel
|
||||
{
|
||||
Guid = Guid.NewGuid(),
|
||||
Request = new RequestModel
|
||||
Url = new UrlModel
|
||||
{
|
||||
Url = new UrlModel
|
||||
{
|
||||
Matchers = urlMatchers != null ? Map(urlMatchers.Where(m => m.Matchers != null).SelectMany(m => m.Matchers)) : null
|
||||
},
|
||||
Methods = methodMatcher != null ? methodMatcher.Methods : new [] { "any" },
|
||||
Headers = headerMatchers?.Select(hm => new HeaderModel
|
||||
{
|
||||
Name = hm.Name,
|
||||
Matchers = Map(hm.Matchers)
|
||||
}).ToList(),
|
||||
Cookies = cookieMatchers?.Select(hm => new CookieModel
|
||||
{
|
||||
Name = hm.Name,
|
||||
Matchers = Map(hm.Matchers)
|
||||
}).ToList(),
|
||||
Params = paramsMatchers?.Select(hm => new ParamModel
|
||||
{
|
||||
Name = hm.Key,
|
||||
Values = hm.Values?.ToList()
|
||||
}).ToList(),
|
||||
Body = new BodyModel
|
||||
{
|
||||
Matcher = bodyMatcher != null ? Map(bodyMatcher.Matcher) : null
|
||||
}
|
||||
Matchers = urlMatchers != null ? Map(urlMatchers.Where(m => m.Matchers != null).SelectMany(m => m.Matchers)) : null
|
||||
},
|
||||
Response = new ResponseModel
|
||||
Methods = methodMatcher != null ? methodMatcher.Methods : new[] { "any" },
|
||||
Headers = headerMatchers?.Select(hm => new HeaderModel
|
||||
{
|
||||
StatusCode = response.ResponseMessage.StatusCode,
|
||||
Headers = response.ResponseMessage.Headers,
|
||||
Body = response.ResponseMessage.Body
|
||||
Name = hm.Name,
|
||||
Matchers = Map(hm.Matchers)
|
||||
}).ToList(),
|
||||
Cookies = cookieMatchers?.Select(hm => new CookieModel
|
||||
{
|
||||
Name = hm.Name,
|
||||
Matchers = Map(hm.Matchers)
|
||||
}).ToList(),
|
||||
Params = paramsMatchers?.Select(hm => new ParamModel
|
||||
{
|
||||
Name = hm.Key,
|
||||
Values = hm.Values?.ToList()
|
||||
}).ToList(),
|
||||
Body = new BodyModel
|
||||
{
|
||||
Matcher = bodyMatcher != null ? Map(bodyMatcher.Matcher) : null
|
||||
}
|
||||
};
|
||||
|
||||
result.Add(model);
|
||||
}
|
||||
|
||||
return ToJson(result);
|
||||
},
|
||||
Response = new ResponseModel
|
||||
{
|
||||
StatusCode = response.ResponseMessage.StatusCode,
|
||||
Headers = response.ResponseMessage.Headers,
|
||||
Body = response.ResponseMessage.Body,
|
||||
UseTransformer = response.UseTransformer
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private IList<MatcherModel> Map([CanBeNull] IEnumerable<IMatcher> matchers)
|
||||
private MatcherModel[] Map([CanBeNull] IEnumerable<IMatcher> matchers)
|
||||
{
|
||||
return matchers?.Select(Map).Where(x => x != null).ToList();
|
||||
return matchers?.Select(Map).Where(x => x != null).ToArray();
|
||||
}
|
||||
|
||||
private MatcherModel Map([CanBeNull] IMatcher matcher)
|
||||
@@ -134,11 +241,32 @@ namespace WireMock.Server
|
||||
};
|
||||
}
|
||||
|
||||
private IMatcher Map([CanBeNull] MatcherModel matcher)
|
||||
{
|
||||
if (matcher == null)
|
||||
return null;
|
||||
|
||||
switch (matcher.Name)
|
||||
{
|
||||
case "RegExMatcher":
|
||||
return new RegexMatcher(matcher.Pattern);
|
||||
|
||||
case "JsonPathMatcher":
|
||||
return new JsonPathMatcher(matcher.Pattern);
|
||||
|
||||
case "XPathMatcher":
|
||||
return new XPathMatcher(matcher.Pattern);
|
||||
|
||||
default:
|
||||
return new WildcardMatcher(matcher.Pattern, matcher.IgnoreCase == true);
|
||||
}
|
||||
}
|
||||
|
||||
private ResponseMessage ToJson<T>(T result)
|
||||
{
|
||||
return new ResponseMessage
|
||||
{
|
||||
Body = JsonConvert.SerializeObject(result, Formatting.Indented),
|
||||
Body = JsonConvert.SerializeObject(result, _settings),
|
||||
StatusCode = 200,
|
||||
Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user