Different JSON array body matches
stevenferrer opened this issue · comments
First, thank you for making this amazing project!
I've noticed that when I try to match a request body that is an array, the requests are still matching even though the mock and request body are clearly different.
baseURL := "http://foo.com"
gock.New(baseURL).
Post("/bar").
MatchType("json").
BodyString(`[{"foo":"bar"},{"fizz":"buzz"}]`).
Reply(http.StatusOK).
JSON(map[string]interface{})
req, _ := http.NewRequest(http.MethodPost, baseURL+"/bar", bytes.NewBuffer([]byte(`[{"foo":"baz"}]`)))
res, err := http.DefaultClient.Do(req)
On the code, before getting into the lines where the json.Unmarshal
is called, I've noticed that the matcher already returns true in the regexp.MatchString
part.
I've tried to come-up with a fix, but it seems that it's gonna be difficult without knowing whether the request body contains regular expressions or just a normal JSON.
I just noticed the same and was confused for a second.
My input:
Request Body
{"data": {"a": "b"}}
Expected Body
{"a": "b"}
The issue happens here:
Lines 188 to 198 in 48ac21d
bodyStr
has value of {"data": {"a": "b"}}
matchStr
has a value of {"a": "b"}
This sadly makes the request match, and thus makes some of my tests pass although they should fail with an unmatched request error :(
I would suggest to not match the body by regex, at all, unless the user really wants to (maybe we can create a method for that, like MatchBodyRegex
or similar.
Having a MatchBody
method that sneakly does regex matching is error prone and can cause huge issues, especially in such an important mocking library.