-
-
Notifications
You must be signed in to change notification settings - Fork 200
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 for DateTime Header causing null value in ResponseBuilder #123
Comments
This quickfix contains two things? JsonExactMatcher code, do you still need that? Can you make a PR with just the datetime header fix and also add some unittests? |
I will add the unit tests for the DateTime fix and create a separate PR. As to the ExactJsonMatcher - please can you tell me how to correctly use the JsonPathMatcher if we want to just record request/responses via proxy WireMock and then use them to mock? In that case the JsonPathMatcher is not matching the subsequent requests even when they are exact same Json, Does the recording need to be changed to some JsonPath syntax after recording? Thank you Stef. |
If using WireMock to proxy request, please take a look at this code here: Change this code SaveMapping = true,
SaveMappingToFile = true This will save each request and response in a file. I hope this helps? |
I think i didnt explain clearly. I am able to proxy and record. But when using the recorded mapping files for mocking, the jsonpathmapper never matches the requests - same requests that were recorded. Thats the reason i created the JsonExactMatcher. Is there something im doing wrong in using JsonPathMapper if i want it to match the complete json in the recorded request exactly?
… On Apr 11, 2018, at 12:00 PM, Stef Heyenrath ***@***.***> wrote:
If using WireMock to proxy request, please take a look at this code here:
https://github.com/WireMock-Net/WireMock.Net/blob/master/examples/WireMock.Net.Console.Proxy.Net452/Program.cs
Change this code
SaveMapping = true,
SaveMappingToFile = true
This will save each request and response in a file.
I hope this helps?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or mute the thread.
|
Ok I see. When using the saved request, sometimes it's needed to manually adjust the mapping a bit because the matching is too strict because not only the body is matched but also headers, query and others. Make sure to enable partial mapping and then do a http get request to /__admin/requests to see the matching details from the request you did send. Look for matchings where the match is 0. |
Right. Still keeping PartialMatching to FALSE, i can match with JsonExactMatcher but not with JsonPathMatcher. Not sure why - couldnt get JsonPathMatcher to work. Therefore wrote the simple JsonExactMatcher. I can send you the mapping file as an example repro if uou want - but JsonPathMatcher returns score 0.
… On Apr 11, 2018, at 12:46 PM, Stef Heyenrath ***@***.***> wrote:
Ok I see.
When using the saved request, sometimes it's needed to manually adjust the mapping a bit because the matching is too strict because not only the body is matched but also headers, query and others.
Make sure to enable partial mapping and then do a http get request to /__admin/requests to see the matching details from the request you did send. Look for matchings where the match is 0.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or mute the thread.
|
Please create a sample project, so I can analyze. |
From now on it's also possible to use a simple Wildcard (string-matcher) for JSON messages, will this help you in this case? |
Hi Stef, apologies for the late response (have been slammed). Yes that
would be a great addition indeed. What I discovered was that while *proxy
recording*, the body (or bodyasjson or bodyasbytes) in the *request* is not
recorded. And hence when we try to match with a specific body difference it
is not available in the mapping.
I can understand why this is the case, as the library wouldnt know what
matcher to use (esp for bodyasbytes).
While I added a matcher that is useful for our work and put it in the
library, that is not an extensible approach.
Instead could we have a mechanism where a matcher is created outside the
library and provided to the FluentServer as part of the settings? Just like
for the logger.
There can be a CustomBodyMatcher, CustomBodyAsJsonMatcher and
CustomBodyAsBytes matcher fields in the FluentServerSettings, which are
then used during recording. Similarly they would have to be passed in also
for standard mocking (ie non-proxy server).
Thoughts?
Aroon
…On Fri, May 18, 2018 at 12:00 AM, Stef Heyenrath ***@***.***> wrote:
From now on it's also possible to use a simple Wildcard (string-matcher)
for JSON messages, will this help you in this case?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<#123 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AkdXDh2zD0N8aHtmet08lO2kwhqdQh3eks5tznGbgaJpZM4TPEF7>
.
|
Hello @rangerranger, 1] SaveMapping = true,
SaveMappingToFile = true, The request is recorded (and saved in the "Body": {
"Matcher": {
"Name": "ExactMatcher",
"Pattern": "{\n\t\"test\": 42\n}"
}
} However, the 2] |
Hi Stef,
For Point 1] - I believe that is currently happening only for "Body" - not
bodyasjson or bodyasbytes. At least in 1.0.3.15. Not sure if you recently
changed.
See in Server\FluentServer.Admin.cs:
if (requestMessage.Body != null)
{
request.WithBody(new ExactMatcher(requestMessage.Body));
}
The other conditional blocks are empty for BodyAsJson and BodyAsBytes. So
my recordings with json content were not recorded body patterns.
For point 2]:
The general problem is that sometimes the body has unique properties which
one may want to *selectively* ignore, for the match.
In the case of text (body or bodyasjson) this could be somewhat solved by
existing Wildcard or Regex matcher (although the regex matcher may have
some trouble due to the json formatting characters which are also regex
special characters).
And likely impossible for bodyasbytes without the ability to interpret
those bytes. The client invoking the FluentServer will have the ability to
understand the bytes and could provide a custom matcher.
This was my thinking.
Aroon
…On Sun, May 20, 2018 at 11:27 PM, Stef Heyenrath ***@***.***> wrote:
Hello @rangerranger <https://github.com/rangerranger>,
1]
When running in proxy mode with these settings:
SaveMapping = true,SaveMappingToFile = true,
The request is recorded (and saved in the __admin\mappings folder). And
the original body (when doing a request which has a body) is also recorded
like:
"Body": {
"Matcher": {
"Name": "ExactMatcher",
"Pattern": "{\n\t\"test\": 42\n}"
}
}
However, the ExactMatcher is always used, you have to manually adjust it
to the mapper you would like to use.
2]
A CustomBodyMatcher, CustomBodyAsJsonMatcher and CustomBodyAsBytes can be
added to settings, but do you still need these when you read point 1 above?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#123 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AkdXDpVn2Q0rVan-_0BQe7o7-9BISd-Gks5t0l5QgaJpZM4TPEF7>
.
|
Hello @rangerranger : Is my post above clear ? |
Hi Stef, does the recording of json in body work when you set content-type header as application/json? I believe it puts the content in bodyAsJson member of the request object and the body is empty in recorded mapping.
With regards to custom matchers and your suggestion of using func: im not sure how it would work for recorded mappings?
Aroon
… On May 28, 2018, at 6:12 AM, Stef Heyenrath ***@***.***> wrote:
Hello @rangerranger : Is my post above clear ?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.
|
a] The recording of any body should work, you don't need to use that content-type. b] Correct. You cannot use that directly. There is no possible way yet to convert a recorded mapping (json) into the C# code which defines that mapping. I can investigate if this is easy to build... |
My testing shows that if the application being mocked(recorded) sets the application/json header then the body is not recorded. If i remember that was because the body content is placed in BodyAsJson and that segment of wiremock code is empty. I could ld be wrong, can test again.
… On May 28, 2018, at 9:38 AM, Stef Heyenrath ***@***.***> wrote:
a] The recording of any body should work, you don't need to use that content-type.
b] Correct. You cannot use that directly. There is no possible way yet to convert a recorded mapping (json) into the C# code which defines that mapping. I can investigate if this is easy to build...
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.
|
A quick question: you are using a POST or PUT request ? |
Hi Stef - POST.
… On May 28, 2018, at 9:59 AM, Stef Heyenrath ***@***.***> wrote:
A quick question: you are using a POST or PUT request ?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.
|
Latest version support a new matcher : See also #154 I'm closing this issue now, please open a new one with details if you still have issues. Or start a chat at https://gitter.im/wiremock_dotnet/Lobby |
Having the below header in a static mapping file as part of the response results in a NULL value being returned to ResponseBuilder in InitResponseBuilder, since it either expects a string or json - but this header value is being read in as a DateTime object.
"Rate-Limit-Reset": "2018-04-09T20:39:46.956Z",
I added a quickfix like so, please let me know if that looks ok?
In src/WireMock.Net/Server/FluentMockServer.Admin.cs:
RangerRangerOrg@747524c#diff-8633a9484e8c211d1cc3fc5d0c12f4de
The text was updated successfully, but these errors were encountered: