I’ve got code to verify webhook signatures that’s similar to the code examples in this Dashbit article. In the dev environment, it works fine - the request body is read into
conn.assigns[:raw_body]. In the test environment, however, the custom
body_reader isn’t being called; the request body is not read into assigns.
Has anyone seen something like this or have some ideas? I’ve found similar posts related to
Plug.Parsers and custom
body_reader, but nothing specifically about testing differences. I’ve tried a number of things with
Plug.Conn in the test environment, to no avail so far. Thanks!
Are you sure whatever you do in your tests does actually hit
Plug.Parsers? Can you show your setup?
In dev, an
IO.puts from inside the function called by
body_reader gets written to stdout. In test, it does not, and
conn.assigns is an empty map instead of containing the request body, as it does in dev. Since this is a proprietary app, I’ll see if I can replicate the problem in a minimal Phoenix app and share that code here.
Make sure you pass in the request body as a string inside your tests. If you pass in a map, Plug takes some shortcuts that bypass Plug.Parsers
Thank you @voltone and @LostKobrakai for your responses. I didn’t realize
Plug.Parsers was being bypassed by design. Got it working by
posting the body as a JSON encoded string.
I just hit the same wall, and it was a surprise, mainly because this is not something explicit as most things from Plug/Phoenix.
Where is the best place to document that? Adding a note to
Plug.Parser enough or it’s a broader thing that should be highlighted elsewhere?