WireMock-Net / WireMock.Net

WireMock.Net is a flexible product for stubbing and mocking web HTTP responses using advanced request matching and response templating. Based on the functionality from http://WireMock.org, but extended with more functionality.
Apache License 2.0
1.35k stars 197 forks source link

Regex support for JsonMatcher #1088

Closed pluma9 closed 2 months ago

pluma9 commented 3 months ago

Is your feature request related to a problem? Please describe. I'd like to use regex in JsonMatcher (just like in JsonPartialMatcher)

Describe the solution you'd like Add the option to turn on regex. Similar to: https://github.com/WireMock-Net/WireMock.Net/wiki/Request-Matching-JsonPartialMatcher#use-regex

Describe alternatives you've considered No alternative solution I can think of

Is your feature request supported by WireMock (java version)? Please provide details. I am not sure. Please let know if this is important. I can do some more research.

Additional context No.

StefH commented 3 months ago

@pluma9 I'll see if this can be added easily.

Is there a reason you cannot use the JsonPartialMatcher ?

pluma9 commented 2 months ago

Thanks. That is because I want to assert that the request contains exactly certain fields. Adding more fields may make the real API server returns an error.

StefH commented 2 months ago

I've added this logic, can you please test preview version WireMock.Net.1.5.51-ci-18462?

See https://github.com/WireMock-Net/WireMock.Net/wiki/MyGet-preview-versions

pluma9 commented 2 months ago

Thanks very much. It works great in terms of regex.

There seems to be a regression. Given JsonMatcher:

{
  "Contact": {
    "Phone": "1234",
    "Street": "King Street"
  },
  "Info": {
    "Occupation": "Developer"
  }
}

In previous versions, it does not match the following body:

{
  "Contact": {
    "Phone": "1234",
    "Street": "King Street"
  },
  "Info": {
    "Occupation": "Developer"
  },
  "OtherInfo": {
    "NickName": "Jimmy"
  }
}

However, in WireMock.Net.1.5.51-ci-18462, it does

StefH commented 2 months ago

I see. Thanks for this observation.

I need to adjust the logic to match exact. I'll check tomorrow.

StefH commented 2 months ago

@pluma9 It's fixed.

Can you please test preview WireMock.1.5.51-ci-18469 ?

pluma9 commented 2 months ago

The previous case works great now.

However, there is one more case. Given the matcher above, the following body does not match (expected):

{
  "Contact": {
    "Phone": "1234",
    "Street": "King Street"
  },
  "Info": {
    "Occupation": "Dancer"
  }
}

The following body oddly matches:

{
  "Contact": {
    "Phone": "1234",
    "Street": "King Street"
  },
  "Info": {
    "Occupation": "Developer2"
  }
}
StefH commented 2 months ago

All strings should be defined as valid regular expressions.

So in this case like this:

^Developer2$

pluma9 commented 2 months ago

Ah, I see. Then things work great now.

I really appreciate your support.

StefH commented 2 months ago

I'll merge the PR and create a new normal NuGet soon.