mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-01-11 14:20:29 +01:00
Loading mapping models with JsonMatcher is not working correctly
#294
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @cezarypiatekGC on GitHub (Sep 17, 2020).
Describe the bug
Loading mapping models with
JsonMatcherfor Body matcher from a file is not working correctly.Steps to reproduce:
Expected behavior:
This is how

requestBuilderlooks like before saving mapping to a fileThis is how
requestBuilderlooks like after loading from a fileThe expectation is that the JsonMatcher works in the same way when loaded from a file and when created from the code. Currently, the pattern is always set to null when loading from a file.
Other notes
This is probably caused by this line where every pattern is cast to string (non-string values will result with a
null)7abf56eafa/src/WireMock.Net/Serialization/MatcherMapper.cs (L39)@StefH commented on GitHub (Sep 19, 2020):
Hello @cezarypiatekGC . Thank you for your research.
@StefH commented on GitHub (Sep 19, 2020):
#505
@cezarypiatekGC : can you try preview version from MyGet :
WireMock.Net.1.2.18-ci-13750.nupkg?@cezarypiatekGC commented on GitHub (Sep 19, 2020):
I've tested this preview package and there's still a difference between JsonMatcher before saving to file and after loading which affects how the matcher works.
Before saving to file
After loading from a file
JObject vs JArray
@StefH commented on GitHub (Sep 19, 2020):
Can you try new version
WireMock.Net.1.2.18-ci-13754.nupkg(or higher)?@cezarypiatekGC commented on GitHub (Sep 19, 2020):
I've tried with WireMock.Net.1.2.18-ci-13754 but still, JsonMatcher has a different value and It's not working in the same way as it worked before saving to a file.
@StefH commented on GitHub (Sep 20, 2020):
Note that the
Valueproperty will not be the same, because in your initial code this is an anonymous object. And when the mapping is read from a .json file, this is a JObject. But the_valueAsJTokenis used for matching, and this should be the same.So can you make a full example (unit test) which demonstrates your issue?
@cezarypiatekGC commented on GitHub (Sep 21, 2020):
Ok, I will try to prepare a test or demo app that reproduces that problem.
@RiccoFerraro commented on GitHub (Sep 29, 2020):
Hi guys, I also believe I'm having this problem. I have static mappings (generated via recording with wiremock.net) I just upgraded to 1.3.0. I've debugged into JsonMatcher and it appears

.
_valueAsJTokenis always a jtoken for a null object, This is even when there is a request body and specifiedJsonMatcher. The result, is that no matter what I supply in the payload, matching doesn't appear to happen in any way on the request body.Not sure what I'm doing wrong here, but I feel like I've tried a million different things. Here is the mapping json for a particular request body:
UPDATE:

On Further inspection it seems to have to do with converting the
Patternsinto an array? ThePatternsobject looks just fine, but the stringPattern is null.@StefH commented on GitHub (Sep 30, 2020):
Hello @RiccoFerraro,
The 1.3.0 version does not have any preview fixed code for this issue, in order to test that you need MyGet version
WireMock.Net.1.2.18-ci-13754.nupkg.Or if you want to debug, you can use the PR : https://github.com/WireMock-Net/WireMock.Net/pull/505
And can you create a full working example please?
@RiccoFerraro commented on GitHub (Sep 30, 2020):
Hi @StefH Will do. I'll get back to you on if the issue is in that alpha build
@StefH commented on GitHub (Oct 7, 2020):
Hello @RiccoFerraro,did you have time yet to verify ?
@RiccoFerraro commented on GitHub (Oct 7, 2020):
@StefH Sorry I haven't had a chance yet. I will try to take a look at this sometime this week. I'll post here when I've tried it.
@RiccoFerraro commented on GitHub (Oct 12, 2020):
@StefH Sorry for the delay, still haven't had a chance to test this fix out yet. I've been absolutely slammed with work and will get to it as soon as I get a second.
On a related note, I did notice something else about partial match scores that seemed off. (probably requires a little redesign). For our team to continue using wiremock.net we need to trust that the Http VERB is ALWAYS respected. I've been noticing that, even when a post call is fired, Get matches are being favored (given higher scores) over POST calls (in this case because of the bug mentioned above, the POST call has a lower score because it is failing to match on the body matcher). This seems off. It should match on the highest score, for only a single verb type. I can't imagine a scenario where someone is okay with a get request/response being returned for a post call in an integration test??? That would be a broken integration test to me. Can we introduce a flag to strictly enforce just the verb?
@StefH commented on GitHub (Oct 12, 2020):
@RiccoFerraro Thanks about your remark about the Http VERB. I did create a new Issue for this, and I'll take a look how to fix this.
@StefH commented on GitHub (Oct 14, 2020):
@RiccoFerraro Investigating + solving that Http Method issue will take some more time.
Are you able to verify this issue ?
Else I will just create a new version because some code is also verified by https://github.com/WireMock-Net/WireMock.Net/issues/513
@RiccoFerraro commented on GitHub (Oct 14, 2020):
Hi @StefH, thanks for being so responsive. I'm sorry I don't have time to create test projects and try the all the different versions this week. What I can do is pull down the version in https://github.com/WireMock-Net/WireMock.Net/issues/513 and see if the problems I was having with post body matching are fixed. After that seems to work, I'll work on setting "ParitalMapping" to false to enforce strict mapping. Question, is it in an official nuget.org version? I can't use my-get outside of POC's.
@StefH commented on GitHub (Oct 14, 2020):
Hello @RiccoFerraro , I'll release a new version with this fix tonight and for now close this issue.
In case you have another problem please create a new issue.
@RiccoFerraro commented on GitHub (Dec 11, 2020):
Hi @StefH Great stuff on that fix! it appears to work as expected! Quick question, What is the expected behavior for record playback for repeated calls to the same endpoint with these settings in 1.3.7? What I'm apparently experiencing is wiremock doesn't seem to actually proxy the second call to the same endpoint, and instead is serving it's recorded response. This is a problem, because the expected behavior of the endpoint in question is that it changes between calls and i need to capture both responses. I have verified this by calling the endpoint directly in postman (with and without the wiremock server base url) and I get different response. Maybe this can be solved by reseting the server mid test?

@StefH commented on GitHub (Dec 12, 2020):
@RiccoFerraro
Did you already try "SaveMapping" = false and "SaveMappingToFile" = true ?